2017-02-14 8 views
0
(defun test(n x) 
    (let* (d (append (list n) x))) 
    (if (= n 0) d 
     (test (- n 1) d))) 

Так что это базовая тестовая функция, которую я пишу в lisp. Предполагается, что функция принимает число (n) и список (x) in и добавляет каждое число между n и 0 в список, который возвращается. Однако, когда я запускаю его, например,Как сохранить append return в переменной Lisp?

(test 4 NIL) 

это говорит

плохо связыванию форма: (APPEND (LIST N) X)

В основном мой вопрос, как вы храните обратный вызов от Append в переменной Lisp?

ответ

3

Вы не указали круглые скобки вокруг привязок, и ваш код не находится в теле let*, но снаружи делает d специальной глобальной переменной. Вы должны получить предупреждение об этом. Поскольку вы используете только одну привязку, использование let* вместо let не нужно.

(defun test (n x) 
    (let ((d (append (list n) x))) 
    (if (= n 0) 
     d 
     (test (- n 1) d)))) 

Обратите внимание, что поскольку вы добавляете элементы в начало списка НУ должны использовать cons вместо append + list так:

(defun test (n x) 
    (let ((d (cons n x))) 
    (if (= n 0) 
     d 
     (test (- n 1) d)))) 

Я также заметил, что если ваш базовый случай идет на один шаг дополнительно вам не требуется привязка:

(defun make-range (to &optional (acc '())) 
    "Makes a list of the elements from 0 to to" 
    (if (< to 0) 
     acc 
     (make-range (- to 1) (cons to acc))))) 

(make-range 5) 
; ==> (0 1 2 3 4 5) 
+1

Переименуйте функцию также в рекурсивном вызове. – Svante

 Смежные вопросы

  • Нет связанных вопросов^_^