Lisp / Scheme中的'(撇号)是什么?
我正在教自己计划的第一天1小时。 不用说,我什么都不懂。 所以我正在阅读小小的Schemer和使用这个东西:
http://sisc-scheme.org/sisc-online.php
作为翻译。
我需要使用'
在例如
(atom? 'turkey)
避免“未定义的variables”错误。 '
,根据这本书,是一个共同的Lisp的事情。
我有两个问题:
-
我上面提到的口译员是不是很好? 你能推荐另一个吗? 我需要一个与小小的Schemer相处得好的人 。
-
什么是
'
?
'foo
”forms只是input特殊forms的一种更快捷的方式
(quote foo)
也就是说,“不要评价foo这个名称并用它的价值取代它,我真的是指foo的名字”。
我认为SISC对于探索TLS练习来说是完美的。
您需要了解计划的基本评估规则。
第一 :
(atom? 'turkey)
该列表是一个函数应用程序,所以atom?
被评估为一个函数。 'turkey
是'turkey
的简称。 评价(quote turkey)
给出符号turkey
。
接下来将函数应用于符号turkey
并计算返回值。
第二
(atom? turkey)
我们再次有一个函数应用程序和atom?
被评估为一个函数。 这一次turkey
是一个variables。 评估turkey
给予了与之相关的价值 – 无论如何。
那么这个函数被应用到variablesturkey
的值。
概要
turkey
是一个variables,它被评估为它的价值。 'turkey
是(quote turkey)
,它被评价为符号turkey
。
Scheme重用sexpression式,并用sexpression式构build它的程序。 这导致了问题,有时turkey
应该是一个variables,有时它应该是符号。 这对初学者来说有点混乱。 过了一段时间,你会看到它背后的力量。
SISC是好的,但更轻量级的在线计划执行者是http://codepad.org 。 这实际上并不是一个REPL,它不是互动的,但是非常接近。 您提交的代码在服务器端执行,而不是使用浏览器小程序。 而且你可以通过简短的URL分享你正在运行的代码。
键盘上的关于页面说它使用“MzScheme v372 [cgc]”。
我使用键盘进行各种快速片段testing(包括testing代码示例的SO答案!)。
对于引用语法,可以使用如下所示的代码来看到差异:
(let ((x 5)) (display x) (newline) (display 'x) (newline))
这显示:
五 X
在第一种情况下, x
被评估并被传递给display
,该display
将打印5.在第二种情况下, 符号 x
(与string不同的东西)被传递给display
,其打印符号的名称。
-
我build议你转向更好的环境,如PLT Scheme ,它有一个IDE,debugging器和大量的库。 随着您前进并开始编写更大的程序,您将需要它们。
-
单引号字符是“quote”expression式的语法糖,所以“土耳其语”与“土耳其语”相同。 基本上,“报价”的作用是closuresScheme评估器。 换句话说,“引用”会逐字返回expression式。 如果没有“报价”,那么计划将尝试在当前环境中评估“火鸡”。 这不是一个Common Lisp的东西,而是一个Lisp的东西。 Common Lisp和Scheme是Lisp的两种方言。 所有Lisp教程/书籍都解释了“quote”的用法。 另请参阅此问题的答案。
单引号字符是(foo)引号的简写方式,引用是只返回foo而不计算它的forms。
在Scheme或任何Lisp中真正记得的一件事是,默认情况下,所有的事情都被评估。 所以,如果你不想评估你需要一个方法来坐这个。
引用一些东西就可以做到这一点,单引号只需要较less的input,并且导致代码较less。
(quote ...)
简写forms,将代码转换为数据。
stuff
是一个符号,这意味着它可以是一个variables的名称或函数名称等。
'stuff
给你的符号”东西“本身。
(dostuff "on" those 4 :parameters)
时,将会运行带有四个参数的函数dostuff
:string,variables内容,数字和关键字。
'(dostuff "on" those 4 :parameters)
当评估时将返回上面的代码,当评估时,将依次运行函数dostuff
与这四个参数。
例如:运行'''somecode
,它返回''somecode
。 运行''somecode
,它返回'somecode
。 运行'somecode
,它返回一些somecode
。 运行一些somecode
,并… somecode
…一些somecode
将运行。
你可以说'
有点像(eval..)
的反面。
(eval (eval (eval '''(print "hello"))))
会打印出“Hello”。
(eval (eval (eval ''''(print "hello")))
– 再注意一个'
then eval
– 不会打印任何东西,但会返回代码(print "hello")
本身!
除了Lispers倾向于将返回的代码(有时甚至是手写代码)称为“list”而不是“code”,因为在深入挖掘的过程中会出现明显的问题。 祝你好运 :)
如果你正在寻找一个最好的scheme
然后去Dr Racket
。 但是,当Dr Racket
第一行开始时应该是#lang scheme
因为Dr Racket
有很多语言,我们已经明确提到了我们要使用的语言。
当我们想传递一个参数而不是传递参数的值时,我们使用quote。 这主要与使用C编程语言中不能使用的列表,对和primefaces的过程有关(大多数人开始使用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? '(abc)) ; since it is a list it is false #f
最后一行(atom?'abc)正在传递abc,因为它是检查abc是否是primefaces的程序,但是当你传递(atom?abc)时,它会检查abc的值,并将值传递给它。 因为,我们没有提供任何价值