Syntax 理解LISP的语法

Syntax 理解LISP的语法,syntax,lisp,Syntax,Lisp,尽管LISP有一些我见过的最简单的语法,但我仍然对基本原理感到困惑。我做了研究,得出结论,有两种数据类型:“原子”和列表。然而,我也遇到了术语“S表达式”,它似乎描述了原子和列表。那么,S表达式到底是什么呢?它是数据类型吗?此外,我不知道如何区分LISP中的函数调用和数据列表。例如,(1 2 3)是一个列表,而(f 2 3)可以是某个函数。但我怎么知道f是函数名还是某个数据类型呢?由于列表和函数使用相同的语法,我不知道如何区分这两者。最后,最重要的是,我需要一个思考LISP如何工作的心智模型。例

尽管LISP有一些我见过的最简单的语法,但我仍然对基本原理感到困惑。我做了研究,得出结论,有两种数据类型:“原子”和列表。然而,我也遇到了术语“S表达式”,它似乎描述了原子和列表。那么,S表达式到底是什么呢?它是数据类型吗?此外,我不知道如何区分LISP中的函数调用和数据列表。例如,(1 2 3)是一个列表,而(f 2 3)可以是某个函数。但我怎么知道f是函数名还是某个数据类型呢?由于列表和函数使用相同的语法,我不知道如何区分这两者。最后,最重要的是,我需要一个思考LISP如何工作的心智模型。例如,基本数据类型是什么?用于处理基本数据类型的内置过程是什么?我们如何将数据和过程视为不同的?例如,在Java中,类顶部的实例变量用于表示数据,而方法是操作数据的过程。这在LISP中是什么样子的


(我是新来的,所以我不确定这个问题是否太宽泛)

所有自我评估的东西都是数据。例如
2
“你好”
。 引用的所有内容都是数据。例如
'(f34)
'test
,或正手版本
(quote test)
提供给REPL的所有其他内容都需要是代码。例如
(f34)
是代码。它是一个表达式,与上面引用的数据不可区分,但它没有被引用,所以它必须是代码

有一些特殊形式,如
if
let
lambda
defun
。。。你只需要学习如何工作。如果不是Java或C#等C方言中的方法,您怎么知道
?你只需要把他们牢记在心

您还需要了解一些基本功能。通常,在每一个教程中都会介绍它们以及特殊的表单。我建议您阅读和了解常见的Lisp和Racket。对于纯方案,我推荐。不要同时做这些事情。当你学会了一个好的方法时,学习其他方法是很容易的

现在,学习Lisp比学习另一种C方言更难。这是因为它是一种完全不同的语言,有着不同的做事方式。例如,当
循环和变量没有类型,但它们引用的对象有类型时,您将找不到或。您需要学习如何编程,就像您不懂C方言一样。(事实上,了解C方言可能会使学习更加困难)

祝你好运

一个“S表达式”是“一个原子,或者一个S表达式列表”(这里还有一些更复杂的问题,我现在略过这些,基本上可以归结为一种称为“读取宏”的东西,在这里可以实现文本表示和内部表示之间的差异,以简化人类的书写)

(1 2 3)
是一个列表。但是,
(f 1 2 3)
也是一个列表。但是,在某些(大多数?)情况下,它也可以是函数调用(而不是函数)


我认为你大部分都有语法,剩下的是语义(在技术上)。在这一点上,我想告诉你一些好的阅读材料,有很多好书(我从早期版本的开始。

我支持LispBook和实用通用Lisp的推荐。这两本书都很棒。一旦你了解了基本知识,我真的非常推荐

要引导您回答特定问题,请执行以下操作:

  • 数据类型:Lisp有一组丰富的数据类型(数字类型,如整数、有理数、浮点字符和字符串数组以及哈希表等等),但在我看来,假设您已经熟悉整数和字符串,那么您应该从阅读
    symbol
    cons
    开始

  • symbol
    :认识到符号既是一个标识符也是一个值。了解每个符号可以“指向”一个数据值,同时“指向”一个函数(还有三个您不必担心的其他属性)

  • cons
    :发现这个叫做“cons单元格”的神奇东西只是一个有两个指针的结构。一个叫做“寄存器的地址部分”,另一个叫做“寄存器的减量部分”。不要担心这些名称的含义(它们不再相关),只需知道
    car
    函数返回寄存器地址部分的内容,而
    cdr
    返回减量部分。现在忘记所有这些,只需记住,现代Lisper将cons单元格视为具有两个指针的结构,一个称为car,另一个称为cdr

  • 列表:“没有勺子。”也没有列表。要知道,我们所认为的列表不过是一组cons单元格,每个cons的car指向列表中的一个成员,每个cons的cdr指向下一个cons(除了最后一个cons,其cdr是“空指针”nil)。这对于理解列表操作、嵌套列表、树结构等非常重要

  • 原子:现在,把一个原子想象成一个数字、一个字符、一个字符串或一个符号。这就足够让你开始了,你可以在以后更深入地了解细节

  • S表达式:S表达式被定义为“一个原子,或者一个指向两个S表达式的cons单元格”

  • 列表vs函数调用:老兄,哦,老兄!我刚开始的时候很难做到这一点!但经过一点练习其实很容易:“五乘二”只是一个英语短语,对吧?但如果我让你“评估”它,你可能会说“十”。“1+2”是一个数学表达式,但是一个数学题