代码之家  ›  专栏  ›  技术社区  ›  Chris

为什么这段代码在Scheme中不起作用?

  •  1
  • Chris  · 技术社区  · 17 年前
     (define a 42)
     (set! 'a 10)
    
    
    (define a 42)
    (define (symbol) 'a)
    (set! (symbol) 10)
    
    
    (define a (cons 1 2))
    (set! (car a) 10)
    

    我试着在DrScheme中运行它们,但它们不起作用。为什么?

    3 回复  |  直到 17 年前
        1
  •  3
  •   mweiss    17 年前

    想想布景!是一种特殊形式,如define,它不计算其第一个操作数。您正在告诉方案解释器按照您的编写方式设置该变量。在您的示例中,它不会将表达式“a”计算为单词a。相反,它会查找一个名为“a”的变量绑定(或者根据您的解释器,在此之前可能会中断,因为我认为“a”不是一个有效的绑定)。

    对于最后一组表达式,如果要设置一对中的car,请使用函数(set car!pair-val),该函数的工作原理与任何方案函数一样,因为它计算其所有操作数。它接受两个值,一对和一些方案值,并对其进行修改,使汽车现在指向方案值。

    例如。

    >(define pair (cons 1 2))
    >pair
    (1 . 2)
    >(set-car! pair 3)
    (3 . 2)
    
        2
  •  2
  •   sanxiyn    17 年前

    因为set的第一个参数!是一个变量名,而不是可以说的“左值”。

    对于最后一种情况,使用(set car!a 10)。

        3
  •  -2
  •   Jegschemesch    17 年前

    问题在于 (设置!'a 10) ,因为你不应该引用这个符号 .

    听起来你在学习Scheme,但你不懂Lisp,是吗?如果是这样,我强烈建议尝试Clojure,因为它更容易学习Lisp。在Common Lisp和Scheme中,我未能理解阅读器、求值、符号、特殊形式、宏等之间的交互,因为这些东西似乎都以错综复杂的方式相互作用,但我终于在Clojure中真正理解了它们。尽管它是新的,但我发现Clojure文档实际上比我为Scheme或CL找到的任何文档都更清晰 http://clojure.blip.tv/ 然后阅读clojure.org上的文档。