2016-04-29 7 views
0

Ich versuche, ein Zeichen basierend auf einer bedingten Anweisung auszudrucken.Zeichen werden mehr als zweimal gedruckt (Common Lisp)

(defvar enctext) 

    (defun encrypt(enctext) 
    (if (eq 'A (first enctext)) 
     (princ 'H))) 

Und hier ist, was ich habe die Funktion zum Ausführen der Zeichen ‚H‘ druckt zweimal

(load "lisptest.lisp") 
;; Loading file lisptest.lisp ... 
** - Continuable Error 
DEFUN/DEFMACRO(ENCRYPT): #<PACKAGE POSIX> is locked 
If you continue (by typing 'continue'): Ignore the lock and proceed 
The following restarts are also available: 
SKIP   :R1  skip (DEFUN ENCRYPT # ...) 
RETRY   :R2  retry (DEFUN ENCRYPT # ...) 
STOP   :R3  stop loading file   /home/students/cante008/cs351/lisptest.lisp 
ABORT   :R4  Abort main loop 
Break 1 [2]> continue 
WARNING: DEFUN/DEFMACRO: redefining function ENCRYPT in 
    /home/students/cante008/cs351/lisptest.lisp, was defined in C 
;; Loaded file lisptest.lisp 
T 
[3]> (setf x '(A)) 
(A) 
[4]> (encrypt x) 
H 
H 

ganz am Ende, und ich bin nicht sicher, warum das so ist.

Dies ist mein erster Schritt, um eine Caesar-Chiffre tun

Antwort

0

Sie verwenden eine REPL, so dass der Wert jedes Ausdrucks wird gedruckt.

Der Wert von (encrypt x) endet (in diesem Fall) ist der Wert (princ 'H), der H ist.

Zusätzlich, (princ 'H) Drucke H.

Dies ist der gleiche Grund, dass Sie (A) sehen (setf x '(A)) nach Auswertung

2

[..] ein Zeichen [..]

Wenn Sie Dinge schreiben wie 'A oder 'H bist du nicht Umgang mit Zeichen, aber Symbole. Zeichen werden wie folgt geschrieben: #\A oder #\Space. Um Zeichen für Gleichheit zu vergleichen, verwenden Sie char=.

[..] druckt zweimal [..]

Die meisten Funktionen in Lisp Rückkehr (mindestens) einen Wert. Wenn Sie eine Funktion auf der REPL aufrufen (read-evaluate-print-loop), dann wird - wie das "P" in "REPL" andeutet - der Rückgabewert (s) des Aufrufs dieser Funktion ausgegeben. Der Rückgabewert Ihrer Funktion ist entweder NIL (wenn die if nicht genommen wird) oder was auch immer princ zurückgibt. Mit Blick auf the HyperSpec sagt uns:

princ object &optional output-stream =>object

Dies ist gelesen werden als princ einen erforderlichen Parameter nimmt (ein Objekt zu drucken) und einen optionalen Parameter (der Strom zu drucken) und gibt ein Objekt zurück, das (obwohl ich es nicht explizit finden konnte) dasselbe Objekt war, das an es übergeben wurde.

So ist die erste H von der princ, die zweite von der REPL, die automatisch den Rückgabewert druckt.

Als letzte Bemerkung: Ihre Verwendung von defvar zeigt wahrscheinlich ein Missverständnis der Variablen in Common Lisp: defvar deklariert das (ungefähre Äquivalent) zu dem, was Sie vielleicht als "globale" Variablen aus anderen Sprachen wissen. Sie brauchen es nicht für Funktionsargumente oder für die Übergabe von Parametern.

+0

Nitpicking: Sie könnten mit '(values)' null Wert zurückgeben, obwohl es keinen großen Unterschied macht. – coredump

+0

@coredump Danke. Ich wusste fast, dass ich falsch lag, als ich das schrieb, konnte aber nicht ganz an '(Werte)' denken: D –

+0

Obwohl in den meisten Kontexten das Ergebnis von '(values)' nicht von 'nil' zu unterscheiden ist. – Vatine

2

Sie haben es nicht wirklich getestet.

CL-USER 3 > (defun test() 
       (encrypt '(a)) 
       (encrypt '(a)) 
       (encrypt '(a)) 
       'lalala) 
TEST 

CL-USER 4 > (test) 
HHH 
LALALA 

CL-USER 5 > (defun test1() 
       (test) 
       (test) 
       (test) 
       'mmmmmm) 
TEST1 

CL-USER 6 > (test1) 
HHHHHHHHH 
MMMMMM