[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 1001- 2chのread.cgiへ]
Update time : 05/09 23:20 / Filesize : 244 KB / Number-of Response : 1002
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

【入門】CommonLisp【質問よろず】



1 名前:デフォルトの名無しさん mailto:sage [04/11/25 21:48:56]
lispを触ってみたい入門者のQ&A
初心者のQ&A
本スレでは恥ずかしくて聞けない人のQ&A
本スレは高度すぎて割り込めない人のQ&A
linuxでなくてwindowsでやりたいんですが・・・Q&A
lispを使用してC#やJAVAの代替にするための方法(おまけ)

ま、ゆっくりたりましょう。

「いいものの本質は、いかなる時代においても変わらない」byパワーズ

654 名前:デフォルトの名無しさん mailto:sage [2005/10/09(日) 21:23:19 ]
再帰しないんだから二回目もクソもないんだよ。
if の説明を確認しろっていわれてんだから素直にそうしな。

655 名前:& ◆QWv3R1XL8M [2005/10/09(日) 21:31:58 ]
なるほど、わかりました。ありがとうございました。
で、

(defun test (lis &aux (a (first lis)) (b (rest lis)))
 (cond ((not (null b))
    (print b)
    (test b))))

↑これ実行できないんですけどこれは何故?

656 名前:デフォルトの名無しさん mailto:sage [2005/10/09(日) 21:39:12 ]
全角空白までコピペしちゃっているからだろう.
大した手間でもないだろうから手で入力したまえ.

657 名前:おしえて厨 [2005/10/10(月) 19:51:08 ]
lispのsort関数を使わないで、
オリジナルの数字リストの昇順または降順ソートプログラムを
書いてみてください。
できれば初心者でもアルゴリズムが分かりやすいような書き方でおながい

658 名前:デフォルトの名無しさん mailto:sage [2005/10/10(月) 20:35:14 ]
>>657
やだ

659 名前:デフォルトの名無しさん [2005/10/10(月) 20:50:39 ]
xのy乗を求める問題なんだけど、どこか変なところある?
include <stdio.h>
#include <math.h>


main()
{
double x,y,z;

printf("x =");
scanf("%lf",&x);
printf("y =");
scanf("%lf",&y);

z = pow(x ,y);
printf("x\ty = %lf", z);
}


660 名前:デフォルトの名無しさん mailto:sage [2005/10/10(月) 20:52:12 ]
頭が変かもしれんな

661 名前:デフォルトの名無しさん mailto:sage [2005/10/10(月) 21:05:09 ]
書き込むスレの選択が変

662 名前:デフォルトの名無しさん mailto:sage [2005/10/11(火) 04:45:21 ]
>>620
面白い物見つけた。

ttp://www.geocities.jp/shido_takafumi/lisp/macro3.html

Socket 経由で GUI を作ってるっぽいけど、Windows Native でも
似た様なのがあるんじゃないかな。Mac だとこういうのがある。

www.bluem.net/downloads/pashua_en/



663 名前:おしえて厨 [2005/10/11(火) 08:49:23 ]
(defun small (lis)
(cond ((null (rest lis))
lis)
((< (first lis) (first (rest lis)))
(remove (first lis) lis)
(remove (first (rest lis)))
(cons (first lis) lis)
(cons (first (rest lis) lis))
(small lis)
(t (small (rest lis))))))

↑バブルソートしたくて書いてみた。駄目だった。どこが駄目?

664 名前:デフォルトの名無しさん mailto:sage [2005/10/11(火) 09:41:52 ]
バブルソートを使うところが駄目。

