sche2lisp :: define функцию и передать ее в качестве параметра - PullRequest
1 голос
/ 29 мая 2010

Мне нужно перевести некоторый код из 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: имя функции должно быть символом, а не (ИДЕНТ. 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 ]

1 голос
/ 29 мая 2010
(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 с FLET (не проверено).

1 голос
/ 29 мая 2010

Мне кажется, я понял суть того, что вы искали ...

(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, без явной очистки идентификатора:

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

Вам нужно # 'заключать в кавычки, чтобы получить объект функции, поскольку CL имеет отдельные пространства имен для функций (определенных с помощью defun) и переменных.

...