我在自己教学计划的第1小时1。不用说,我什么都不懂。所以我正在阅读 The Little Schemer 并使用这个东西:
作为翻译。
我需要使用'
例如
(atom? 'turkey)
避免“未定义的变量”错误。根据这本书,'
是一个Common Lisp的东西。
我有两个问题:
我上面提到的翻译是好的吗?你能推荐另一个吗?我需要一个能与 The Little Schemer 相吻合的人。
什么是'
?
答案 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)
我建议您转移到更好的环境,例如PLT Scheme,它有一个IDE,调试器和许多库。当你继续前进并开始编写更大的程序时,你将需要它们。
单引号字符是“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并将值传递给它。因为,我们还没有为它提供任何价值