2016-04-20 21 views
0

Wenn ich diese Funktion verwenden, um ein Array zu erstellen, bekomme ich folgende Fehlermeldung:LISP Erstellen eines Arrays

> (defun f1(lst) 
    (setf m (make-array '((length lst) 3)))) 
F1 
> (f1 '(1 2 3)) 
Error: Not a nonnegative integer - (LENGTH LST)  

Die Länge der Liste sollte eine nicht negative ganze Zahl, 3 in diesem Fall sein, also warum ich bin diesen Fehler bekommen und was kann ich stattdessen tun?

> (length '(1 2 3)) 
3 

Antwort

4

Sie sind unter Angabe der Liste ((length lst) 3))), so dass ihr Wert ((LENGTH LST) 3))) ist, in dem das erste Element keine Zahl, sondern eine zwei Symbolliste.

Verwenden statt list eine neue Liste, in der das erste Argument ausgewertet zu bauen:

CL-USER> (defun f1(lst) 
      (setf m (make-array (list (length lst) 3)))) 
F1 
CL-USER> (f1 '(1 2 3)) 
#2A((0 0 0) (0 0 0) (0 0 0)) 

In Lisp Sprachen '((A) 3) ist eine Abkürzung für (QUOTE ((A) 3)), die ((A) 3) ausgewertet wird. Andererseits wird (list (A) 3) regelmäßig ausgewertet, wobei (A) für den Aufruf der Funktion A ausgewertet wird und am Ende die Liste (value-of-calling-a 3) erzeugt wird.

Verwandte Themen