Lisp/Scheme 中的 '(撇号)是什么?
-
20-09-2019 - |
题
我正在自学计划的第一天第一个小时。不用说,我什么也不明白。所以我正在读书 小阴谋家 并使用这个东西:
作为口译员。
我需要使用 '
例如在
(atom? 'turkey)
以避免“未定义变量”错误。这 '
, 根据这本书,这是一个 Common Lisp 的东西。
我有两个问题:
我上面提到的翻译是个好翻译吗?你能推荐另一个吗?我需要一款能很好搭配的 小阴谋家.
什么是
'
?
解决方案
表格 '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 很好,但更轻量级的在线方案执行器是 http://codepad.org. 。它实际上不是 REPL,因为它不是交互式的,但它非常接近。您提交的代码将在 服务器 侧而不是使用浏览器小程序。您还可以通过短 URL 共享正在运行的代码。
这 关于 键盘上的页面显示它使用“MzScheme v372 [cgc]”。
我使用键盘进行各种快速代码片段测试(包括测试代码示例以获得答案!)。
对于引用语法,可以使用如下代码看出差异:
(let ((x 5))
(display x) (newline)
(display 'x) (newline))
这显示:
5 x
在第一种情况下, x
被评估并传递给 display
, ,打印 5。在第二种情况下, 象征 x
(与字符串不同)传递给 display
, ,打印符号的名称。
简写为 (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 倾向于将返回的代码(有时甚至是手写代码)称为“列表”而不是“代码”,原因是当您深入挖掘时,这些原因会变得显而易见。祝你好运 :)
我建议你搬到一个环境更好的地方,比如 PLT方案, ,它有一个 IDE、调试器和许多库。当您继续前进并开始编写更大的程序时,您将需要它们。
单引号字符是“quote”表达式的语法糖,因此 'turkey 与 (quote turkey) 相同。基本上,“引用”的作用是关闭方案评估器。换句话说,“quote”逐字返回表达式。如果没有“quote”,那么Scheme会尝试在当前环境下评估“turkey”。这不是 Common Lisp 的东西,而是 Lisp 的东西。Common Lisp 和Scheme 是Lisp 的两种方言。所有 Lisp 教程/书籍中都解释了“quote”的用法。另请参阅以下问题的答案 这个问题.
单引号字符是 (quote foo) 的简写方式,其中 quote 是仅返回 foo 而不对其求值的形式。
在Scheme 或任何Lisp 中真正需要记住的一件事是,所有内容都是默认评估的。因此,如果您不想评估,您需要一种方法来解决这个问题。
引用某些内容就可以做到这一点,而单引号只需要更少的输入并导致更少的冗长代码。
如果您正在寻找最好的 IDE scheme
然后去 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 是否是原子的过程,但是当您传递 (atom?abc) 然后检查 abc 的值并将该值传递给它。因为,我们没有为其提供任何价值