我在第一天自学计划1。不用说,我什么都不懂。所以,我在读的小策士和使用这个东西:Lisp/Scheme中的'(撇号)是什么?
当翻译。
我需要在使用'
例如
(atom? 'turkey)
,以避免“未定义的变量”错误。根据这本书,'
是一个Common Lisp的东西。
我有两个问题:
是我上面一个好的提到的翻译吗?你能推荐另一个吗?我需要一个能与小Schemer一起顺利的人。
什么是
'
?
我在第一天自学计划1。不用说,我什么都不懂。所以,我在读的小策士和使用这个东西:Lisp/Scheme中的'(撇号)是什么?
当翻译。
我需要在使用'
例如
(atom? 'turkey)
,以避免“未定义的变量”错误。根据这本书,'
是一个Common Lisp的东西。
我有两个问题:
是我上面一个好的提到的翻译吗?你能推荐另一个吗?我需要一个能与小Schemer一起顺利的人。
什么是'
?
形式'foo
是简单地键入特殊形式
(quote foo)
这是说,“不评价的名字foo和与它的值替换它更快的方法,我真正的意思了名称富“。
我认为SISC对于探索TLS练习来说是完美无缺的。
报价和函数之间没有功能差异吗?即:加热/冷却规则。当foo被传递给一个函数时,它首先被评估,而引用代码的目的是阻止它的评估。 – 2017-09-29 20:13:34
SISC很好,但更轻量级的在线Scheme执行器是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
,打印名称为o f符号。
您需要了解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
应该是一个变量,有时它应该是符号。这对初学者来说有点混淆。一段时间后,你会看到它背后的力量。
我建议你移动到一个更好的环境,比如PLT Scheme,它有一个IDE,调试器和大量库。随着您前进并开始编写更大的程序,您将需要它们。
单引号字符是用于“引用”表达式的语法糖,所以'土耳其与(土耳其语)是一样的。基本上,“引用”所做的就是关闭Scheme评估器。换句话说,“引用”会逐字返回表达式。如果没有“报价”,那么Scheme将尝试在当前环境中评估“火鸡”。这不是一个Common Lisp的东西,而是一个Lisp的东西。 Common Lisp和Scheme是Lisp的两种方言。所有Lisp教程/书籍都解释了“quote”的用法。另请参阅this question的答案。
单引号字符是一种简写的方式(quote foo),其中引号是只返回foo而不计算它的形式。
在Scheme或任何Lisp中真正记住的一件事是,默认情况下,所有事情都会被评估。所以,如果你不想评估你需要一种方法来解决这个问题。
引用一些东西就是这样,单引号只需要较少的打字并导致较少的冗长代码。
恩,并非所有的东西都是默认评估的。在'(如果t(一)(二))',(二)永远不会被评估。一切只在顶层或函数的参数中被默认评估。如果它是*其他任何地方*,它可能会或可能不会被评估,具体取决于特定*其他地方*的位置。 – enrey 2016-07-28 07:57:36
如果您正在寻找最适合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
最后一行(原子?“ABC)被传递ABC,因为它是该过程检查是否ABC是原子或没有,但是当你经过(原子?ABC),那么它检查该值的abc并将其值传递给它。因为,我们还没有向它提供
速记(quote ...)
任何价值,'
转码成数据。
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往往调用返回的代码(有时甚至是手写代码)“名单”而不是“代码”,为将要出血原因很明显,你只挖一个深一点。祝你好运:)
不,在方案(而不是普通的lisp)东西是一个标识符。它通过引用它成为一个象征,就像'东西。一个小点,但它是正确的很好。在方案中,标识符不需要像通用的lisp那样被实现为符号。有关最新的方案标准,请参阅r7rs的§2.1和§6.5。 – 2017-09-05 21:07:35
“我需要”避免“未定义的变量”错误“ - 如果你正在写这种方式,你的方法有些严重缺陷,尽管我不能说什么。建议您仔细阅读较旧的R4RS标准(附录除外;比R5RS或R6RS更容易获得)三次。 – 2009-10-13 12:49:29