2017-04-19 2 views
1

Ich unterrichte seit langem Informatik. Die am häufigsten gelehrten Sprachen sind C#, C++, Java, Python usw. Ich füge jedes Semester Beispiele aus anderen Sprachen wie Perl, Ruby usw. hinzu, so dass die Schüler die Gemeinsamkeiten zwischen den Sprachen sehen können. Ich habe mich bei Common Lisp versucht und muss zugeben, dass ich zum ersten Mal seit fast 40 Jahren mit einer Sprache an die Wand gegangen bin.Läuft Common Lisp auf ideone.com?

Common Lisp hat mich mit einem einfachen Beispielprogramm zum Kompilieren und Ausführen ratlos. Ich brauche den Code, um auf ideone.com zu laufen, so dass die Schüler es selbst ausprobieren und Änderungen vornehmen können, um zu sehen, was passiert. Ich würde jede Hilfe sehr schätzen, die ich mit diesem ... bekommen kann. Eine ganze Woche des Kampfes ist über alles, was ich nehmen kann. Hier

ist der Code:

(defclass employee() ;;class definition header 
    ((empid :accessor employee-empid;;member variable accessible and preset 
     :initform 230 
     :initarg :empid) 
     (name :accessor employee-name;;member variable accessible and preset 
     :intform 'bill 
     :intarg :name) 
     (pay :accessor employee-pay;;member variable accessible and preset 
     :initform 10 
     :initarg :pay))) 

(defmethod infofun ((p employee));;member method to allow two member vars to be changed 
    (print "The Worker: " : (employee-name p)) 
    (setf (employee-pay p)) 
    (setf (employee-empid p))) 

(setq w1(make-instance 'employee :empid 100 :name 'worker1 :pay 47));;instance of class for w1 
(setq w2(make-instance 'employee :empid 102 :name 'worker1 :pay 57));;instance of class for w2 
(setq w3(make-instance 'employee :empid 103 :name 'worker1 :pay 67));;instance of class for w3 

(describe w1);;get general info from List about the instance w1 
(describe w2) 
(describe w3) 

(infofun w1);;run the member function, change the member vars 
(infofun w2) 
(infofun w3) 

(setf (employee-pay w1) 147);;change a member var by code 


(describe w1);;look at w1 again and note the values 
(infofun w1);;change w1 again 
(describe w1);;look at w1 one more time and check the new values  

Ich hoffe, dass jemand mir dabei helfen kann.

dank

Dr t

+0

Sie benötigen würde INFOFUN zu überprüfen: a) was die Druckfunktion erlaubt Argumente. b) ein einzelner Doppelpunkt ist definitiv falsch c) Wenn Sie SETF aufrufen, erwartet er zwei Argumente. Sie stellen nur einen zur Verfügung. –

+1

auch: Wenn Sie ein Problem posten, sollten Sie auch die Fehlermeldungen angeben. –

+0

Da der Fehler zur Laufzeit auftritt, gibt es keine Fehlermeldungen. Nur keine Ausgabe wie ich es erwarte.Ich bin überzeugt worden, dass das Problem in der infofun Funktion ist, aber ich kann es nicht zur Arbeit bringen ... –

Antwort

1

Es gibt Tippfehler in Ihrem Code: intarg statt initarg, das gleiche mit intform.

Diese Linie

(print "The Worker: " : (employee-name p)) 

hat einen Doppelpunkt sich in der Mitte.

Einige setf wie (setf (employee-pay p)) erfordern zwei Argumente, wie Sie später taten: (setf (employee-pay p) SOMETHING).

Ich kann das einfach sehen, indem Sie in eine echte IDE schreiben.

Ich schlage vor, Sie erhalten Portacle, es ist eine portable und Multiplattform Common Lisp dev-Umgebung, die einfach zu installieren ist: herunterladen und ausführen. Sie können Ihren Code mit Fehlermeldungen testen. Portacle liefert Emacs25, SBCL, Quicklisp, Slime und Git.

Viel Glück!

+0

Ich habe Korrekturen vorgenommen, als Sie darauf hinwiesen und weitere Nachforschungen angestellt haben und den ursprünglichen Code richtig funktionierten. Ich werde Portacle bekommen und regelmäßig an meinem Lisp arbeiten. Danke noch einmal. –

-1

Ich hasse meine eigene Frage zu beantworten, aber hier geht ...

Ich habe auf dieser letzten Nacht trotz mir nicht zu sagen, mehrere Stunden zu arbeiten. Wenn Sie ein Programmierer sind, dann wissen Sie, wie das ist. Schließlich gingen die Lichter an und ich erkannte, dass mein Klassenheader einen "Typ" hatte, aber keinen Platz für den Interpreter, um eine Adresse zu binden. Ich habe gerade einen Platz hinzugefügt. dann konnte ich Instanzen machen! Ich habe auch die Klassendefinition vereinfacht und den gesamten "riskanten" Code entfernt, bis er ausgeführt wurde. dann ging ich zurück zum Hinzufügen von Verhaltensweisen zurück.

Hier ist, was ich gefunden habe. Ich arbeite an einer besseren Version.

(defclass employee-worker() 
    (person-name empid));;extremely simple common lisp class definition 

(defparameter *worker*(make-instance 'employee-worker));;constructor call for the first instance 
(setf (slot-value *worker* 'person-name) "Joe Brown") 
(setf (slot-value *worker* 'empid) "234") 

(defparameter *worker2*(make-instance 'employee-worker));;constructor call for the second instance 
(setf (slot-value *worker2* 'person-name) "John Brown") 
(setf (slot-value *worker2* 'empid) "235") 

(print "The first worker is: ") 
(print (slot-value *worker* 'person-name)) 
(print "And his employee ID number is: ") 
(print (slot-value *worker* 'empid)) 
(print "") 
(print"The second worker is: ") 
(print (slot-value *worker2* 'person-name)) 
(print "And his employee ID number is: ") 
(print (slot-value *worker2* 'empid)) 

(setf (slot-value *worker* 'person-name) "Joe Green");;change the slot values for the first worker 
(setf (slot-value *worker* 'empid) "432") 

(print "The first worker is: ");;look at the first worker again to see the changes 
(print (slot-value *worker* 'person-name)) 
(print "And his employee ID number is: ") 
(print (slot-value *worker* 'empid)) 

Success time: 0 memory: 38056 signal:0 

"The first worker is: " 
"Joe Brown" 
"And his employee ID number is: " 
"234" 
"" 
"The second worker is: " 
"John Brown" 
"And his employee ID number is: " 
"235" 
"The first worker is: " 
"Joe Green" 
"And his employee ID number is: " 
"432" 

I appreciate everyone helping. 

Dank Dr t

+0

Verwenden Sie nicht den Slot-Wert, bis Sie wissen, wie CLOS wirklich funktioniert. Verwenden Sie Accessoren und Initargs. Vermeiden Sie partielle Initialisierungen. Dies ist keine Lösung. Sie haben den Code einfach schlechter gemacht, bis er "funktioniert", anstatt die eigentlichen Probleme zu verstehen und zu beheben. – Svante

+0

@Svante Ich bearbeite meinen ursprünglichen Code, um Fehler zu beheben und habe Fortschritte gemacht. Danke für Ihre Kommentare und Hilfe. –