我在自己教学计划的第1小时1.不用说,我什么都不懂.所以我正在阅读The Little Schemer并使用这个东西:
http://sisc-scheme.org/sisc-online.php
作为翻译.
我需要使用'
例如
(atom? 'turkey)
避免"未定义的变量"错误.的'
,根据这本书,是Common Lisp的事情.
我有两个问题:
我上面提到的翻译是好的吗?你能推荐另一个吗?我需要一个能与The Little Schemer合作的人.
什么是'
?
Jonathan Fei.. 56
表单'foo
只是键入特殊表单的更快捷方式
(quote foo)
也就是说,"不要评估名称foo并用它的值替换它;我的意思是名字foo".
我认为SISC非常适合探索TLS中的练习.
表单'foo
只是键入特殊表单的更快捷方式
(quote foo)
也就是说,"不要评估名称foo并用它的值替换它;我的意思是名字foo".
我认为SISC非常适合探索TLS中的练习.
您需要了解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
应该是变量的问题, 有时它应该是符号.这对初学者来说有点混乱.过了一段时间,你会看到它背后的力量.
SISC很好,但更轻量级的在线Scheme执行程序是http://codepad.org.它实际上不是一个REPL,因为它不是交互式的,但它非常接近.您提交的代码在服务器端执行,而不是使用浏览器小程序.并且您可以通过短URL共享您正在运行的代码.
在codepad上的about页面说它使用"MzScheme v372 [cgc]".
我使用键盘进行各种快速片段测试(包括为SO答案测试代码示例!).
对于引用语法,可以使用如下代码看到差异:
(let ((x 5)) (display x) (newline) (display 'x) (newline))
这显示:
5 x
在第一种情况下,x
评估并传递给display
,打印5.在第二种情况下,传递符号 x
(与字符串不同)display
,打印符号的名称.
简写(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",原因是当你深入挖掘时会出现明显的流血现象.祝好运 :)