【问题标题】:Assigning a list of atoms in Scheme在 Scheme 中分配原子列表
【发布时间】:2009-01-21 04:10:36
【问题描述】:

我正在尝试在 Macintosh 上使用 DrScheme 从“The Little Schemer”一书中学习 Scheme。开头是“l 的车是什么,其中 l 是论点 (a b c)?”

我知道这个问题的答案是 a,但我无法真正弄清楚在 Dr Scheme 中输入什么来“跟随”。关于如何分配给 l 的一个简单想法,例如 > (def l ('a 'b 'c))

给我错误: “函数调用:在左括号后需要一个定义的名称或原始操作名称,但发现了别的东西”

【问题讨论】:

    标签: scheme racket


    【解决方案1】:

    定义一些东西:

    (define <name> <value>)
    

    所以定义 l:

    (define l '(a b c))
    

    这将l 定义为列表(a b c)。单引号引用它后面的任何内容,无论是符号还是列表,这意味着它不会被评估而是按原样读取。但是,您不要引用您设置的名称。值得庆幸的是,这是 Scheme 中极少数存在这种不一致的操作之一。

    【讨论】:

    • 这在我将选择的语言从“Beginning Student”更改为“Beginning Student with list abbreviations”后有效。谢谢。
    • 我经常使用 DrScheme,但学生的限制实在是太愚蠢了。它不会告诉您您正在使用更高级的功能,而是会引发错误。我的建议是避免使用学生的东西,而只使用完整的方案。使用模块并在所有文件前加上#lang scheme
    • 嗯,听起来不错,但我无法让它工作。我收到错误消息:standard-module-name-resolver: collection not found: "scheme" in any of: (# #)
    • 抱歉,我以为您使用的是较新的 DrScheme 副本!在版本 4 中,他们对模块语言进行了标准化;对于早期版本,我建议使用 Pretty Big(或升级)。
    • 与4+版本最大的兼容性问题是set-car的移除!和 set-cdr!。它们被 set-mcar “取代”了!和 set-mcdr!,并且只能对使用 mcons(而不是 cons)创建的“可变”对进行操作。只要您注意到这一变化,您就应该做好准备。
    【解决方案2】:

    试试这个:

    (define l '(a b c))
    

    这里,引用适用于整个列表(a b c)

    【讨论】:

    • 错误信息:def: name is not defined, not a parameter, and not a primitive name
    • 它应该是“定义”而不是“定义”,更多信息请参见我的回答:stackoverflow.com/questions/464057/…
    • 呃,我只是按照你的例子。改为“定义”。
    【解决方案3】:

    或者,只需使用

    (car '(a b c))
    

    错误告诉你的是:当读者看到一个列表时,它想将列表的第一个元素视为一个函数。这就是(+ 1 2 3) 的工作原理:它调用函数+。 (严格来说,它查看符号'+ 并发现绑定了一个函数,然后调用该函数。)

    所以,当你输入时

    (define l ('a 'b 'c))
    

    它查看内部列表,然后想要找到一个函数。相反,它会找到名为a 的符号。由于那里没有功能,因此您会收到错误消息。相反,如果您键入

    (define l '(a b c))
    

    你已经通过引用告诉读者,将其视为一个列表,而不是试图解释它。

    这是一个来自 MIT Scheme 在 Mac 上的示例:

    1 ]=> (define li '(a b c))
    
    ;Value: li
    
    1 ]=> (car li)
    
    ;Value: a
    
    1 ]=> (car '(a b c ))
    
    ;Value: a
    

    【讨论】:

    • > 然后想找到一个名为 a [...] 的函数,严格来说,这不是真的。即使你有一个名为 a 的函数,它仍然是一个错误,因为它不是在寻找值 a,而是试图使用符号 a。尝试将符号用作运算符总是错误的。
    【解决方案4】:

    的非缩写形式
    (define l '(a b c))  
    

    (define l (quote (a b c)))  
    

    或者在这种情况下甚至是这样:

    (define l (list 'a 'b 'c))  
    

    如果没有“列表”部分,它显然会尝试执行 'a

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多