什么是Lisp/Scheme中的'(撇号)?

jje*_*rms 59 lisp scheme the-little-schemer quote

我在自己教学计划的第1小时1.不用说,我什么都不懂.所以我正在阅读The Little Schemer并使用这个东西:

http://sisc-scheme.org/sisc-online.php

作为翻译.

我需要使用'例如

(atom? 'turkey)
Run Code Online (Sandbox Code Playgroud)

避免"未定义的变量"错误.的',根据这本书,是Common Lisp的事情.

我有两个问题:

  1. 我上面提到的翻译是好的吗?你能推荐另一个吗?我需要一个能与The Little Schemer合作的人.

  2. 什么是'

Jon*_*erg 56

表单'foo只是键入特殊表单的更快捷方式

(quote foo)
Run Code Online (Sandbox Code Playgroud)

也就是说,"不要评估名称foo并用它的值替换它;我的意思是名字foo".

我认为SISC非常适合探索TLS中的练习.


Rai*_*wig 26

您需要了解Scheme的基本评估规则.

第一:

(atom? 'turkey)
Run Code Online (Sandbox Code Playgroud)

该列表是一个函数应用程序,因此atom?被评估为函数. 'turkey是一个简写符号(quote turkey).评估(quote turkey)给出了符号turkey.

接下来,该函数将应用于该符号,turkey并计算返回值.

第二

(atom? turkey)
Run Code Online (Sandbox Code Playgroud)

我们再次拥有一个函数应用程序并对函数atom?进行求值.这个时间turkey是变量.评估turkey给出了绑定它的价值 - 它是什么.

那么函数就应用于变量的值turkey.

摘要

turkey是一个变量,它被评估为其值.'turkey(quote turkey),它被评估为符号turkey.

Scheme重用s表达式并用s表达式构建程序.这导致了有时turkey应该是变量的问题, 有时它应该是符号.这对初学者来说有点混乱.过了一段时间,你会看到它背后的力量.

  • @BradenBest:如果您对 Lisp 的使用有疑问,请提出问题。评论不是提问的好地方。 (2认同)

Gre*_*ill 14

SISC很好,但更轻量级的在线Scheme执行程序是http://codepad.org.它实际上不是一个REPL,因为它不是交互式的,但它非常接近.您提交的代码在服务器端执行,而不是使用浏览器小程序.并且您可以通过短URL共享您正在运行的代码.

在codepad上的about页面说它使用"MzScheme v372 [cgc]".

我使用键盘进行各种快速片段测试(包括为SO答案测试代码示例!).

对于引用语法,可以使用如下代码看到差异:

(let ((x 5))
  (display x) (newline)
  (display 'x) (newline))
Run Code Online (Sandbox Code Playgroud)

这显示:

5
x

在第一种情况下,x评估并传递给display,打印5.在第二种情况下,传递符号 x(与字符串不同)display,打印符号的名称.


enr*_*rey 7

简写(quote ...),'将代码转换为数据.

stuff是一个符号,这意味着它可以是变量的名称或函数的名称等.
'stuff给你符号"stuff"本身.

(dostuff "on" those 4 :parameters) 在评估时,将dostuff使用四个参数运行函数:字符串,变量内容,数字和关键字.
'(dostuff "on" those 4 :parameters)当被评估时会返回上面的代码,当被评估时,它将依次运行dostuff具有这四个参数的函数.

例如:运行'''somecode,它返回''somecode.跑''somecode,它返回'somecode.跑'somecode,它返回somecode.跑somecode,然后......好吧...... somecode会跑.

你可以说这'有点像(eval..).

(eval (eval (eval '''(print "hello"))))会打印"你好".
(eval (eval (eval ''''(print "hello")))-通知一个更'然后eval-不显示任何信息,但它会返回代码(print "hello")本身!

除了lispers倾向于调用返回的代码(有时甚至是手写代码)"list"而不是"code",原因是当你深入挖掘时会出现明显的流血现象.祝好运 :)

  • 不,在方案中(与普通的lisp相反),东西是标识符.它通过引用它成为一个符号,如'stuff.这是一个小问题,但要做到这一点很好.在方案中,标识符不需要实现为符号,如在常见的lisp中.有关最新的方案标准,请参阅r7的§2.1和§6.5. (2认同)

小智 5

单引号字符是 (quote foo) 的简写方式,其中 quote 是只返回 foo 而不求值的形式。

在 Scheme 或任何 Lisp 中真正要记住的一件事是,一切都是默认评估的。因此,在您不想评估的情况下,您需要一种方法来满足此要求。

引用一些东西就是这样做的,单引号只需要更少的输入并导致更少的冗长代码。