代码之家  ›  专栏  ›  技术社区  ›  jtolle

调用函数和用纯函数语言实例化对象之间有关系吗?

  •  6
  • jtolle  · 技术社区  · 15 年前

    想象一种简单(组合)的语言,其中函数看起来像:

    function f(a, b) = c + 42
        where c = a * b
    

    (假设它是包含“defun”和“let”的lisp的子集。)

    还可以想象,它包含如下不可变的对象:

    struct s(a, b, c = a * b)
    

    再次类比Lisp(这次是一个超集),这样的结构定义将为以下对象生成函数:

    make-s(a, b)
    s-a(s)
    s-b(s)
    s-c(s)
    

    现在,考虑到简单的设置,很明显,当你称之为“f”或“make-s”时,在幕后发生的事情有很多相似之处。一旦在调用/实例化时提供了“a”和“b”,就有足够的信息来计算“c”。

    可以将结构实例化为调用函数,然后存储生成的符号环境,以便在调用生成的访问器函数时使用。或者,您可以将计算函数看作是创建一个隐藏结构,然后将其用作计算最终结果表达式的符号环境。

    我的玩具模型是不是太简单了,没用了?或者它实际上是一种思考真实语言如何工作的有用方法?有没有真正的语言/实现是那些没有CS背景但对编程语言(即我)感兴趣的人为了探索这个概念应该了解更多的?

    谢谢。

    编辑:谢谢你的回答。为了详细说明一点,我想我想知道的是,如果有任何真正的语言,在这种情况下,学习这种语言的人被告知,例如,“你应该把对象看作本质上的闭包”。或者,如果有任何真正的语言实现,在这种情况下,实例化一个对象并调用一个函数实际上共享一些公共(不只是简单的库调用)代码或数据结构。

    我所做的类比,我知道其他人以前也做过,在任何实际情况下,比单纯的类比更深入吗?

    4 回复  |  直到 15 年前
        2
  •  3
  •   dave    15 年前

    http://en.wikipedia.org/wiki/Lambda_calculus

    pair = fn a: fn b: fn x: x a b
    first = fn a: fn b: a
    second = fn a: fn b: b
    

    pair a b fn x: x a b a b

        3
  •  1
  •   Brian Campbell Dennis Williamson    15 年前

        4
  •  1
  •   Mark Bolusmjak    15 年前

    http://people.csail.mit.edu/gregs/ll1-discuss-archive-html/msg03277.html


    http://mitpress.mit.edu/sicp/full-text/book/book-Z-H-21.html

    (define (make-account balance)
      (define (withdraw amount)
        (if (>= balance amount)
            (begin (set! balance (- balance amount))
                   balance)
            "Insufficient funds"))
      (define (deposit amount)
        (set! balance (+ balance amount))
        balance)
      (define (dispatch m)
        (cond ((eq? m 'withdraw) withdraw)
              ((eq? m 'deposit) deposit)
              (else (error "Unknown request -- MAKE-ACCOUNT"
                           m))))
      dispatch)