665 名前:デフォルトの名無しさん mailto:sage [2005/10/11(火) 10:13:57 ]
(defun merge-sort (lst)
(let ((len (length lst)))
(cond ((< len 2) lst)
((= len 2)
(let ((x (car lst))
(y (cadr lst)))
(if (< x y) (list x y) (list y x))))
(t
(do ((x (merge-sort (butlast lst (ash len -1))))
(y (merge-sort (last lst (ash len -1))))
(r '()))
((or (null x) (null y))
(nconc (nreverse r) x y))
(push (if (< (car x) (car y)) (pop x) (pop y)) r))))))

666 名前:おしえて厨 [2005/10/11(火) 17:25:50 ]
(remove 'a 'a)みたいに一文字だとremoveできないじゃん。
どうやって一文字しかないのを消すの?
あと、(a b c (a ((b))))みたいになってるときのbだけを消して、
(a b c (a (( ))))みたいにする方法って、あるの?

667 名前:デフォルトの名無しさん mailto:sage [2005/10/11(火) 18:03:53 ]
((lambda (x y)
((lambda (f) (funcall f f y))
(lambda (f y) (typecase y
(list (remove x (mapcar (lambda (y) (funcall f f y)) y)))
(t y)))))
'b '(a b c (a ((b)))))
=> (A C (A (NIL)))

668 名前:おしえて厨 [2005/10/11(火) 19:06:51 ]
関数が定義されていません: typecase

669 名前:デフォルトの名無しさん mailto:sage [2005/10/11(火) 19:36:09 ]
そりゃ Common Lisp じゃないな。スレ違いだからもうこのスレに来ないように。

670 名前:デフォルトの名無しさん mailto:sage [2005/10/11(火) 19:37:20 ]
>>668
処理系がまがい物だな

671 名前:デフォルトの名無しさん mailto:sage [2005/10/11(火) 20:10:17 ]
xyzzy だな

672 名前:おしえて厨 [2005/10/11(火) 20:43:06 ]
xyzzyなんだけど、typecaseつかわずにできないの???



673 名前:デフォルトの名無しさん mailto:sage [2005/10/11(火) 21:12:30 ]
>>672
xyzzy使いのよしみで回答しておくけど、
CommonLisp を勉強するのに xyzzy を処理系として使っちゃダメ。
xyzzy でマクロを書くための勉強ならここで質問するのは間違い。

((lambda (x y)
((lambda (f) (funcall f f y))
(lambda (f y) (if (listp y)
(remove x (mapcar (lambda (y) (funcall f f y)) y))
y))))
'b '(a b c (a ((b)))))
=>(a c (a (nil)))

674 名前:おしえて厨 [2005/10/11(火) 21:57:05 ]
(defun del-atom (n lis)
(cond ((null lis)
nil)
((atom (first lis))
(cond ((eql n (first lis))
(del-atom n (rest lis)))
(t (cons (first lis) (del-atom n (rest lis))))))
((listp (first lis))
(cond ((listp (first (first (first lis))))
(cond ((eql n (first (first (first lis)))))
(del-atom n (rest lis)))
(t (cons (first lis) (del-atom n (rest lis))))))
(cond ((listp n (first (first lis)))
(cond ((eql n (first (first lis)))
(del-atom n (rest lis))))
(t (cons (first lis) (del-atom n (rest lis)))))))))



↑自分でもやってみようとしたら、こんなんなっちゃったよ〜〜〜〜
どこが駄目???

675 名前:デフォルトの名無しさん mailto:sage [2005/10/12(水) 00:50:11 ]
((listp (first lis))
(cons (del-atom n (first lis)) (del-atom n (rest lis))))

676 名前:デフォルトの名無しさん mailto:sage [2005/10/12(水) 00:51:18 ]
first とか rest って使われてるんだなぁとそちらのほうに感動してたりする俺。

677 名前:デフォルトの名無しさん mailto:sage [2005/10/12(水) 17:12:58 ]
>>676
それはね、「xyzzy Lisp Programming」のページで、first と rest を推奨す
る、と書かれているからだよ。
www.geocities.jp/m_hiroi/xyzzy_lisp/abclisp02.html


678 名前:デフォルトの名無しさん mailto:sage [2005/10/12(水) 17:23:12 ]
>>677
「first と rest を使うことが推奨されています」なんて書いてるが、「誰が」推奨
しているのか不明だな。少なくとも CLtL2 にも ANSI にもそんな記述は見あた
らないが。(もし見落としてたら教えてくれ)

679 名前:おしえて厨 [2005/10/12(水) 17:33:11 ]
P.H.ウィンストンという人が書いた緑の本に推奨されていた。
まあそれはさておき675さんの指摘がよくわかりません。
どこを直せばいいの??

680 名前:デフォルトの名無しさん mailto:sage [2005/10/12(水) 18:08:58 ]
>>679
> どこを直せばいいの??
頭の中身。
お前さんは九九も覚えてないのに数学の問題を見てわからないとわめいてるの
と同じなので、677 が紹介してるサイトの Common Lisp 入門を全部読んで
理解してからもう一度いらっしゃい。

681 名前:デフォルトの名無しさん mailto:sage [2005/10/14(金) 03:51:47 ]
ウィンストンって培風館の奴か?

car,cdrの方が好き
ハード寄りで

682 名前:デフォルトの名無しさん mailto:sage [2005/10/14(金) 11:14:21 ]
>>681
いつの時代の方ですか?



683 名前:デフォルトの名無しさん mailto:sage [2005/10/14(金) 12:23:03 ]
平成17年

684 名前:デフォルトの名無しさん mailto:sage [2005/10/14(金) 12:27:20 ]
漏れも car cdr のほうが好きだが、さすがに IBM 7090 (だっけか)は使ったことない。

685 名前:デフォルトの名無しさん mailto:sage [2005/10/14(金) 14:01:44 ]
8月からLisp触り始めた超初心者だけど
car、cdrのほうが好きだな。

686 名前:デフォルトの名無しさん mailto:sage [2005/10/14(金) 17:17:44 ]
>>679,681
俺もその本持ってる。そのせいか first、rest 派。
自分では使わないから、car や cdr ならともかく caddr ぐらいでもわけわからん。

687 名前:デフォルトの名無しさん mailto:sage [2005/10/14(金) 17:23:31 ]
>>686
caddr と third とどっちがわかりやすいかだわな。
個人的には視覚的にわかる caddr のほうが好き。

688 名前:デフォルトの名無しさん mailto:sage [2005/10/14(金) 22:48:16 ]
nthは邪道ですか、そうですか

いや、俺も使わないけど

689 名前:デフォルトの名無しさん mailto:sage [2005/10/15(土) 14:56:32 ]
(nth 3 L) ≡ (fourth L) なのがなんとも

690 名前:デフォルトの名無しさん mailto:sage [2005/10/15(土) 15:05:25 ]
>>689
nth は aref とともに elt の特別版ということだな。
むしろ、この3つの中で nth だけ引数順が違うのが気になる。

691 名前:デフォルトの名無しさん mailto:sage [2005/10/16(日) 18:18:47 ]
ルプラカ ルプラクドゥ
パンプルピンプルパムポップン
カッドゥルゥァー
クックドゥー

692 名前:デフォルトの名無しさん mailto:sage [2005/10/18(火) 22:37:29 ]
オブラディ オブラダ
(・∀・)スンスンスーン



693 名前:デフォルトの名無しさん [2005/10/19(水) 19:16:22 ]
;;ある基点となるフォルダより下のフォルダのフルパスを全て取得するには再帰でどう書けばいいですか?

694 名前:デフォルトの名無しさん mailto:sage [2005/10/19(水) 20:40:03 ]
実装依存

695 名前:デフォルトの名無しさん [2005/10/19(水) 20:42:51 ]
xyzzyでは??

696 名前:デフォルトの名無しさん mailto:sage [2005/10/19(水) 20:45:20 ]
板違い

697 名前:デフォルトの名無しさん mailto:sage [2005/10/19(水) 20:55:26 ]
(directory PATHNAME) あたりで調べると良いかも。

698 名前:デフォルトの名無しさん mailto:sage [2005/10/21(金) 00:53:04 ]
ECL使って実現されているプロジェクトでそこそこの規模のやつって誰か知りません?
C/C++とCommon Lispを混ぜた開発したいんだけども、実際の使われ方を見て勉強した方が
理解が早いかなと思って。
それともUFFI使うのが定説ですかね。

699 名前:デフォルトの名無しさん mailto:sage [2005/10/21(金) 01:37:09 ]
どうなんだろう.最近は CFFI とかも出てきてるしねぇ.
まず Lisp 側のインターフェースを決めて,それが十分に抽象化できていれば
その下は UFFI だろうが処理系の FFI だろうがたぶん問題ない.

ECL はあんまり触ったことないので本題には答えられない.スマソ.
キーワードハイライトつきのエディタ作ったとか Planet Lisp に出てたような.

700 名前:698 mailto:sage [2005/10/21(金) 01:58:32 ]
>> 699
ありがと。Planet Lisp行ってきます。
スレ違いって怒られるかも知れないけど、Gaucheとかだと結構事情が違ったりする?
確か開発目標に他の言語と仲良くするってのがあったような。でも最終的には
ネイティブコードで走らせたいんだよなぁ・・・

701 名前:デフォルトの名無しさん mailto:sage [2005/10/21(金) 02:08:50 ]
ネイティブコードってことは性能が欲しいの?
それでフリーなのがいいならCMUCLやSBCLがいいんじゃないかな。
Cの呼び出しやCからのコールバックもそれほど面倒じゃないし。

702 名前:698 mailto:sage [2005/10/21(金) 02:45:04 ]
Planet Lisp行ってきました。
簡単なアナウンスだけ出ててsourceforgeに誘導されてみたらスクリーンショットも
公開されてました。CVS HEADにコードが入っているみたいなのでこれから調査します。

いまはプロトタイピングの段階なので実現可能性の検証が主体です。アルゴリズムの設計と
検証はLispであ〜でもないこ〜でもないやりながら考えた方がお手軽なのですが
プロジェクトの他のメンバがC/C++でコード書いてるので現状は

・Lispでアルゴリズム練る → C++で等価なコードを書いてリポジトリにチェックイン

してます。二度手間でアホらしいんですが最初からC++であれこれ書けないんですよ。
C++の汚さに辟易して大分昔に標準化の動向追いかけるのやめていたこともあって。
で、どうせならLispのコードそのままC/C++に埋め込んじゃうことはできないのかな〜と
たくらんでいるところです。


スレ違いになりますが最近STLやらBoostやらLokiやら勉強してみて驚愕しました。
何であんな大変な思いをしてまでC++使うんですかね・・・不思議でたまらん。



703 名前:デフォルトの名無しさん mailto:sage [2005/10/21(金) 02:54:10 ]
>>702
ずいぶんと怪奇なことになってるよね。>C++
でも、すべてインラインに開いちゃうから確かに速い。
そのかわりコードサイズが大爆発。w

704 名前:デフォルトの名無しさん mailto:sage [2005/10/25(火) 00:24:33 ]
今ポールグラハムのlisp本でお勉強中なのですが、lispでは
soketを開くとかプロセス制御するとか低レイヤな処理をする場合
どーすんのでしょうか。処理系にそうしたライブラリがなかったりする場合は?

705 名前:デフォルトの名無しさん mailto:sage [2005/10/25(火) 00:34:49 ]
socketです。typoっす。すんません。

706 名前:デフォルトの名無しさん mailto:sage [2005/10/25(火) 01:12:37 ]
>>704
どうにもなりません。そういうライブラリが存在するか、ネイティブコードを
呼ぶなどの方法でなんとかできる処理系を選びましょう。

707 名前:704 mailto:sage [2005/10/25(火) 01:53:21 ]
>>706
むぅ。そういうもんなんですか。教えて頂いて有難うございます。
そういったことは一旦置いておくとすると、学習向けに
オススメの処理系があればご教授頂けると助かります。
今のところ本読んでるだけなのですが手続き型が染み付いた頭には
関数プログラミングって難しい…。

708 名前:デフォルトの名無しさん mailto:sage [2005/10/25(火) 02:04:53 ]
>>707
WindowsならCLISP、UNIX系ならSBCLがいいんじゃないかな。
どちらもソケットなどの拡張機能は持っているよ。

709 名前:704 mailto:sage [2005/10/25(火) 02:12:34 ]
>>708
どもです。SBCLっての調べてみます。。

710 名前:デフォルトの名無しさん mailto:sage [2005/10/28(金) 00:10:41 ]
潜水艦から発射するミサイルじゃないの?

711 名前:デフォルトの名無しさん mailto:sage [2005/10/28(金) 00:15:22 ]
>>710
それはSLBM

712 名前:デフォルトの名無しさん mailto:sage [2005/10/28(金) 01:26:06 ]
コンパイラ・スクリプトエンジン相談スレで言語処理系の実装にLispを使うべきだ風な
書き込みを見掛けて興味を持ったのですが、具体的にLispで記述されたコンパイラとかで
参考になりそうなものがあれば教えていただけますか?ソースを見てどんな利点があるのか
比較してみたいです。大昔GCCのソースを眺めたとき内部でS式みたいので木を表現して
いたみたいでしたが、表現形式だけじゃなくて実際に内部でLispプログラムが動いてたり
するんだろか。



713 名前:デフォルトの名無しさん mailto:sage [2005/10/28(金) 03:53:37 ]
かつては MacLisp が Fortran と張り合っていたわけだし,今でも Lisp コン
パイラはほとんど Lisp で書かれているよ.ただ,Lisp 製の ML や C コンパ
イラとかもあるけど,入門で読むのは無理だろう.

利点としてはコンパイラを書く時にモロに Lisp コンパイラの機能がつかえる!!
といっても,何の事か Lisp を知らなければまったくイメージできないかもしれない.
だからまず Lisp を学ぶ必要があるとおもうよ.基礎を一通りやったあと,

groups.google.com/group/comp.lang.lisp/msg/2108939e399c5c4e

とか見て,それでもメリットがわからないようなら Lisp の事は忘れたほうが
いい.合う合わないがあるからね.

714 名前:デフォルトの名無しさん mailto:sage [2005/10/28(金) 20:14:18 ]
MacLispか…研究室の物置に5”FDの認知心理のプログラム群があったなぁ

715 名前:デフォルトの名無しさん mailto:sage [2005/10/30(日) 01:11:05 ]
lispと他のプログラムとの構文とかの対比表ってありませんか?

716 名前:デフォルトの名無しさん mailto:sage [2005/10/30(日) 03:33:47 ]
MacLisp か…今やプロジェクト Mac の Lisp で Macintosh とは関係ないと
言わないと通じない時代かもしれんな…

717 名前:デフォルトの名無しさん mailto:sage [2005/10/30(日) 06:51:32 ]
ttp://kasamatusan.sakura.ne.jp/cgi-bin2/src/ichi14589.jpg.html
(竹内)

718 名前:デフォルトの名無しさん mailto:sage [2005/10/30(日) 11:34:43 ]
>>715 他のプログラム言語,と言いたいのか?具体的には何よ?


719 名前:デフォルトの名無しさん mailto:sage [2005/10/30(日) 14:47:52 ]
>>718
C,C++,java,perl,ruby,python,PHPなどのメジャーな手続き型のどれか

720 名前:デフォルトの名無しさん mailto:sage [2005/10/30(日) 16:39:07 ]
>>719
Lisp プログラマのための Python 入門
www.unixuser.org/~euske/doc/python/python-lisp-j.html
こんな感じ?

721 名前:719 mailto:sage [2005/10/30(日) 16:54:13 ]
>>720
thx!

722 名前:デフォルトの名無しさん [2005/10/30(日) 19:46:03 ]
>>716
Windows上で動く?



723 名前:デフォルトの名無しさん [2005/10/30(日) 19:47:42 ]
lispとjavascriptってどっちが優れていますか?

724 名前:デフォルトの名無しさん mailto:sage [2005/10/30(日) 19:50:17 ]
>>722
PDP-10 とか DEC System 20xx のエミュがあれば。

725 名前:デフォルトの名無しさん mailto:sage [2005/10/30(日) 19:57:22 ]
>>723
javascript は lisp です

726 名前:デフォルトの名無しさん mailto:sage [2005/10/30(日) 23:48:45 ]
煽りにもマジレスしておこうか.

Web のクライアントサイドスクリプティングなら圧倒的に JavaScript が優れている.

逆にサーバーサイドでの処理なら Lisp のほうが良いな.でも君が病的に括弧
を恐れているならどこでも JavaScript のほうが優れていると感じるだろう.
基準をしめさない場合,「どちらが優れていか?」というのは主観的な問題だ
から,人に聞いてもあまり意味がないよ.

727 名前:デフォルトの名無しさん mailto:sage [2005/10/31(月) 03:19:26 ]
>lispと他のプログラムとの構文とかの


728 名前:デフォルトの名無しさん mailto:sage [2005/11/01(火) 00:04:26 ]
>>716 Maclisp と綴って欲しい

729 名前:デフォルトの名無しさん [2005/11/01(火) 06:11:42 ]
Win32バイナリが吐けるLispコンパイラはどこですか?

730 名前:デフォルトの名無しさん [2005/11/01(火) 07:05:14 ]
>>726
主観なわけねーじゃん。ばっかじゃないの

731 名前:デフォルトの名無しさん mailto:sage [2005/11/01(火) 10:46:25 ]
>>730
基準をしめさない場合、という条件でどこをどうやったら主観じゃなくなるのだ?

732 名前:デフォルトの名無しさん [2005/11/01(火) 11:35:21 ]
>>730の次のレスは「あまりの恥ずかしさに煽って逃げる」これ。



733 名前:デフォルトの名無しさん mailto:sage [2005/11/01(火) 12:11:48 ]
>>729
コーマンリスプなんてどうだ。
www.cormanlisp.com/

734 名前:デフォルトの名無しさん mailto:sage [2005/11/01(火) 12:54:47 ]
非商用なら無料なんだ。
corman はチェックしてなかったな。結構寛容なライセンスだね。

735 名前:デフォルトの名無しさん mailto:sage [2005/11/01(火) 13:34:49 ]
どうせポップアップウィンドウに


        t


とか表示させるだけだろ

736 名前:デフォルトの名無しさん mailto:sage [2005/11/02(水) 00:11:24 ]
ロジャーコーマンは腹出過ぎ。

737 名前:デフォルトの名無しさん mailto:sage [2005/11/02(水) 00:30:12 ]
Corman Lispって日本語通るようになったのかな?
要望あったら聞くよーてなメールも送ってきたくらい個人商店ぽいので
誰か日本で使い物になるなら買うから是非頼むといってやれば
なんとかしてくれるかも。


738 名前:デフォルトの名無しさん mailto:sage [2005/11/02(水) 00:31:55 ]
[CommonLisp とコンパイル - コンパイラスクリプトスレからの続き]

つまり Lisp においては「x に 2 を倍する」プログラムはデータ構造 (* x 2) と表現できるわけだ.
(もし熱烈な C/C++ & XML ファンならこの構文木をつくってよう)
さて,ここで操作する.もし「x に 2 を足す」にしたいと思ったとする.
これは Lisp では (+ x 2) と表現できる.インタプリタ上ならば

> code
(* x 2)
> (setf (car code) '+)
(+ x 2)

となる.(もし熱烈な C/C++ & XML ファンなら,同様の操作を表現してみよう )
さて,これをコンパイルしてみよう.このとき,コードは引数 x を一個とるわけなので関数で
ラップする.これは (lambda (x) (+ x 2)) と書ける.Common Lisp の compile メソッドを使うと

> (compile nil '(lambda (x) (+ x 2)))
#<compiled-function>

これでコンパイルされたコードが得られる.もしネイティブコードコンパイラ
を使っているならネイティブコードが得られる.確認したければ,すかさず

> (disassmble *)

とうてばよい.このようにコンパイラは Lisp 環境と統合されており,利用者が気軽に使える存在なのである.
(もし熱烈な C/C++ & XML ファンなら,表現した構文木をコンパイルしてからディスアセンブルしてみよう)


739 名前:デフォルトの名無しさん mailto:sage [2005/11/02(水) 02:59:33 ]
C で同じことやりたいなら cc -fpic 実行して dlopen するだけじゃない?
KCL 系だってそうやってんだし。

740 名前:デフォルトの名無しさん mailto:sage [2005/11/03(木) 13:38:27 ]
コンパイラスレのからの客人?でも KCL とかっていうことはこのスレの人かな?
まぁ,Lisp では手軽さがケタ違いです.C を直接さわったら操作するたびに,
C のソース <--> データ構造 を変換しなきゃいけないのですが,逆に S 式な
ら変換する必要はない.

まぁ,どうしてもと言うなら C っぽく入力列 (S 式風味) をパースしてコンパ
イル,実行という手順でもいい.例として forth 風味の言語を考えよう.

def double
2 *
end
def quad
double double
end
def fib
dup 1 > if
dup 1 - fib swap 2 - fib +
end
end
reset
5 quad fib print

これでフィボナッチ数列の 20 番目を表示したいとする.大袈裟に言うと,
たとえば gcc のバックエンドにこの言語のフロントエンドを作るという事になる.
これは手軽か?(まぁ,手間以外の難易度は Lisp だろうとなんだろうと簡単なんだけど…)

741 名前:デフォルトの名無しさん mailto:sage [2005/11/03(木) 13:41:51 ]
まずパッケージと,基本オペレータを準備する.まぁ,とりあえずスタックはリストで
表現し,スタックのクリア,表示,スタックトップの入れ替え,コピーという基本操作を
使う.算術演算子も lisp のやつを流用する.と,オペレータの定義はこうなる.

(defpackage :mini-forth (:use :cl) (:export #:parse #:run #:forth) (:shadow #:print #:pop #:push #:+ #:- #:* #:/ #:> #:< #:= #:>= #:<=))
(in-package :mini-forth)
(defparameter *stack* nil)
(defmacro defword (word args &body body)
(let ((binds (loop for v in args collect (list v '(cl:pop *stack*)))))
`(defun ,word () (let* ,binds ,@body))))
(defmacro default-operators (&rest operators)
`(progn
,@(loop for op in operators
collect `(defword ,op (x y) (cl:push (,(intern (symbol-name op) :common-lisp) y x) *stack*)))))
(defword print () (loop for e in *stack* for i from 0 do (format t "~&~4D: ~A~%" i e)))
(defword reset () (setf *stack* nil))
(defword swap (x y) (cl:push x *stack*) (cl:push y *stack*))
(defword dup (x) (cl:push x *stack*) (cl:push x *stack*))
(default-operators + - * / > < = >= <=)


742 名前:デフォルトの名無しさん mailto:sage [2005/11/03(木) 13:43:17 ]
あとは入力をパース(手抜き)する.

(defun parse (program &optional (ast nil) &aux (word (first program)))
(cond ((or (null program) (eq word 'end) (eq word 'else))
(values (nreverse ast) program))
((or (stringp word) (numberp word))
(parse (cdr program) (cons `(cl:push ,word *stack*) ast)))
((eq word 'if)
(multiple-value-bind (tree next)
(parse (cdr program))
(multiple-value-bind (tree2 next2)
(parse (if (eq (car next) 'else) (cdr next) next))
(parse (cdr next2) (cons `(if (cl:pop *stack*) (progn ,@tree) (progn ,@tree2)) ast)))))
((eq word 'def)
(multiple-value-bind (tree next)
(parse (cddr program))
(parse (cdr next) (cons `(defword ,(cadr program) () ,@tree) ast))))
(t (parse (cdr program) (cons `(,word) ast)))))

で,得られた S 式をコンパイル(Lisp コンパイラを流用)して実行.

(defun run (program)
(let ((tree (cons 'progn (parse program))))
(funcall (compile nil `(lambda () ,tree)))))




743 名前:デフォルトの名無しさん mailto:sage [2005/11/03(木) 13:51:52 ]
この forth もどきにさっきのプログラムを喰わせる.

MINI-FORTH> (run '( [さっきのプログラム] ))
0: 6765

計算できたッ!! ついでにこの簡易言語で定義された関数 fib とかはLisp コン
パイラでコンパイルされている.つまりネイティブコードコンパイラを使って
いればネイティブコードが得られる.

MINI-FORTH> (disassemble 'fib)
; 09AB6F66: 8BD4 MOV EDX, ESP ; no-arg-parsing entry point
; 6F68: 83EC0C SUB ESP, 12
; 6F6B: 8B05886DAB09 MOV EAX, [#x9AB6D88] ; #<FDEFINITION object for DUP>
; 6F71: 31C9 XOR ECX, ECX
; 6F73: 896AFC MOV [EDX-4], EBP
; 6F76: 8BEA MOV EBP, EDX
; 6F78: FF5005 CALL DWORD PTR [EAX+5]
; 6F7B: 8BE3 MOV ESP, EBX
[...]

…というような説明でどうかな?

744 名前:デフォルトの名無しさん mailto:sage [2005/11/04(金) 01:46:00 ]
む、つまりこれはforthのトランスレータ?
結構短く書けるもんだね。


ところで↓のスレとここはどう使い分けてるの?
スレタイ同じだから混乱するぜ。

【一日】CommonLisp【一門】
pc8.2ch.net/test/read.cgi/tech/1106587515/


745 名前:デフォルトの名無しさん mailto:sage [2005/11/04(金) 02:05:48 ]
スレタイが違うので混乱はしない。

746 名前:デフォルトの名無しさん mailto:sage [2005/11/04(金) 04:54:18 ]
>>744 宣伝乙

747 名前:デフォルトの名無しさん mailto:sage [2005/11/08(火) 00:07:54 ]
すいませんが、解の公式を使って二次方程式の解を出す関数の定義の仕方を
教えてください。どうも、±がどう表現していいか分からなくて…。
よろしくお願いします。

748 名前:デフォルトの名無しさん mailto:sage [2005/11/08(火) 00:09:53 ]
↑宿題?

749 名前:デフォルトの名無しさん mailto:sage [2005/11/08(火) 00:13:37 ]
たぶん。

>>747
> ±がどう表現していいか
思考様式の変革が必要だと思う

750 名前:デフォルトの名無しさん mailto:sage [2005/11/08(火) 00:27:29 ]
多値で返すとか、リストで返すとか好きなやり方選べばいいんでないの。

751 名前:デフォルトの名無しさん mailto:sage [2005/11/08(火) 00:30:53 ]
つうかやる気ねーんだろ?授業をちゃんと聞いてなかったみたいだし。「

いつも思うんだけどなんで〜日までの宿題ですやる気ないんで教えてください、
って素直に言えないのかね?まさか宿題である事を隠してるつもりなのか?なら
人をナメすぎだな。ほらこれを提出してごらん。俺は親切だから罠をしかけたりしないよ。

(defun solve (a b c)
"ax^2 + bx + c = 0"
(let ((A (- b))
(B (sqrt (- (* b b) (* 4 a c))))
(C (* 2 a)))
(values
(/ (+ A B) C)
(/ (- A B) C))))


752 名前:デフォルトの名無しさん mailto:sage [2005/11/08(火) 00:39:19 ]
漏れのエスパー能力によると>>747が求めているプログラムは Lispではないな。



753 名前:デフォルトの名無しさん mailto:sage [2005/11/08(火) 00:41:43 ]
>>750
±にあたるものが存在してないのが問題の山なのかも。
存在してても使いにくそうだけど。

754 名前:デフォルトの名無しさん mailto:sage [2005/11/08(火) 05:01:13 ]
そういえば複素数も扱えるんだよな
でも>>751はaが非零でないことくらいはチェックした方がいいと思う






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<244KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef