代码之家  ›  专栏  ›  技术社区  ›  Stan Kurilin

scheme2lisp::定义函数并将其作为参数传递

  •  1
  • Stan Kurilin  · 技术社区  · 14 年前

    我需要将一些代码从Scheme转换为CommonLisp。现在,我有这样的东西:

    (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)

    请帮助我。 谢谢

    UPD 原代码:

    (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))
    
    2 回复  |  直到 14 年前
        1
  •  1
  •   Will Hartung    14 年前
    (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)))
    

    只需另一个带跳蚤的CL(未经测试)。

        2
  •  1
  •   ivans    14 年前

    我想我知道你在找什么了…

    (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))
    

    或者更多的陈词滥调,没有明确的定义:

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

    您需要引号才能获取函数对象,因为cl有单独的函数(用defun定义)和变量命名空间。