2009-10-08 36 views
49

我在第一天自学计划1。不用说,我什么都不懂。所以,我在读的小策士和使用这个东西:Lisp/Scheme中的'(撇号)是什么?

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

当翻译。

我需要在使用'例如

(atom? 'turkey) 

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

我有两个问题:

  1. 是我上面一个好的提到的翻译吗?你能推荐另一个吗?我需要一个能与小Schemer一起顺利的人。

  2. 什么是'

+1

“我需要”避免“未定义的变量”错误“ - 如果你正在写这种方式,你的方法有些严重缺陷,尽管我不能说什么。建议您仔细阅读较旧的R4RS标准(附录除外;比R5RS或R6RS更容易获得)三次。 – 2009-10-13 12:49:29

回答

47

形式'foo是简单地键入特殊形式

(quote foo) 

这是说,“不评价的名字foo和与它的值替换它更快的方法,我真正的意思了名称富“。

我认为SISC对于探索TLS练习来说是完美无缺的。

+0

报价和函数之间没有功能差异吗?即:加热/冷却规则。当foo被传递给一个函数时,它首先被评估,而引用代码的目的是阻止它的评估。 – 2017-09-29 20:13:34

13

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符号。

22

您需要了解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应该是一个变量,有时它应该是符号。这对初学者来说有点混淆。一段时间后,你会看到它背后的力量。

3
  1. 我建议你移动到一个更好的环境,比如PLT Scheme,它有一个IDE,调试器和大量库。随着您前进并开始编写更大的程序,您将需要它们。

  2. 单引号字符是用于“引用”表达式的语法糖,所以'土耳其与(土耳其语)是一样的。基本上,“引用”所做的就是关闭Scheme评估器。换句话说,“引用”会逐字返回表达式。如果没有“报价”,那么Scheme将尝试在当前环境中评估“火鸡”。这不是一个Common Lisp的东西,而是一个Lisp的东西。 Common Lisp和Scheme是Lisp的两种方言。所有Lisp教程/书籍都解释了“quote”的用法。另请参阅this question的答案。

3

单引号字符是一种简写的方式(quote foo),其中引号是只返回foo而不计算它的形式。

在Scheme或任何Lisp中真正记住的一件事是,默认情况下,所有事情都会被评估。所以,如果你不想评估你需要一种方法来解决这个问题。

引用一些东西就是这样,单引号只需要较少的打字并导致较少的冗长代码。

+0

恩,并非所有的东西都是默认评估的。在'(如果t(一)(二))',(二)永远不会被评估。一切只在顶层或函数的参数中被默认评估。如果它是*其他任何地方*,它可能会或可能不会被评估,具体取决于特定*其他地方*的位置。 – enrey 2016-07-28 07:57:36

1

如果您正在寻找最适合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并将其值传递给它。因为,我们还没有向它提供

3

速记(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往往调用返回的代码(有时甚至是手写代码)“名单”而不是“代码”,为将要出血原因很明显,你只挖一个深一点。祝你好运:)

+0

不,在方案(而不是普通的lisp)东西是一个标识符。它通过引用它成为一个象征,就像'东西。一个小点,但它是正确的很好。在方案中,标识符不需要像通用的lisp那样被实现为符号。有关最新的方案标准,请参阅r7rs的§2.1和§6.5。 – 2017-09-05 21:07:35