1 名前:デフォルトの名無しさん mailto:sage [2007/06/10(日) 21:41:07 ] lispを触ってみたい入門者のQ&A 初心者のQ&A 本スレでは恥ずかしくて聞けない人のQ&A 本スレは高度すぎて割り込めない人のQ&A linuxでなくてwindowsでやりたいんですが・・・Q&A lispを使用してC#やJAVAの代替にするための方法(おまけ) ま、ゆっくりたりましょう。 「いいものの本質は、いかなる時代においても変わらない」byパワーズ (list (url pc8.2ch.net/test/read.cgi/tech/1101386936/l50 :part 1) (url pc11.2ch.net/test/read.so/tech/1140012484/l50 :part 2))
75 名前:デフォルトの名無しさん mailto:sage [2007/06/14(木) 16:02:36 ] (defpackage :maze (:use :common-lisp)) (defun read-maze (filename) (reverse (with-open-file (s filename) (let* ((size (read s)) m) (dotimes (cnt size m) (setq m (cons (read s) m))))))) (defun print-maze-1 (row) (format t "~&~A~%" (loop for b in row collect (elt '(#¥. #¥X #¥Space) b)))) (defun print-maze (maze) (loop for row in maze do (print-maze-1 row))) (defun wall (maze x y) (elt (elt maze y) x)) (defun count-ways (maze x y) (case (wall maze x y) (1 nil) (2 t) (otherwise (loop for dx in '(0 -1 1 0) for dy in '(-1 0 0 1) count (zerop (wall maze (+ x dx) (+ y dy))))))) (defun solve-maze-1 (maze) (append (list (first maze)) (loop for y from 1 to (- (length maze) 2) collect (append '(1) (loop for x from 1 to (- (length (car maze)) 2) collect (case (count-ways maze x y) ((NIL) 1) ((0 1 t) 2) ((2 3) 0))) '(1))) (last maze))) (defun solve-maze (maze) (let ((m (solve-maze-1 maze))) (if (equal m maze) m (solve-maze m))))
76 名前:75 mailto:sage [2007/06/14(木) 16:59:33 ] LISP勉強中の素人ですが Slimeの操作の練習を兼ねて作ってみますた。 本題と違いますけどSlime便利ですね。
77 名前:デフォルトの名無しさん mailto:sage [2007/06/15(金) 06:53:25 ] ちょっと質問なんですが (cons "aaa" (cons "bbb" "ccc")) ってやると ("aaa" "bbb" . "ccc") こうなっちゃいます... これを ("aaa" "bbb" "ccc") こうしたいんですが... すみませんくだらない質問で,どなたかは教えてください...
78 名前:デフォルトの名無しさん mailto:sage [2007/06/15(金) 07:03:00 ] > (cons "aaa" (cons "bbb" "ccc")) > ってやると > ("aaa" "bbb" . "ccc") > こうなっちゃいます... 当然だろ。何の不思議もない。 > これを > ("aaa" "bbb" "ccc") > こうしたいんですが... (cons "aaa" (list "bbb" "ccc")) (cons "aaa" (cons "bbb" (cons "ccc" '())))
79 名前:デフォルトの名無しさん mailto:sage [2007/06/15(金) 07:21:10 ] cons cellとか知らないままlisp使ってる人も 最近はたくさんいそうだな。
80 名前:デフォルトの名無しさん mailto:sage [2007/06/15(金) 07:29:42 ] >>78 すみません,もう一つ質問させてください (setf foo (list "aaa" "bbb")) (cons "aaa" foo) (cons "bbb" foo) (cons "ccc" foo)) consの説明を読むと,2番目の引数がListであれば先頭に一つ要素を追加してゆく と書かれているので,私としては. 最終的に ("ccc" "bbb" "aaa" "aaa" "bbb") と成るはずだと思ったのですが. 実際にやってみると ("ccc" "aaa" "bbb") となってしまいます. ということは 「2番目の引数がListであれば先頭に一つ要素を追加してゆく」というのは 本の間違いですか?
81 名前:デフォルトの名無しさん mailto:sage [2007/06/15(金) 07:38:12 ] >>80 cons は先頭に追加する、んじゃないよ。新しいのを返す。 元々の foo は setq しないと変更されないよ。
82 名前:デフォルトの名無しさん mailto:sage [2007/06/15(金) 07:58:37 ] >>81 なるほど,よくわかりました
83 名前:デフォルトの名無しさん mailto:sage [2007/06/15(金) 17:08:07 ] 岩波の「Common Lisp 入門」って良いですか?
84 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 03:14:44 ] 良いかどうかはわかんないですけど学校の教科書にはなっとります
85 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 05:03:08 ] Lisp関数の探し方というか絞り込み方がよくわかりません。 java,c++,等ならパッケージ、ライブラリなどから必要そうなクラスの名前がだいたい検討がつくのですが 関数一覧から探すのはちょいとしんどいです。 なにかカテゴリー分けされた辞書みたいなものは無いものでしょうか?
86 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 07:44:04 ] >>85 HyperSpec はまさに辞書だけど駄目? ttp://www.lisp.org/HyperSpec/FrontMatter/Chapter-Index.html クックブックもあるよ。 ttp://cl-cookbook.sourceforge.net/ おれはようやくHyperSpecの引きかたに慣れてきたよ。やっぱ辞書は 手に馴染むと便利だね。
87 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 09:36:29 ] ACL で、:zoom によるトレース結果ではなくて、 ソースのエラー発生箇所をそのまま出力させる事はできないですか?
88 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 09:43:11 ] >>86 このクックブックはいいね〜。
89 名前:デフォルトの名無しさん [2007/06/16(土) 11:13:50 ] 任意の正実数 c,および,2 以上の任意の整数 m が仮引数として与えられたとき c の m 乗根 を計算する関数 root を,初期値を 1.0 かつ err を 0.1 としニュートン法を用いて定義したんですが、うまく作動しません。 >(root 5 5)とか入力します (defun absolute (x) (cond ((< x 0) (- 0 x)) ((= x 0) 0) ((> x 0) x))) (defun near (a b err) (< (absolute (- a b)) err)) (defun betterpwr (x m c) (+ (* (- 1 (/ 1.0 m)) x) (/ (+ c 0.0) (* m (mypwr x (- m 1)))))) (defun root-core (c m x err) (if (near c (mypwr x m) err) x (root-core c m (betterpwr x m c) err))) (defun root (c m) (root-core c m 1.0 0.1)) 間違っている点はありますか?
90 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 11:17:34 ] なんかみにくいですねすいません。インデントがうまく反映されませんでした
91 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 11:26:06 ] あ、解決しました mypwr入れ忘れてた orz
92 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 11:50:30 ] >>86 おお、ありがたい、これのローカル参照可能な版があればもっとありがたいです。 15MB,2300fileもあってwgetするのも気が引けるし。 なにより普段からIPリーチャブルじゃないので。
93 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 12:10:48 ] >>84 どうも、では読んでみます。
94 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 12:44:06 ] >>92 ttp://www.lispworks.com/downloads/documentation.html Emacs+SLIMEという環境だけど、ポイント位置のシンボル拾って hyperspecを引くコマンドもあって便利すぎます><
95 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 12:51:44 ] >>92 ひょっとして手元にない人も多いのか? LispWorks や Allegro 入れると一緒に入って ヘルプコマンドが引いてくれるんだよね。フリーの CL でも SLIME から引ける。 www.lispworks.com/documentation/common-lisp.html lispuser.net で配布されてる clisp + slime のやつもローカルのを引くのが推奨みたいよ。 ↓は附属の .emacs から抜粋。俺は Win じゃないんで試してないが、IE が起動するのかな? (require 'hyperspec) (setq common-lisp-hyperspec-root (concat "file://" (expand-file-name "~/doc/HyperSpec/")) common-lisp-hyperspec-symbol-table (expand-file-name "~/doc/HyperSpec/Data/Map_Sym.txt"))
96 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 13:04:44 ] >>83 岩波の Common Lisp 入門って ANSI 以前の CLtL の頃の本じゃなかったっけ? 一通り読んだら ANSI Common Lisp あたりに手を出すのが良いと思う。
97 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 01:02:16 ] >>83 岩波 livejournal lisp でググって見て。 良い点と悪い点がかかれてるページに出くわすから。
98 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 12:50:59 ] sbclを使っています。requireを使うと、標準出力にぞろぞろとメッセージが出ますが あれを出さないようにはできないんでしょうか?sb-executableで実行形式にコンパイルすれば でないのかなとか思ってやってみましたが、実行形式でも出ちゃいます。
99 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 15:00:18 ] >>98 --noinform を付けると出ないようになると思います ttp://www.sbcl.org/manual/Command-Line-Options.html
100 名前:98 mailto:sage [2007/06/18(月) 21:59:33 ] --noinformは付けてましたが、それでも出てしまいます・・・。
101 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 22:42:54 ] ACL(フリーの奴)で、巨大なテキストファイル(数十MB)を調べているのですが、 遅くて困ってます。 with-open-file で開いて普通に read-line で読んでシェルのwlとかgrepみたいな 事をしているのですが、 perl の方が早いんです…コンパイルしてるのに…orz 何か良い方法ないですか?
102 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 23:11:48 ] その遅いところだけ perl 使えばいいと思うが...。
103 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 23:12:29 ] sbclに乗り換えるとかw 製品(の評価版)だとLispWorksが速かったような記憶がある(5年くらい前の話)
104 名前:101 mailto:sage [2007/06/18(月) 23:18:30 ] >>102 perlより遅いって下手丸出しで何か悔しいんですが、、 perlはどんな技でテキスト処理を早くしてるんですかねぇ? >>103 うーん。できればaclで済ませたいです。
105 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 23:18:51 ] >>102 その思考に至るまでに、大抵の奴は宗教的言語熱に嵌るんだなあ。 塩だけで料理は出来ないのに、何でも塩焼きが一番みたいに考えるw
106 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 23:35:57 ] 俺は鯖の塩焼きより味噌煮の方が好きだな。
107 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 23:42:57 ] Perl の正規表現エンジンは C でカリカリにチューニングされてると聞くけど、 Perl vs CL の対決なのではなくて、C vs CL の対決になってるんじゃないの。
108 名前:デフォルトの名無しさん mailto:sage [2007/06/19(火) 00:49:49 ] 無駄なIOとか、本質的でない部分で時間くってんじゃね?
109 名前:デフォルトの名無しさん mailto:sage [2007/06/19(火) 00:50:52 ] とりあえず、どこがボトルネックが探るのが先決だねえ
110 名前:デフォルトの名無しさん mailto:sage [2007/06/19(火) 06:11:08 ] 正規表現エンジンと言えば、CL-PPCRE はどう?
111 名前:101 mailto:sage [2007/06/19(火) 07:23:13 ] 誤解を招きましたが正規表現の問題じゃなかったです。すみません。 調べかたがよく分かんないですが、perlの場合ディスクキャッシュが使えてて、 CLだと使えてないような気もしてきました。 プロファイルとっても大量に呼ばれる read-line そのものが時間食ってる感じです。
112 名前:デフォルトの名無しさん mailto:sage [2007/06/19(火) 07:36:42 ] >>111 久しぶりに来たらなんか変な方向に進んでるな…。ディスクキャッシュは関係ないよ。 メモリ消費を比べればわかるが read-line は必ず「新しい文字列」を返すんだよ。 で、大量のテキストを読み込むと GC のコストがばかにならない。 read-sequence で一気に読んだり、同じバッファを使い回したりもできるが、 実は最新の ACL だとズバリその用途の read-line-into なんてのがある。 www.franz.com/support/tech_corner/read-line-variants-071406.lhtml
113 名前:デフォルトの名無しさん mailto:sage [2007/06/19(火) 10:00:14 ] _,,..r'''""~~`''ー-.、 ,,.r,:-‐'''"""~~`ヽ、:;:;:\ r"r ゝ、:;:ヽ r‐-、 ,...,, |;;;;| ,,.-‐-:、 ヾ;:;ゝ :i! i! |: : i! ヾ| r'"~~` :;: ::;",,-‐‐- `r'^! ! i!. | ;| l| ''"~~ 、 i' | グレアム見てる? イェーイ! i! ヽ | | | ,.:'" 、ヽ、 !,ノ ゝ `-! :| i! .:;: '~~ー~~'" ゙ヾ : : ::| r'"~`ヾ、 i! i! ,,-ェェI二エフフ : : :::ノ~|`T ,.ゝ、 r'""`ヽ、i! `:、 ー - '" :: : :/ ,/ !、 `ヽ、ー、 ヽ‐''"`ヾ、.....,,,,_,,,,.-‐'",..-'" | \ i:" ) | ~`'''ー---―''"~ ヽ `'" ノ
114 名前:101 mailto:sage [2007/06/19(火) 22:18:11 ] >>112 read-sequence!ビンゴです。おかげで perl と同じくらいになりました。 実はread-sequenceには気づいていたのですがシーケンスは関係ないと 思い込んでいました。文字列もシーケンスでした‥‥ 探したら役に立つ記事見つけました ttp://www.emmett.ca/~sabetts/slurp.html どうもありがとうございました。
115 名前:デフォルトの名無しさん mailto:sage [2007/06/20(水) 00:32:46 ] >>114 君はいい子だからこれからも来るように
116 名前:デフォルトの名無しさん [2007/06/20(水) 01:12:52 ] ******恋のおまもり****** これを見た人は,超超超超幸せもの☆☆ @週間以内に好きな人に告白されるか、 ■■■■■■■■■■■■■■■■■■ ■■■■□□□■■■■□□□■■■■ ■■■□□□□□■■□□□□□■■■ ■■■□□□□□□□□□□□□■■■ ■■■□□□□□□□□□□□□■■■ ■■■□□□□□□□□□□□□■■■ ■■■■□□□□□□□□□□■■■■ ■■■■□□□□□□□□□□■■■■ ■■■■■□□□□□□□□■■■■■ ■■■■■■□□□□□□■■■■■■ ■■■■■■■□□□□■■■■■■■ ■■■■■■■■□□■■■■■■■■ ■■■■■■■■■■■■■■■■■■ 好きな人とイイ事があるよ・・・・☆★ コレを読んだら、1時間以内にどこかに貼る★★ 数ゎあなたが好きな人への思いを込めて
117 名前:デフォルトの名無しさん mailto:sage [2007/06/20(水) 03:03:56 ] >>116 好きな人がいない場合はどうすれば良いんでしょうか? っーか、行動半径に妙齢の女性がいないんですけれども。 話は変わって質問です。 (defun reverse$ (lst) (if (null lst) nil (append (reverse$ (rest lst)) (list (first lst))))) でリストの長さnがある程度長いとするとreverse$の計算時間がnの2乗に 比例すると本に書いてあって、 時間をT(n)として、 (rest lst)の長さは n-1なので(reverse$ (rest lst))の計算時間はT(n-1), (list (first lst))の時間は1,appendの時間はn-1となる。 T(0)=1とみなすと、 T(n)=T(0)+1+2+......+n=(n^2+n+2)/2,n=0,1,..... と説明してあるのですが、いまいちピンと来ません。 どうしてこのreverse$の計算時間がリストの長さの2乗になるのでしょうか?
118 名前:デフォルトの名無しさん mailto:sage [2007/06/20(水) 03:24:42 ] わかりやすい説明だと思うが、どこがピンと来ないのかね?
119 名前:デフォルトの名無しさん mailto:sage [2007/06/20(水) 08:25:12 ] すいません、自分が数列の和の公式を理解してませんでした。 中学校に入ってやり直してきます。
120 名前:デフォルトの名無しさん mailto:sage [2007/06/20(水) 12:33:00 ] 中学からやり直しても得られるものは何もないぞ
121 名前:デフォルトの名無しさん mailto:sage [2007/06/20(水) 21:20:05 ] >>120 自分の周りの過半数は女子だ。 それだけでもやり直す価値はあるぞ。
122 名前:デフォルトの名無しさん mailto:sage [2007/06/21(木) 23:45:04 ] 変な流れぶったぎってちょっとしたまとめ。 (let ((buf (make-string (file-length in)))) (read-sequence buf in) ... デカい文字列をメモリ上に作って処理すれば、 acl の正規表現は perlに全然負けてないです。shiroさん疑って ごめんなさい。regexp2(・∀・)イイ!! きっとperlも一行ずつ処理しているように見せて、 裏でいろいろやってるんですね。perlなめてました。 でも、コマンドラインのwc -lより速い行数計算CLプログラムは、 作れませんでした。単純な処理だとやっぱりCには勝てないのでしょうか…。
123 名前:デフォルトの名無しさん mailto:sage [2007/06/22(金) 00:45:22 ] 勝つ必要があるの?どうせ不毛な議論になるからやめよう。 用途によって言語は使い分ける、以上。
124 名前:デフォルトの名無しさん mailto:sage [2007/06/22(金) 11:21:48 ] Perl は昔から文字列の処理に強かったからなぁ。 CGI の言語として普及したのも文字列処理の強さのお陰。 HTML を処理するには簡単に文字列処理が出来なきゃならんし。 それにスクリプト言語の中でも Perl は割と処理速度に力入れてる方だし。
125 名前:デフォルトの名無しさん mailto:sage [2007/06/22(金) 11:42:38 ] Perl より高速なスクリプト言語ってあるの?
126 名前:デフォルトの名無しさん mailto:sage [2007/06/22(金) 12:12:03 ] あるよ
127 名前:デフォルトの名無しさん mailto:sage [2007/06/22(金) 14:05:42 ] それはC#とゆうものです.............
128 名前:デフォルトの名無しさん [2007/06/26(火) 06:36:43 ] reverseと同じ作用をする関数をreverseを使わずに作りたいのですが (defun my-reverse (l) (cond ((atom l) l) (t (cons '()(list (my-reverse (cdr l)) (car l)))))) とやると > (my-reverse '(a b (c d))) (NIL (NIL (NIL NIL (C D)) B) A) となってしまいます。 どうすればよいのでしょうか? ちなみにLISPは本当に素人です…
129 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 08:55:00 ] >>128 >>117
130 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 11:14:17 ] >>129 盲点でした… ありがとうございます
131 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 23:38:30 ] occurと言う関数がtreeの中にitemが含まれる時Tを返すとすると、 (defun occur (item tree) (if (atom tree)(eql item tree) (if (occur item (first tree))t (occur item (rest tree))))) となるわけなんですが、 (eql item tree)が最終的にtを返すのであって (occur item (first tree))でtが評価される事は無いですよねぇ。 ifが有るから便宜上tと有るだけですよねぇ?
132 名前:デフォルトの名無しさん mailto:sage [2007/06/29(金) 00:11:34 ] まず落ちつけ。聞きたいことがよくわからん。 (eql item tree) が T を返すと (if (occur item (first tree)) T ...) の T が返るから 最終的に if の T が返ることもあるだろう。
133 名前:デフォルトの名無しさん mailto:sage [2007/06/29(金) 00:36:27 ] ああ、分かった! treeが分解されていって、 最終的に(eql item tree)でTが出て評価が終わり思ってたけれど、 再帰って数字だけじゃなくて、 深く降りて行ってTが返ってきてもTを返すんだ。 (語彙が少ないから適切に説明できない)
134 名前:デフォルトの名無しさん mailto:sage [2007/06/29(金) 00:40:59 ] 2番目のifを (or (occur item (first tree)) (occur item (rest tree))) にするとわかりやすいかな
135 名前:デフォルトの名無しさん [2007/06/29(金) 01:03:20 ] 例えば >(setq a'(99 88 77 66 55)) となっていて >(printlist a) とすると >( (1 99) (2 88) (3 77) (4 66) (5 55) ) と返すようにしたいんですが、うまくいきません。 どうすればいいでしょうか? やっぱり再帰を使うんですよね?
136 名前:135 mailto:sage [2007/06/29(金) 01:14:13 ] すいません、自分では (defun printlist(s n) (cond ((equal n 1) s) (t (cons n (printlist (car s)(- n 1)))))) と作ってみたんですが、 > (printlist a 5) とやってみると、エラーで99はリストではないと怒られてしまいます。
137 名前:デフォルトの名無しさん mailto:sage [2007/06/29(金) 01:19:53 ] こんなもんかな (defun printlist (s &optional (n 1)) (if s (cons (list n (car s)) (printlist (cdr s) (1+ n)))))
138 名前:135 [2007/06/29(金) 02:13:03 ] >>137 おお! ありがとうございます!!
139 名前:デフォルトの名無しさん mailto:sage [2007/06/29(金) 03:33:07 ] やっぱり再帰って Scheme のほうが向いてるんじゃないか。 反復を表現するためのドメイン特化言語 (DSL) LOOP を恐れずに使う。 CL-USER> (loop for e in '(99 88 77 66 55) for i from 0 collect (list i e)) ((1 99) (2 88) (3 77) (4 66) (5 55))
140 名前:デフォルトの名無しさん mailto:sage [2007/06/29(金) 06:07:05 ] 両方使えるのがCLの良い所。
141 名前:デフォルトの名無しさん mailto:sage [2007/06/29(金) 15:29:42 ] doよりもloopの方を使うことが多い?
142 名前:デフォルトの名無しさん mailto:sage [2007/06/29(金) 16:26:34 ] (defun color (fruit) (case fruit (apple 'red) ((banana lemon) 'yellow) (peach 'pink) (t "I don't know"))) と言う果物の名前を引数にとってその色を返す関数で、 (t "I don't know")の所でtが有るのはLispではNIL以外は何でも真だからですか?
143 名前:デフォルトの名無しさん mailto:sage [2007/06/29(金) 18:43:22 ] >>141 個人的には loop は単純な無限ループ以外では使わない。知識がCLtL1で止まってるもんで。w
144 名前:142 mailto:sage [2007/06/30(土) 02:55:29 ] すいません。 本当は (defun color (fruit) (case fruit (apple 'red) ((banana lemon) 'yellow) (peach 'pink) (otherwise "I don't know"))) なんでしょうけれども、 最後の一行を (t "I don't know")))にしてもOKだと説明してあって、 どうしてなのかな?と自分なりに考えた結論だったのですが、間違ってました?
145 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 05:14:03 ] www.lisp.org/HyperSpec/Body/mac_casecm_ccasecm_ecase.html ここを見る限りtとotherwiseを特別扱いしてるだけな気がする。
146 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 12:14:54 ] >>141 do と loop は微妙に住み分けている。基本は do なんちゃら〜だけど、 以下の場合は loop を使う。とうか do より楽ができるパターンに使う。 A. collect を使いたいとき : DO だと push していって reverse だけど、このパターン用の DSL がこれ B. ((x 1) (x 2)) みたいなパターンを for (id num) in ((x 1) (x 2) みたいな C.
147 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 12:16:44 ] あ、途中でおくっちゃった。 C. 以降は気分つーことで。
148 名前:142 mailto:sage [2007/06/30(土) 12:49:08 ] >>145 特に意味はないのかなぁ。 本スレでも聞いてみますね。
149 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 23:53:48 ] ファイル関係で解らないことがあります。 Lispworksではfile-directory-pをつかって渡したPATHがディレクトリかファイルか区別がつくようなのですが sbclやclispではファイルとディレクトリの区別を付ける方法がわかりません。 HyperSpecを渡り歩いたのですがこのあたりの記述をさがせませんでした。 ファイルシステム関係は言語実装と別な領域の話で仕様は無いよと言うことになってしまうのでしょうか?
150 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 01:38:22 ] まぁ、 Lisp は「ディレクトリ」って概念がないフィアルシステム上でも動いてきたからね…。 ファイルやディレクトリを扱うには Edi Weitz 氏の CL-FAD (File And Directory) が今は標準的。 元は Peter Seibel が Practical Common Lisp 書くときに用意したやつで、Edi 氏がパッケージにして公開してくれる。 で、件の処理はパッケージ内で以下のように定義されてる。pathname-name と pathname-type が無いものがディレクトリであると。 これで不自由はしてないよ。 (defun component-present-p (value) "Helper function for DIRECTORY-PATHNAME-P which checks whether VALUE is neither NIL nor the keyword :UNSPECIFIC." (and value (not (eql value :unspecific)))) (defun directory-pathname-p (pathspec) "Returns NIL if PATHSPEC \(a pathname designator) does not designate a directory, PATHSPEC otherwise. It is irrelevant whether file or directory designated by PATHSPEC does actually exist." (and (not (component-present-p (pathname-name pathspec))) (not (component-present-p (pathname-type pathspec))) pathspec)) ロード方法: SBCL なら cl-fad.tar.gz をダウンロードして展開後、 CL-USER> (load "cl-fad.asd") CL-USER> (asdf:oos 'asdf:load-op :cl-fad) CLISP なら ASDF も別途インストールしてくれ。
151 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 01:40:31 ] フィアルシステムって何だよ。ファイルシステムです。ごめん。
152 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 06:14:20 ] >>150 おはようございます、教わった関数とdirectory関数をつかってパスがディレクトリかどうか判定できるようになりました。 ありがとう。
153 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 07:34:09 ] >>150 >>Lisp は「ディレクトリ」って概念がないファイルシステム って、どんな感じなんでしょう? 全部、ひとつのディレクトリの中に収まっているようなイメージなんでしょうか? ぜひ、教えてください。
154 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 15:50:59 ] >>153 そう。一階層しかない。 Common Lispが制定された頃(20年以上前)はそういうOS(たとえばCP/M)が生き残っていたのじゃよ。
155 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 15:55:51 ] だれか政治力のある人に CLtL3 を提案してほしい。GLSはもう興味無いのかな。
156 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 18:05:02 ] >>155 何か案があるなら提案すりゃいいんじゃね。各ベンダとも独自の拡張を施してるわけだし。 で、なんで共通部分である ANSI CL の部分を変更したいんだ? 処理系の対応なんかでかなりのコストがかかるけど。
157 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 18:15:37 ] >>156 そりゃ独自に似たような拡張やってるなら共通部分に入れたほうが良いでしょ。 コスト掛かるって意味がわからんけど、標準になればみんな対応するでしょ。
158 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 18:48:41 ] よくわからん。何を標準化してほしいんだ?ただ改訂したい改訂したいといわれても…
159 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 18:50:48 ] 憲法論議みたいだな
160 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 18:53:58 ] >>158 例えばちょっと上で出たディレクトリの話とか、多少時代遅れになってる部分はあると思う。 Unicodeの扱いなんかもベンダ独自でやってるけど、共通化すると便利ではないか?
161 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 19:05:35 ] あーそりゃ便利だと思うけどね。その程度では規格制定のコストを払ってくれるところはないと思うよ… Unicode 周りというか国際化対応にかんしてもまだ課題は多くて The Right Thing は見えないしね。 CLRFI clrfi.alu.org/ でどかんとブチ挙げるとか、ライブラリ書いて cliki あたりで公開してデファクト 目指すか、 CL-FAD みたいな事実上標準的なライブラリで我慢するか。 > コスト掛かるって意味がわからんけど、標準になればみんな対応するでしょ。 結構軽く考えてるな。まず R6RS の推移と主要処理系が対応するまでの過程を見てみると参考になると思う。
162 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 19:12:44 ] >>161 まあ軽く考えてると言われればそうかもしれん。せめて R6RS みたいな話が Common Lisp にも 出てこないかな、という無責任な希望程度の話。議論するつもりは無いので、このくらいで。
163 名前:デフォルトの名無しさん [2007/07/01(日) 21:04:30 ] karetta.jp/article/blog/ll-spirit/033840 これをCLで素朴にやってみたんですけど誰か添削してくれませんか。 (defvar *capacity* nil) ; int list (defvar *goal-p* nil) ; int list -> bool (defun room-of (n state) (- (nth n *capacity*) (nth n state))) (defun lset (l n v) (cond ((= n 0) (cons (+ (first l) v) (rest l))) (t (cons (first l) (lset (rest l) (- n 1) v))))) ; int list -> (int . int) -> int list (defun move (state pair) (let* ((from (first pair)) (to (rest pair)) (m (min (room-of to state) (nth from state)))) (lset (lset state from (- m)) to m))) ; int list -> (int . int) list (defun all-moves (l) (remove-if #'(lambda (pair) (= (first pair) (rest pair))) (mapcan #'(lambda (x) (mapcar #'(lambda (y) (cons x y)) l)) l))) ;続く
164 名前:デフォルトの名無しさん [2007/07/01(日) 21:05:18 ] ;続き ; int list -> int list list (defun successors (state) (mapcar #'(lambda (x) (move state x)) (all-moves '(0 1 2)))) (defun solve-abura (a b c) (let* ((*capacity* (list a b c)) (target-amount (/ a 2)) (*goal-p* #'(lambda (state) (= (count target-amount state) 2))) (start (list a 0 0))) (abura (list start)))) (defun abura (goal-stack) (let ((state (first goal-stack))) (cond ((funcall *goal-p* state) (reverse goal-stack)) ((member state (rest goal-stack) :test #'equal) nil) ((some #'(lambda (amt cap) (> amt cap)) state *capacity*) nil) (t (reduce #'(lambda (result new-goal-stack) (or result (abura new-goal-stack))) (mapcar #'(lambda (s) (cons s goal-stack)) (successors state)) :initial-value nil))))) ;(trace abura) (print (solve-abura 10 7 3))
165 名前:153 mailto:sage [2007/07/01(日) 22:32:38 ] >>154 レス、どうもです。 ファイル操作に関連する苛立たしさ、 (cltl2の本、アンナに分厚いのに) change directoryが無いとかは、 そういうことに起因してたんですか。 私が使っているlispのアプリの作者さんが、cd等の関数を、 処理系毎にaliasっぽく簡単な書き換えをしているのを見て、 なんでこんな基本的な関数も用意してくれないのかと思っていたのです。 「directoryの概念の無いファイルシステム」 とか言われちゃうと、仕方がないとも思えるけど、 ansi cl化する時、足してほしかったな。
166 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 23:16:49 ] 当時、UNIX ベースのシステムが主流になるとは保証できなかったからしょうがない。 大抵の言語ではファイルシステム関連の機能は規格というよりライブラリの領分だしね。 個人的には pathname は夢の残骸みたいな感があるね。構成要素は↓だけど、 pathname-device, pathname-directory, pathname-host, pathname-name, pathname-type, pathname-version UNIX だと directory, name のみだよね(拡張子を type とみるかもしれない)。 Windows だと device, directory, name, type か。 当時の Lisp Machine はネットワークを備えていたから host なんてのがあるし、version なんてのも面白いよね。 バージョニングを備えていたファイルシステムが当時あったのかな?
167 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 23:29:14 ] > バージョニングを備えていたファイルシステムが当時あったのかな? VMS とかかな。
168 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 00:12:02 ] TOPSにもあった気がする
169 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 21:53:37 ] CommonLispでの外部ライブラリの使い方等について質問です。 htmlgenというライブラリをaptでインストールしましたが、このあと どうやってそれを使えばいいのかが分かりません。 require? load? ここらへんの知識が全くないのですが、 どこかに情報まとまっていたりしますか? とりあえずaptでいっしょにインストールされたtest.clを読み込めるところまで いきたいのですが・・・
170 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 23:07:16 ] apt とか Debian いわれてもわからん。SBCL か? (asdf:oos 'asdf:load-op :htmp-gen) でコンパイル + ロード完了だ。だめなら、これの前に (load "/path/to/somewhere/htmlgen.asd") を実行しとくこと。
171 名前:デフォルトの名無しさん [2007/07/02(月) 23:15:39 ] ┌─10 ┌─┼─20 │ └─30 │ ┌─40 ─┼─┼─50 │ └─60 │ ┌─70 └─┼─80 └─90 を表す引数なしの関数tree定義して、 次に,car や cdr 等以外の何らかのコマンドや関数等を使って,tree から次のような要素を取り出すにはどうすればいいんですか? > XXXXXX 10 > XXXXXX 20
172 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 00:41:36 ] >>169 ubuntuかdebianだと思うが /usr/share/doc/cl-htmlgenとかにドキュメントが入る んで (asdf:oos 'asdf:load-op :htmlgen)か(require :htmlgen)で使えるよ。 share/docにあんまり記述が無い奴(たまにある)だったら:htmlgenの部分は/usr/share/common-lisp/systemの中に入れたとおぼしきパッケージのasdファイルがあるから 他のパッケージでワケワカメになったら探すと良いよ。 全然関係ないけど、windowsとlinuxどっちもslime+emacs+sbclでかなり幸せになれました。 で、windowsでアプリ書くのにlispbuilder使ってますが結構しんどいです。(windowのレイアウトだけはポトペタにしたいです) windowレイヤーだけ別にポトペタして、sbclで作ったロジックと結びつけたりするような手段って無いでしょうか? あるいは製品版のlispworksとかだとできるのでしょうか?(aclは再配布コストを負担できないので除外してます)
173 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 00:51:19 ] LispWorks の InterfaceBuilder か?一応ポトペタもどきだが、 CAPI ライブラリは宣言的なので手で書いたほうが楽だったりする。 GUI の速度がいらねーなら LTK でいいんじゃね。GTK 系でも Socket で通信する GUI があった気がする。 どんなアプリ作るの?
174 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 00:57:12 ] >>171 宿題なら宿題とかけよ…。なんで宿題ですって正直に言えない奴が多いんだ。 宿題じゃない風を装いたいならもうちょっと日本語をなんとかしろよ… まぁ、どうせ答え丸写しで小言なんか聞きやしないんだろうけどよぉ (defun tree () '((10 20 30) (40 50 60) (70 80 90))) > (caar (tree)) もしくは (first (first (tree))) もしくは (nth 0 (nth 0 (tree))) 10 > (cadar (tree)) もしくは (first (rest (first (tree)))) もしくは (nth 1 (nth 0 (tree))) 20
175 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 00:59:46 ] >>174 おまえ、親切だなw