我正在自学计划的第一天第一个小时。不用说,我什么也不明白。所以我正在读书 小阴谋家 并使用这个东西:

http://sisc-scheme.org/sisc-online.php

作为口译员。

我需要使用 ' 例如在

(atom? 'turkey)

以避免“未定义变量”错误。这 ', 根据这本书,这是一个 Common Lisp 的东西。

我有两个问题:

  1. 我上面提到的翻译是个好翻译吗?你能推荐另一个吗?我需要一款能很好搭配的 小阴谋家.

  2. 什么是 '?

有帮助吗?

解决方案

表格 '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 倾向于将返回的代码(有时甚至是手写代码)称为“列表”而不是“代码”,原因是当您深入挖掘时,这些原因会变得显而易见。祝你好运 :)

  1. 我建议你搬到一个环境更好的地方,比如 PLT方案, ,它有一个 IDE、调试器和许多库。当您继续前进并开始编写更大的程序时,您将需要它们。

  2. 单引号字符是“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 的值并将该值传递给它。因为,我们没有为其提供任何价值

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top