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

时间:2009-10-08 16:58:54

标签: scheme lisp quote the-little-schemer

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

  

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

作为翻译。

我需要使用'例如

(atom? 'turkey)

避免“未定义的变量”错误。根据这本书,'是一个Common Lisp的东西。

我有两个问题:

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

  2. 什么是'

7 个答案:

答案 0 :(得分:55)

表单'foo只是输入特殊表单

的更快捷方式
(quote foo)

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

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

答案 1 :(得分:25)

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

<强>第一

(atom? 'turkey)

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

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

<强>第二

(atom? turkey)

我们再次有一个函数应用程序,atom?被评估为函数。这一次turkey是一个变量。评估turkey给出了绑定它的值 - 它是什么。

然后该函数应用于变量turkey的值。

<强>摘要

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

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

答案 2 :(得分:14)

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

键盘上的about页面说它使用“MzScheme v372 [cgc]”。

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

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

(let ((x 5))
  (display x) (newline)
  (display 'x) (newline))

显示:

5
x

在第一种情况下,x被评估并传递给display,后者打印5.在第二种情况下,符号 x(不是与字符串相同的东西传递给display,它打印出符号的名称。

答案 3 :(得分:7)

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

stuff是一个符号,表示它可以是变量的名称或函数的名称等。
'stuff为您提供符号&#34; stuff&#34;本身。

(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"))))将打印&#34; Hello&#34;。
(eval (eval (eval ''''(print "hello"))) - 再注意一个'然后eval - 不会打印任何内容,但它会返回代码(print "hello")本身!!

除了lispers倾向于调用返回的代码(有时甚至是手写代码)&#34; list&#34;代替&#34;代码&#34;,原因是当你深入挖掘时会明显流血。祝你好运:)

答案 4 :(得分:4)

  1. 我建议您转移到更好的环境,例如PLT Scheme,它有一个IDE,调试器和许多库。当你继续前进并开始编写更大的程序时,你将需要它们。

  2. 单引号字符是“quote”表达式的语法糖,因此'turkey与(引用turkey)相同。基本上,“引用”的作用是关闭Scheme评估器。换句话说,“quote”会逐字返回表达式。如果没有“引用”,那么Scheme会尝试在当前环境中评估“火鸡”。这不是Common Lisp的东西,而是Lisp的东西。 Common Lisp和Scheme是Lisp的两种方言。所有Lisp教程/书中都解释了“引用”的用法。另请参阅this question的答案。

答案 5 :(得分:4)

单引号字符是简短的说法(引用foo),其中引用是仅在不评估它的情况下返回foo的形式。

在Scheme或任何Lisp中真正记住的一件事是默认情况下评估所有内容。所以,在你不想评估的情况下,你需要一种方法来解决这个问题。

引用某些内容就是这样,单引号只需要更少的输入,并且可以减少冗长的代码。

答案 6 :(得分:2)

如果您正在为scheme寻找最佳IDE,请转到Dr Racket。但是当开始时Dr Racket 第一行应该是#lang scheme,因为Dr Racket有很多语言,我们已经明确提到了我们将要使用的语言。

当我们想要传递一个参数本身而不是传递参数的值时,我们使用quote。它主要与使用C编程语言中不可用的列表,对和原子时传递的过程有关(大多数人使用C编程开始编程,因此我们感到困惑)这是Scheme编程语言中的代码,它是lisp的一种方言我想你可以理解这段代码。

(define atom?              ; defining a procedure atom?
(lambda (x)              ; which as one argument x
(and (not (null? x)) (not(pair? x) )))) ; checks if the argument is atom or not
(atom? '(a b c)) ; since it is a list it is false #f

最后一行(原子?&#39; abc)正在传递abc,因为它是检查abc是否是原子的过程,但是当你传递(atom?abc)然后它检查的值是abc并将值传递给它。因为,我们还没有为它提供任何价值