Я наткнулся на статью this, объясняющую комбинатор Y. Код находится в Scheme, но я пытаюсь работать с ним с помощью Common Lisp.Определение и использование функций в переменных в Common Lisp
Однако у меня возникли проблемы с переводом со Схемы на общий Лисп. Схема использует одно пространство имен для обеих функций и (другие) переменные, но Common Lisp использует разные пространства имен для функций и переменных. Как я могу решить эту разницу, чтобы получить рабочий код Common Lisp?
Схема Код
Вот некоторые схемы код из учебника.
В начале автор определяет функцию факториала:
(define (factorial n)
if (= n 0)
1
(* n (factorial (- n 1)))))
и переводит его в это:
(define factorial
(lambda (n)
(if (= n 0)
1
(* n (factorial (- n 1))))))
Потому что (по мнению автора), что то, что делает схему:
Схема просто переводит первое определение во второе , прежде чем оценивать его. Таким образом, все функции в схеме действительно являются выражениями лямбда .
Common Lisp
Я пытался переписать обе вышеуказанные фрагменты в Common Lisp имитировать этот переход от первой формы ко второй. Но в CL нет define
, и у него нет единого пространства имен. Поэтому я попытался обмануть его.
Переписывая первое определение Scheme в Common Lisp было легко:
(defun factorial (n)
(if (= n 0)
1
(* n (factorial (- n 1)))))
Но (для меня) перевод этого во второе определение было немного сложнее. Я перевел это так:
(setf (symbol-function 'factorial)
(lambda (n)
(if (= n 0)
1
(* n (factorial (- n 1))))))
Это плохой способ сделать это (или есть лучший способ)? Кажется, что это работает, но компилятор дает мне предупреждение о стиле: неопределенная функция: factorial.
Я просто научусь лучше вводить код сам, а не просто его читать. Возможно, в этом случае это не лучшая идея из-за различий между Scheme и Common Lisp. – Frank
Мне не нравятся реологические вопросы типа «почему вы пытаетесь это сделать», особенно не потому, что Фрэнк начинает свою мотивацию, лучше понимая Y-комбинатор. Бьюсь об заклад, вы не столкнулись с проблемой, чтобы найти статью, на которую он ссылается. С уважением, Альберт –