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

什么是';(撇号)在Lisp/Scheme中?,scheme,lisp,quote,the-little-schemer,Scheme,Lisp,Quote,The Little Schemer,我在自学计划的第1天第1小时。不用说,我什么都不懂。所以我在读《小阴谋家》并用这个东西: 作为一名口译员 例如,我需要在中使用” (atom? 'turkey) 避免“未定义变量”错误。根据这本书的说法,“”是一种常见的Lisp语言 我有两个问题: 我上面提到的那个翻译好吗?你能推荐另一个吗?我需要一个和小阴谋家合得来的 什么是” 表单'foo只是一种快速键入特殊表单的方法 (quote foo) 也就是说,“不要计算名称foo并用它的值替换它;我实际上是指名称foo” 我认为SISC非常

我在自学计划的第1天第1小时。不用说,我什么都不懂。所以我在读《小阴谋家》并用这个东西:

作为一名口译员

例如,我需要在中使用

(atom? 'turkey)
避免“未定义变量”错误。根据这本书的说法,
”是一种常见的Lisp语言

我有两个问题:

  • 我上面提到的那个翻译好吗?你能推荐另一个吗?我需要一个和小阴谋家合得来的

  • 什么是


  • 表单
    'foo
    只是一种快速键入特殊表单的方法

    (quote foo)
    
    也就是说,“不要计算名称foo并用它的值替换它;我实际上是指名称foo”


    我认为SISC非常适合探索TLS中的练习。

    SISC很好,但更轻量级的在线方案执行器是。它实际上不是一个REPL,因为它不是交互式的,但它非常接近。您提交的代码在服务器端执行,而不是使用浏览器小程序。您可以通过短URL共享正在运行的代码

    codepad上的页面说它使用了“MZSchemeV372[cgc]”

    我使用codepad进行各种快速代码段测试(包括测试代码样本以获得答案!)

    对于quote语法,可以使用如下代码看到差异:

    (let ((x 5))
      (display x) (newline)
      (display 'x) (newline))
    
    这将显示:

    5 x 5. x
    在第一种情况下,
    x
    被计算并传递给
    display
    ,后者打印5。在第二种情况下,符号
    x
    (与字符串不同)被传递到
    display
    ,display打印符号的名称。

    您需要了解Scheme的基本求值规则

    首先

    (atom? 'turkey)
    
    列表是一个函数应用程序,因此
    atom?
    将被计算为一个函数。
    “土耳其”
    (引用土耳其)
    的简写符号。评估
    (引用土耳其)
    给出符号
    土耳其

    因此,接下来将函数应用于符号
    土耳其
    ,并计算返回值

    (atom? turkey)
    
    同样,我们有一个函数应用程序,
    atom?
    被计算为一个函数。这次土耳其是一个变量。评估
    土耳其
    会给出与之相关的价值——不管它是什么

    因此,该函数将应用于变量
    turkey
    的值

    摘要

    turkey
    是一个变量,它将根据其值进行计算
    'turkey
    (引用turkey)
    ,其计算结果为符号
    turkey

    Scheme重用s表达式并用s表达式构建其程序。这导致了一个问题,即有时土耳其应该是一个变量,有时它应该是一个符号。这对初学者来说有点困惑。一段时间后,你会看到它背后的力量

  • 我建议您转移到一个更好的环境,例如,它有一个IDE、调试器和许多库。当你继续前进并开始编写更大的程序时,你将需要它们


  • 单引号字符是“quote”表达式的语法糖,因此“turkey”与(quote turkey)相同。基本上,“quote”的作用是关闭方案评估器。换句话说,“quote”返回表达式,逐字逐句。如果没有“报价”,那么方案将尝试在当前环境中评估“土耳其”。这不是一个常见的口齿不清的东西,而是一个口齿不清的东西。公共Lisp和Scheme是Lisp的两种方言。所有Lisp教程/书籍都解释了“quote”的用法。另请参见的答案


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

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


    引用某些东西就是这样做的,单个引用只需要较少的键入,并导致较少的详细代码。

    如果您正在为
    方案
    寻找最佳IDE,请选择
    Dr Racket
    。但是当开始时
    Dr Racket
    第一行应该是
    #lang scheme
    ,因为
    drracket
    有很多语言,我们已经明确提到了我们要使用的语言

    当我们想传递一个参数本身而不是传递参数的值时,我们使用引号。它主要与在使用列表、对和原子时传递的过程有关,这些在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
    
    最后一行(atom?abc)按原样将abc传递给检查abc是否为atom的过程,但当您传递(atom?abc)时,它会检查abc的值并将值传递给它。由于我们没有为它提供任何值

    简称
    (quote…
    将代码转换为数据

    stuff
    是一个符号,意味着它可以是变量名或函数名等。
    'stuff
    给你符号“stuff”本身

    (dostuff“on”the 4:parameters)
    计算时,将运行带有四个参数的函数
    dostuff
    :字符串、变量内容、数字和关键字。
    ”(dostuff“on”the 4:parameters)
    求值时将返回上面的代码,求值时,该代码将依次使用这四个参数运行函数
    dostuff

    例如: 运行
    ''somecode
    ,它返回
    ''somecode
    。运行
    “somecode
    ,它返回
    ”somecode