2016-04-12 6 views
-2

ich mache eine Einfügeliste Funktion. Schaut es, wie:geläufig Lisp. cond in defun

(defun INSERT1 (x y) 
(setq temp (list x y)) 
(setq k (sort temp #'< :key #'car))) 

(defun INSERT2 (x y) 
(setq temp (cons x y)) 
(setq k (sort temp #'< :key #'car))) 

und ich muss diese beiden Funktion kombinieren. Die erste Einfügefunktion funktioniert, wenn in 'k' nichts ist. und die zweite Einfügezellenfunktion arbeitet, wenn Elemente in 'k' vorhanden sind.

ich dachte, ich brauche 'cond' zu verwenden, und ich dachte, 'cond' ist

(cond ((true/false)if true execute here and return) 
     ((true/false)if true execute here and return) 
     ...... 
     ((true/false)if true execute here and return)) 

so ich dies gemacht:

(defun INSERT1 (x y) 
(setq temp (list x y)) 
(setq k (sort temp #'< :key #'car))) 

(defun INSERT2 (x y) 
(setq temp (cons x y)) 
(setq k (sort temp #'< :key #'car))) 

(defun INSERTCELL (x y) 
(setq temp nil) 
(cond 
((eq (car temp) nil) (INSERT1 (x y)) 
(t (INSERT2 (x y)))))) 

und Fehler:

*** - EVAL: undefined function X 

wie kann ich 'cond' bei diesem problem ohne fehler verwenden ...

Bitte bringen Sie mir den richtigen Code bei.

+0

'(INSERT1 (x y))' sollte '(INSERT1 x y)' sein, andernfalls wird 'x' als eine Funktion interpretiert, die auf' y' angewendet wird. – Renzo

+0

oh .. danke Renzo. es funktioniert jetzt. – Hoon

Antwort

0

In Common Lisp (und anderen lisps im Allgemeinen), (foo ...) immer eines bedeuten:

  • Rufen Sie die Funktion FOO
  • das Makro FOO
  • etwas mit den speziellen Operator FOO erweiterten

Wenn Sie an eine nicht-Lisp-Programmiersprache gewöhnt sind, schreiben Sie normalerweise foo(...)(foo ...).