我已经读到javascript的一部分是基于Scheme的,这是LISP的一种方言。当我阅读有关LISP的内容时,令我惊讶的是javascript函数表达式语法似乎是一种类似的结构。我对s表达式的理解是,所有语法都被视为原子,或者可以递归引用s表达式,最终将其简化为一个原子。如果javascript函数将函数的创建和引用仅视为另一个变量(并且数组,字符串和数字也都可以分配给变量),这意味着javascript函数表达式本质上是s表达式思想的实现?
答案 0 :(得分:4)
S表达式(符号表达式的缩写)是一种数据格式(例如XML,JSON等)。 S表达式是由列表,符号,数字,字符串和其他数据对象组成的。
Lisp数据和代码通常以外部文本格式写为s表达式或由函数创建。
创建嵌套列表:
CL-USER 1 > (list '* 10 (list '- 3 5))
(* 10 (- 3 5))
以上结果实际上是符号和数字的嵌套列表,而不是字符串。
实际上将该列表作为程序执行:
CL-USER 2 > (eval (list '* 10 (list '- 3 5)))
-20
JavaScript没有与此直接等效的内容:
它不以这种数据结构编写代码。 JavaScript程序是文本
JavaScript可以使用其eval
评估源代码,但是源代码是字符串
JavaScript函数对象是不相关的,因为它们本身不是源代码,没有文本格式等。采用参数并对其进行计算也使它们不是源代码,并且不使它们处理与S-表达式。 Lisp中使用S表达式来表示源代码,就像其他数据一样。
答案 1 :(得分:1)
它们是一流的函数,您可以将其作为值传递。
这非常接近Scheme的词汇范围lambda
,并且lisp是第一个具有此功能的语言家族。但是它们不是具有词法的javascript函数参数,而是具有“函数范围”。
JavaScript的“功能范围”在数学上比词汇范围要少一些,但差异很小。
关于s表达式,javascript没有与此等效的功能-您无法“引用”一段JavaScript代码来获取js AST对象。
答案 2 :(得分:1)
我会拒绝。它们类似于Lisp中的Lambda表达式。 S表达式更多地涉及代码和数据的一般结构。您可以使用javascript函数编写S表达式,或者至少模仿嵌套结构,但我不会说它们是类似的。