请帮助我理解方案:没有争议?

时间:2012-03-28 23:29:06

标签: syntax scheme arguments

第一次stackoverflow用户,但偶尔潜伏,希望你们可以帮助我。

因此,我的任务的第一部分是将所有“前导零”放在列表中。

例如:(0 0 0 0 0 1 0 1 0 1) - > (1 0 1 0 1)

为此,我想使用IF语句检查第一个元素是否为0,并递归调用列表的其余部分,直到没有更多前导零。因为我基本上不知道如何在Scheme中编程,通过搜索互联网,我想出了你在下面看到的内容。然而,当我运行它时,DrRacket告诉我没有参数 - 我认为这或者是语法错误......或者更可能的是,我不知道我在做什么。所以,如果你能帮助我,我真的很感激!

    >(define zz
    >  (lambda (n)
    >    (if (= (car (n)) 0)
    >        (zz (cdr (n)))
    >        ((n)))))
    >
    >(remove '(0 0 0 0 1 0 1 0))

我在DrRacket中得到的错误是:

“程序申请:预期程序,给定:(0 0 0 0 1 0 1 0)(无参数)”

再次,非常感谢! (P.S.抱歉,如果格式有点奇怪......)

修改

好的,改变一些东西,我现在得到一个“期望类型作为第一个参数,给定:(0 0 0 0 0 1 0 1 0);其他参数是:0”错误标记在我的if语句。

    >(define zz
    >  (lambda n
    >    (if (= (car n) 0)   <----- here
    >        (zz(cdr n))
    >        (n))))

编辑2

    >(define zz
    >  (lambda (n)
    >    (if (= (car n) 0)
    >        (zz (cdr n))
    >        n)))

它有效,非常感谢!

1 个答案:

答案 0 :(得分:2)

(num)不正确 - 您尝试将42或其他任何内容作为命令调用。 (此外,您的if语法已关闭;您可能希望阅读更多代码以更好地了解语法。

这应该编译:

(define remove
  (lambda (num)
    (if (= (car num) 0)
      (remove (cdr num))
      num)))

Lisp中的括号用于调用函数,除非在引号中使用。

<小时/> 好的,OP询问了Scheme的语法的一般概述。

  • a - 一个符号,由评估者查找并替换其值。某些符号(例如42)会自行评估。

  • 'a - 此“引用”该符号并将其转换为(quote a)quote阻止对其参数进行求值 - 而是返回值a字符串“a”,查找aa本身的结果。这也适用于列表('(1 2 3)

  • (if <expr> <true-value> <false-value>) - 评估<expr>,查看其值是否真实,并执行相应的值。

  • (cond (<expr> <true-value>) ... (else <false-value>)) - 这会运行它的参数,并评估它的car以查看它是否为真。如果是,则返回评估cdr的值。否则,它会跳到下一个值。

  • (define <name> <expr>) - 将第二个参数的值计算为第一个参数的名称。

  • (lambda <arg-list> <body>) - 创建一个过程,该过程是将传入的参数绑定到第二个参数中的名称并计算第三个参数的结果。

  • (<func> <arg1> <arg2> ... <argn>) - 如果求值程序发现上述模式都不匹配,则它会将列表的car作为函数调用,并使用{{1}中的参数}。