【问题标题】:Are javascript function expressions analogous to or based off s-expressions?javascript 函数表达式是否类似于或基于 s 表达式?
【发布时间】:2019-11-26 14:57:06
【问题描述】:

我听说 javascript 部分基于 Scheme,LISP 的一种方言。当我读到这个和 LISP 时,让我印象深刻的是 javascript 函数表达式语法似乎是一种类似的结构。我对 s-expressions 的理解是,所有语法要么被视为一个原子,要么被视为可以递归引用的 s-expressions,并最终简化为一个原子。如果 javascript 函数将函数的创建和引用视为另一个变量(数组、字符串和数字也都可以分配给变量),这是否意味着 javascript 函数表达式本质上是 s-expression 思想的实现?

【问题讨论】:

    标签: javascript functional-programming scheme expression lisp


    【解决方案1】:

    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 表达式来表示源代码,就像其他数据一样。

    【讨论】:

      【解决方案2】:

      我会说不。它们类似于 lisp 中的 lambda 表达式。 S 表达式更多的是关于代码和数据的一般结构。您可以在 javascript 中使用函数编写 S 表达式,或者至少模仿嵌套结构,但我不会说它们是类似的。

      【讨论】:

        【解决方案3】:

        某种程度上,它们是可以作为值传递的一流函数。

        这与 scheme 的词法范围 lambda 非常接近,而 lisp 是第一个具有此功能的语言家族。但不是 javascript 函数参数具有词法,它们具有“函数范围”。

        Javascript 的“函数作用域”在数学上没有词法作用域那么纯粹,但差别很小。

        关于 s 表达式,javascript 没有与此等价的东西 - 您不能“引用”一段 javascript 代码来获取 js AST 对象。

        【讨论】:

        • javascript(较新的)箭头函数具有词法范围
        • @user633183 那么箭头函数会是 s 表达式吗?
        • @DavidA.French 这是一个奇怪的问题,因为我不知道答案对你意味着什么。 S 表达式是可以表示数据和/或源代码的树,您可以将函数视为两者。 JavaScript 函数绝对不是 S 表达式,因为那会是语法错误,但您可以轻松地将纯箭头函数转换为等效的 S 表达式。我仍然不知道这个解释对你有什么用。你读过S-expression 的维基百科条目吗?
        • @user633183 是的,我当然读过。我不是在问它是否被解释器按字面意思解析为 s 表达式。我在问它是否在语法上相似。
        • @DavidA.French:不,不是。 S-expression 的重要之处在于 源代码可作为结构化数据供程序使用,而在 Lisp 中,该数据结构是 S-expression。这不适用于 JavaScript,它只是具有一流的功能,而且(在 lisp 术语中)也是 lisp-1。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-14
        • 2014-10-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多