Это общий пример кода, который я программирую:
(defun test (a b)
(loop for x in '(a b) collect
((setf a (+ a b))
(loop for y in '(a b)
(setf a (+ a b))
(loop for z in '(a b)
(setf a (+ a b))))
(list a b))))
Когда я вызываю функцию (тест) в REPL, это дает мне «недопустимый вызов функции», как вы можете видеть ниже:
> (test 1 1)
debugger invoked on a SB-INT:COMPILED-PROGRAM-ERROR in thread
#<THREAD "main thread" RUNNING {10005E85B3}>:
Execution of a form compiled with errors.
Form:
((SETF A (+ A B))
(LOOP FOR Y IN '(A B) (SETF A (+ A B)) (LOOP FOR Z IN '(A B) (SETF A
(+ A
B))))
(LIST A B))
Compile-time error:
illegal function call
Type HELP for debugger help, or (SB-EXT:EXIT) to exit from SBCL.
restarts (invokable by number or by possibly-abbreviated name):
0: [ABORT] Exit debugger, returning to top level.
(FRED5 #<unused argument> #<unused argument>)
source: ((SETF A (+ A B))
(LOOP FOR Y IN '(A B) (SETF A (+ A B)) (LOOP FOR Z IN '(A B) (SETF A
(+
A
B))))
(LIST A B))
0] 0
>
Кажется, я что-то не так с первыми (цикл для) параметров, но я не могу выяснить, что. Кто-нибудь может помочь с этим, пожалуйста? Спасибо!
РЕДАКТИРОВАТЬ 1:
Итак, я внес коррективы @Rainer Joswig и @Xero Smith предложили:
(defun test (a b)
(loop for x in '(a b) collect
(setf a (+ x 1))
(loop for y in '(a b) do
(setf a (+ y 1))
(loop for z in '(a b) do
(setf a (+ z 1))))
(list a b)))
НоТеперь я получаю следующую ошибку:
> (test 1 1)
debugger invoked on a SB-INT:COMPILED-PROGRAM-ERROR in thread
#<THREAD "main thread" RUNNING {10005E85B3}>:
Execution of a form compiled with errors.
Form:
(LOOP FOR X IN '(A B)
COLLECT (SETF A (+ X 1)) (LOOP FOR Y IN '(A B)
DO (SETF A (+ Y 1)) (LOOP FOR Z IN '(A B)
DO (SETF A
(+ Z
1)))) (LIST
A
B))
Compile-time error:
during macroexpansion of (LOOP FOR X ...). Use *BREAK-ON-SIGNALS* to intercept.
(LOOP FOR Y IN '(A B)
DO (SETF A (+ Y 1)) (LOOP FOR Z IN '(A B)
DO (SETF A
(+ Z
1)))) found where a LOOP keyword or LOOP type keyword expected
current LOOP context: COLLECT (SETF A (+ X 1)) (LOOP FOR Y IN '(A B)
DO (SETF A
(+ Y
1)) (LOOP FOR Z IN '(A
B)
DO (SETF A
(+
Z
1)))).
Type HELP for debugger help, or (SB-EXT:EXIT) to exit from SBCL.