2012-03-28 32 views
2

首次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)(无参数)”

再次感谢很多! (如果格式有点奇怪PS对不起...)

编辑

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

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

EDIT 2

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

它的工作原理,非常感谢你!

回答

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”,不是查询结果a,a本身。这也适用于列表('(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作为函数使用,参数为cdr

+0

@ Scheme.Is.Strange对不起 - 我打给'='的电话已关闭。检查更新的示例。 – new123456 2012-03-28 23:36:53

+0

是的,你的代码是完美的,你介意解释scheme语法是如何工作的吗?我知道我的问题含糊不清,问了很多,但只是一些提示会很好。 – 2012-03-28 23:40:30

+0

好吧,我想我会更熟悉Scheme,非常感谢! – 2012-03-28 23:46:00