2017-04-19 6 views
1

私は長い間コンピュータ科学を教えてきました。最もよく教える言語はC#、C++、Java、Pythonなどです。各学期にPerl、Rubyなどの他の言語の例を追加して、学生が言語間の共通点を理解できるようにします。私はCommon Lispで自分の手を試してきたが、40年ぶりに初めて言語で壁に打ちのめされたことを認めなければならない。ideone.comでCommon Lispを実行していますか?

Common Lispは、私がコンパイルして実行するための簡単なサンプルプログラムを手に入れて困っています。私はideone.com上で動作するようにコードが必要です。学生が自由に試してみて、何が起こるかを見るために変更を加えることができます。私はこれで得ることができるどんな助けにも大いに感謝します...一週間の闘いは私が取ることができるすべてについてです。ここで

は、コードは次のとおりです。

(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  

私は誰かがこれで私を助けることができると思います。

おかげ

博士

+0

あなたはINFOFUNをチェックする必要があります。a)印刷機能に引数許可されています。 b)単一のコロンが間違っているc)SETFを呼び出すと、2つの引数が必要です。あなたは1つしか提供しません。 –

+1

:あなたが問題を投稿した場合は、エラーメッセージも提供する必要があります。 –

+0

エラーは実行時に発生するため、エラーメッセージはありません。私は期待どおりの出力がありません。私は問題がinfofun関数にあると確信していますが、私はそれを働かせることができません... –

答えて

1

トン、あなたのコード内の誤字がありますintargの代わりinitargintformと同じことが。

このライン

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

中老のコロンを持っています。

setfのようなものは(setf (employee-pay p))のように、後で実行したように2つの引数を必要とします。(setf (employee-pay p) SOMETHING)

私はそれを実際のIDEで書くだけで見ることができます。

私はPortacleを入手することをお勧めします。これはポータブルでマルチプラットフォームのCommon Lisp開発環境で、ダウンロードと実行が簡単です。エラーメッセージでコードを試すことができます。 PortacleにはEmacs25、SBCL、Quicklisp、Slime、Gitが付属しています。

幸運を祈る!

+0

あなたが指摘したように私は訂正を行い、さらにいくつかの研究を行い、元のコードが正しく機能するようにしました。私はPortacleを取得し、定期的にLispで作業します。再度、感謝します。 –

-1

私は自分の質問に答えることを憎むが、ここに行く...

私がいないと自分自身を伝えるのにもかかわらず、最後の夜これに取り組んで数時間を過ごしました。あなたがプログラマーなら、あなたはそれがどのようなものか知っています。最後にライトが点灯し、クラスヘッダに「タイプ」がありますが、インタプリタがアドレスをバインドする場所がないことがわかりました。私はちょうど場所を追加しました。その後、私はインスタンスを作ることができました!私はクラス定義を単純化し、実行するまで「危険な」コードをすべて取り出しました。その後、私は振り返って行動を追加することに戻りました。

これは私が思い付いたものです。私はより良いバージョンで作業しています。

(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. 

おかげ 博士トン

+0

CLOSが実際にどのように動作するかを知るまで、 'slot-value'を使用しないでください。アクセサーとinitargsを使用してください。部分的な初期化は避けてください。これは解決策ではありません。実際の問題を理解して修正するのではなく、コードが「機能する」まで悪化させたばかりです。 – Svante

+0

@Svante私はエラーを修正するために私の元のコードを改造し、進歩を遂げました。ご意見ありがとうございます。 –

関連する問題