Syntax 理解LISP的语法
尽管LISP有一些我见过的最简单的语法,但我仍然对基本原理感到困惑。我做了研究,得出结论,有两种数据类型:“原子”和列表。然而,我也遇到了术语“S表达式”,它似乎描述了原子和列表。那么,S表达式到底是什么呢?它是数据类型吗?此外,我不知道如何区分LISP中的函数调用和数据列表。例如,(1 2 3)是一个列表,而(f 2 3)可以是某个函数。但我怎么知道f是函数名还是某个数据类型呢?由于列表和函数使用相同的语法,我不知道如何区分这两者。最后,最重要的是,我需要一个思考LISP如何工作的心智模型。例如,基本数据类型是什么?用于处理基本数据类型的内置过程是什么?我们如何将数据和过程视为不同的?例如,在Java中,类顶部的实例变量用于表示数据,而方法是操作数据的过程。这在LISP中是什么样子的Syntax 理解LISP的语法,syntax,lisp,Syntax,Lisp,尽管LISP有一些我见过的最简单的语法,但我仍然对基本原理感到困惑。我做了研究,得出结论,有两种数据类型:“原子”和列表。然而,我也遇到了术语“S表达式”,它似乎描述了原子和列表。那么,S表达式到底是什么呢?它是数据类型吗?此外,我不知道如何区分LISP中的函数调用和数据列表。例如,(1 2 3)是一个列表,而(f 2 3)可以是某个函数。但我怎么知道f是函数名还是某个数据类型呢?由于列表和函数使用相同的语法,我不知道如何区分这两者。最后,最重要的是,我需要一个思考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的推荐。这两本书都很棒。一旦你了解了基本知识,我真的非常推荐 要引导您回答特定问题,请执行以下操作:
symbol
和cons
开始symbol
:认识到符号既是一个标识符也是一个值。了解每个符号可以“指向”一个数据值,同时“指向”一个函数(还有三个您不必担心的其他属性)cons
:发现这个叫做“cons单元格”的神奇东西只是一个有两个指针的结构。一个叫做“寄存器的地址部分”,另一个叫做“寄存器的减量部分”。不要担心这些名称的含义(它们不再相关),只需知道car
函数返回寄存器地址部分的内容,而cdr
返回减量部分。现在忘记所有这些,只需记住,现代Lisper将cons单元格视为具有两个指针的结构,一个称为car,另一个称为cdr