Lisp / Scheme中的'(撇号)是什么?

我正在教自己计划的第一天1小时。 不用说,我什么都不懂。 所以我正在阅读小小的Schemer和使用这个东西:

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

作为翻译。

我需要使用'在例如

 (atom? 'turkey) 

避免“未定义的variables”错误。 ' ,根据这本书,是一个共同的Lisp的事情。

我有两个问题:

  1. 我上面提到的口译员是不是很好? 你能推荐另一个吗? 我需要一个与小小的Schemer相处得好的人

  2. 什么是'

'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 ,其打印符号的名称。

  1. 我build议你转向更好的环境,如PLT Scheme ,它有一个IDE,debugging器和大量的库。 随着您前进并开始编写更大的程序,您将需要它们。

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

Interesting Posts