Function 是';其运算符本身为复合表达式的组合';变量函数的同义词?

Function 是';其运算符本身为复合表达式的组合';变量函数的同义词?,function,scheme,evaluation,function-call,Function,Scheme,Evaluation,Function Call,我为这里缺少一些词汇提前道歉。综上所述,早期提到了“其运算符本身就是复合表达式的组合”,例如: (定义(a-plus-abs-b) ((如果(>b0)+-)ab)) 其中组合(如果(>b0)+-)被评估为+或-,如果b大于零,则评估为(+ab) 我的问题是:这和变量函数(例如)有什么不同吗?另外,变量函数和此功能与使用不同吗?从Lisp的角度来看,这里的重要概念是一种语言是“Lisp-1”还是“Lisp-2”。这两者之间的区别在于:在一个看起来像函数应用程序的表达式中,表示要应用的函数的东西是

我为这里缺少一些词汇提前道歉。综上所述,早期提到了“其运算符本身就是复合表达式的组合”,例如:

(定义(a-plus-abs-b)
((如果(>b0)+-)ab))
其中组合
(如果(>b0)+-)
被评估为
+
-
,如果b大于零,则评估为
(+ab)


我的问题是:这和变量函数(例如)有什么不同吗?另外,变量函数和此功能与使用不同吗?

从Lisp的角度来看,这里的重要概念是一种语言是“Lisp-1”还是“Lisp-2”。这两者之间的区别在于:在一个看起来像函数应用程序的表达式中,表示要应用的函数的东西是如何计算的

因此,在Lisps中,类似于函数应用程序的内容类似于列表:

(f a b ...)
在考虑此类事项时,系统必须做三件事:

  • 确定它是一个函数应用程序(例如,
    (如果…
    )不是,也不是一个宏形式)
  • 如果是,则评估函数及其参数
  • 调用该函数,并将求值结果传递给它
  • (注意:我在这里假设了所谓的应用程序顺序求值:普通的顺序语言做的事情不同。)

    问题是(2)是如何发生的

    • lisp-1以与所有其他位置完全相同的方式以这种形式计算函数位置(第一个位置)。因此,函数位置可以包含完全任意的表达式。所以
      ((如果add+-)12)
      非常好,例如
      (let((op…)(op…)
    • lisp-2对函数位置使用一些特殊规则,特别是对于lisp-2,符号的“函数值”位于与普通值不同的命名空间中。这意味着允许的不是一般表达式,而是规则允许的任何内容。因此,例如,在lisp-2中,类似的东西不起作用:
      (let((op(lambda…))(op…)
      ,但类似的东西确实起作用:
      (let((car…)(car-car))
    众所周知,Scheme是lisp-1,Common lisp是lisp-2

    因此,我认为,回答你问题的方法是认识到这个概念可以很好地应用于其他语言

    • JavaScript是一个lisp-1,因此看起来像函数应用程序的东西的函数位置只是在正常情况下进行了完美的评估
    • Python是一个lisp-1
    • 我不知道PHP是什么

    请注意,在这些语言中,您知道某个东西是函数应用程序的方式与在Lisp中完全不同,但重要的问题是,一旦您知道了这一点,如何评估函数位置?

    从Lisp的角度来看,这里的重要概念是一种语言是“Lisp-1”还是“Lisp-2”。这两者之间的区别在于:在一个看起来像函数应用程序的表达式中,表示要应用的函数的东西是如何计算的

    因此,在Lisps中,类似于函数应用程序的内容类似于列表:

    (f a b ...)
    
    在考虑此类事项时,系统必须做三件事:

  • 确定它是一个函数应用程序(例如,
    (如果…
    )不是,也不是一个宏形式)
  • 如果是,则评估函数及其参数
  • 调用该函数,并将求值结果传递给它
  • (注意:我在这里假设了所谓的应用程序顺序求值:普通的顺序语言做的事情不同。)

    问题是(2)是如何发生的

    • lisp-1以与所有其他位置完全相同的方式以这种形式计算函数位置(第一个位置)。因此,函数位置可以包含完全任意的表达式。所以
      ((如果add+-)12)
      非常好,例如
      (let((op…)(op…)
    • lisp-2对函数位置使用一些特殊规则,特别是对于lisp-2,符号的“函数值”位于与普通值不同的命名空间中。这意味着允许的不是一般表达式,而是规则允许的任何内容。因此,例如,在lisp-2中,类似的东西不起作用:
      (let((op(lambda…))(op…)
      ,但类似的东西确实起作用:
      (let((car…)(car-car))
    众所周知,Scheme是lisp-1,Common lisp是lisp-2

    因此,我认为,回答你问题的方法是认识到这个概念可以很好地应用于其他语言

    • JavaScript是一个lisp-1,因此看起来像函数应用程序的东西的函数位置只是在正常情况下进行了完美的评估
    • Python是一个lisp-1
    • 我不知道PHP是什么
    请注意,在这些语言中,您知道某个东西是函数应用程序的方式与Lisp中完全不同,但重要的问题是,一旦您知道,如何计算函数位置?

    在Scheme(由SICP使用)中,可以在函数位置中使用变量

    首先,我们尝试将符号
    +
    用作函数:

    尝试将符号用作函数

    > (define foo '+)
    > foo
    +
    > (foo 1 2)
    Exception: attempt to apply non-procedure +
    
    不幸的是,这不起作用:
    foo
    计算为符号
    +
    ,而这本身不是一个函数

    使用函数对象

    但这是可行的:

    > (define foo +)
    > (foo 1 2)
    3
    
    这里
    foo
    被设置为
    +
    的值,这是一个函数对象。
    foo