【问题标题】:scheme2lisp::define function and pass it as parameterscheme2lisp::define 函数并将其作为参数传递
【发布时间】:2011-02-25 07:44:17
【问题描述】:

我需要将一些代码从 Scheme 翻译成 Common Lisp。现在,我有这样的事情:

(defun sum (term a next b)
  (if (> a b)
    0
    (+ (term a) (sum term (next a) b))))

(defun sum-int (a b)
  (defun (ident x) x)
  (sum ident a 1+ b))

但它会产生错误。

*** - DEFUN: 函数名必须是符号,而不是 (IDENT X)

请帮帮我。 谢谢

更新 原代码:

(define (sum term a next b)
  (if (> a b)
    0
    (+ (term a) (sum term (next a) b))))

(define (sum-int a b)
  (defun (identity x) x)
  (define identity a 1+ b))

【问题讨论】:

  • 这有点乱...你能发布原始的Scheme代码吗?
  • 正如我所说,Scheme 看起来确实更干净:-/

标签: function functional-programming lisp scheme


【解决方案1】:

我想我明白了你要找的东西的要点......

(defun sum (term a next b)
  (if (> a b)
      0
      (+ (funcall term a) (sum term (funcall next a) next b))))

(defun ident (x) x)

(defun sum-int (a b)
  (sum #'ident a #'1+ b))

或更多 CLish,无需明确定义 ident:

(defun sum-int (a b)
  (sum (lambda (x) x) a #'1+ b))

您需要 #' 引用来获取函数对象,因为 CL 为函数(用 defun 定义)和变量提供了单独的命名空间。

【讨论】:

  • 还要注意 CL 有一个全局函数命名空间,所以原来的 ident-in-sumint 会在每次执行时引起警告——它会在每次运行 sum-int 时重新定义函数,所以我把它撕掉了超出总和。
  • 实际上,仅仅为了表明你能做到而去定义 ident 是没有意义的。我会用更 CLish 的方式重写它......只是一点点......
  • 我越来越怀疑这对于 Schemer 来说会显得非常混乱,函数调用和 #' 引用会怎样:-(
  • 所有这些只是练习-不是真正的程序)
【解决方案2】:
(defun sum (term a next b)
  (if (> a b)
      0
      (+ (funcall term a) (sum term (funcall next a) next b))))

(defun sum-int (a b)
  (flet ((ident (x) x))
   (sum #'ident a #'1+ b)))

FLET 的另一个 CL(未经测试)。

【讨论】:

  • Common Lisp 已经有identity,你不需要定义它。
  • 我正在重写给出的示例。问题是关于定义函数,因此是关于 FLET 的示例,而不是标识函数。
猜你喜欢
  • 2021-04-13
  • 1970-01-01
  • 2021-04-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-22
相关资源
最近更新 更多