【问题标题】:How do I evaluate an expression with given arguments?如何评估具有给定参数的表达式?
【发布时间】:2020-07-28 15:38:49
【问题描述】:

我目前正在尝试创建一个具有以下签名的函数:

(define (point-app F x))

计算 F(x)。我的目标是能够以 x 作为参数来评估函数 F。

如果我有:

(point-app '(+(* x x) 4) 2) F(2) = (2^2)+4 预期输出为 8。

我已经尝试使用 eval,通过关注 drracket 的docs

(define (point-fixe f x)
  (eval `(let ([number x]),f)))

但我无法将变量 x 附加到数字。据我所知,这是因为 eval 动态加载表达式?我已经搜索了常见的线程,但没有找到任何对我有帮助的东西。任何帮助将不胜感激。

【问题讨论】:

  • 你可以写成(point-app (lambda (x) (+ (* x x) 4)) 2)吗?还是必须是引用列表?如果是后者,而你有(point-app '(list x y) 2),你怎么知道'x'y 中的哪一个用给定的参数值替换,即哪个用作参数占位符,哪个用作引用基准?即返回'(2 y)还是'(x 2)
  • 假设第一个参数是F,第二个参数是x。我正在实现的函数是定点逼近,即 F(x) = x (不会有变量 y)。我试图避免在函数调用中使用 lambda,因为我希望它通过添加更干净'(expression)(更难的表达式 --> 更多时间考虑 lambda func)
  • 坚持使用 lambda,如果你有任何选择的话。否则你将不得不编写自己的评估器。这也很有趣,但没必要。
  • 我已经考虑过了,遍历表达式,将所有x 替换为一个数字,然后对那个新表达式运行 eval 不是很好吗?

标签: functional-programming scheme lisp racket evaluation


【解决方案1】:

在 lambda 演算中表达函数的方式是 λx.e,其中 e 是一些可能涉及 x 的表达式。这直接转换为 Racket 为 (λ (x) e) 其中 e 又是一些表达式。

所以你的函数只需要在它的第二个参数上调用它的第一个参数,一个函数:

(define (point-app F x)
  (F x))

如果您想将函数表示为文字数据(例如列表),那么您可以使用 eval 将它们转换为函数:

(define (source->function function-form)
  (eval function-form))

那么现在:

> (point-app (source->function '(λ (x) (+ (* x x) 4))) 2)
8

如果您不想使用该语言的底层机制,那么您需要编写一个评估器。这不是很难,我敢肯定有很多例子。

【讨论】:

    猜你喜欢
    • 2012-05-25
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-14
    • 2013-11-20
    • 2018-12-13
    • 2010-12-05
    相关资源
    最近更新 更多