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的值,并将值传递给它。 因为,我们没有提供任何价值