javascript函数表达式是类似于还是基于s表达式?

时间:2019-07-17 17:41:38

标签: javascript functional-programming scheme expression lisp

我已经读到javascript的一部分是基于Scheme的,这是LISP的一种方言。当我阅读有关LISP的内容时,令我惊讶的是javascript函数表达式语法似乎是一种类似的结构。我对s表达式的理解是,所有语法都被视为原子,或者可以递归引用s表达式,最终将其简化为一个原子。如果javascript函数将函数的创建和引用仅视为另一个变量(并且数组,字符串和数字也都可以分配给变量),这意味着javascript函数表达式本质上是s表达式思想的实现?

3 个答案:

答案 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表达式,或者至少模仿嵌套结构,但我不会说它们是类似的。