2017-02-04 17 views
0

Первое определение функции в 1974 издании Малой Lisper выглядит следующим образом:, как это функция, определенная в LISP диалекта в маленьком Lisper 1974 издание

(ISLAT (LAMBDA (L) 
    (COND 
    ((NULL L) T) 
    ((ATOM (CAR L))(ISLAT (CDR L))) 
    (T F) 
       ) )) 

Это не выглядит как правильная функция и он не будет работать, как в SBCL 1.3.14. Он генерирует две ошибки: неопределенной функции: ISLAT Неопределенных переменное: F

На самом деле T также не определен, хотя Фридман использует его как предикат истинности в большинстве примеров функций. Насколько я могу судить, в этом определении в sbcl действуют только LAMBDA, COND, NULL, ATOM, CAR, CDR.

Является ли это определение некоторой функциональной спецификацией, характерной для лизгов эпохи 1974 года, или Фридман просто не учитывал (определял) или (дефинировал) свои определения?

ответ

2

Если вы посмотрите на более старых определений Lisp, как в Лиспе 1.5, они могут иметь источник выглядеть примерно

DEFINE ((
(ISLAT (LAMBDA (L) 
(COND 
((NULL L) T) 
((ATOM (CAR L))(ISLAT (CDR L))) 
(T F)))) 
)) 

ISLAT это имя функции. DEFINE - это псевдофункция и позволяет определять одну или несколько функций.

Лиспа 1.5 Руководство состоит этот пример

DEFINE ((
(MEMBER (LAMBDA (A X) (COND ((NULL X) F) 
    ((EQ A (CAR X)) T) (T (MEMBER A (CDR X)))))) 
(UNION (LAMBDA (X Y) (COND ((NULL X) Y) ((MEMBER 
    (CAR X) Y) (UNION (CDR X) Y)) (T (CONS (CAR X) 
    (UNION (CDR X) Y)))))) 
(INTERSECTION (LAMBDA (X Y) (COND ((NULL X) NIL) 
    ((MEMBER (CAR X) Y) (CONS (CAR X) (INTERSECTION 
    (CDR X) Y))) (T (INTERSECTION (CDR X) Y))))) 
)) 

, где DEFINE определяет три функции MEMBER, UNION и INTERSECTION.

Как с этим бороться?

  • Если у вас есть исходный код, вы можете написать простой внешний интерфейс таким образом, что DEFINE (...) анализируется, и переведенный.

  • Если вы переведёте код Lisp 1.5 в Common Lisp вручную, вам необходимо заменить DEFINE на или более DEFUN.

Что-то вроде

DEFINE ((
(ISLAT (LAMBDA (L) 
(COND 
((NULL L) T) 
((ATOM (CAR L))(ISLAT (CDR L))) 
(T F)))) 
)) 

является

(DEFUN ISLAT (L) 
    (COND 
    ((NULL L) T) 
    ((ATOM (CAR L))(ISLAT (CDR L))) 
    (T F)))