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))
52 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 16:53:32 ] しらみつぶしで簡単に求まる問題でしょ。非決定性なんて必要ないよ。
53 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 19:33:18 ] >>51 は、自分の豊富な (と思ってる) 知識を披露しただけだろ。
54 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 20:04:03 ] fizzbuzz並みに簡単かどうか別として、再帰を利用すれば解ける問題だった。 それは一応確認した。豊富な知識(と思ってる)のかしらないけど、 いろんな事は検討してみましたがね。 52や53のような輩にレスを返しても荒れるだけだったな。2ちゃんならではの このての人種とは関わりたく無い では失礼。
55 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 20:05:50 ] 日本人じゃなかったみたいだな
56 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 22:10:46 ] 何で list じゃなくて二次元配列なんだろ。 手抜きで C の課題をそのまま lisp にしたのかな?
57 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 22:15:25 ] え??マップは二次元データだから二次元配列でいいじゃん。 ランダムアクセスするし。いちいちリストたぐるなんて無駄じゃん。 この例でわざわざリストを使うなんて CL としてはありえないだろう。
58 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 22:15:45 ] 縦と横の操作の対称性を考えると配列のほうがベターじゃね? 解くときはランダムアクセスが必要だろうから配列のほうが速いし
59 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 22:35:18 ] >>57 , 58 配列の方が早いのは勿論分かるけど、宿題レベルだと関係なくない? >>27 なんてデータを配列に読み込むだけで挫折してるわけだし。
60 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 22:41:53 ] 簡単にできたら宿題の意味が無いかも
61 名前:31 mailto:sage [2007/06/13(水) 22:48:45 ] >>50 >>>31 のコードは何をしてるのか気になる えっと、斜めには進めないと考えて、 もしa(x,y)が1ならば、行ける場所は0(壁だから) そうでなければ、a(x,y)=1にして、周囲4近傍における合計値+1 それの再帰で、最終的にマスすべてをしらみつぶしに調べて 行ける場所(進めるマスの総計)が求まる はずなんだけれどなぁ、と深く考えずに書いてしまいました。 正直スマンカッタ。 でも、こんな感じの考え方を進めていけばいいんじゃないかなぁと思ったんです。
62 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 23:44:57 ] >>59 「配列の勉強に対する宿題かも」ぐらいの想像力があってもいいと思うんだが。
63 名前:29 [2007/06/14(木) 00:05:31 ] ……なんか荒れてるなぁ。で、他にネタもないので質問者が見てるかもしれないので軽く説明しとこう。 朝のプログラム歩数マップ(ゲームなんかで移動範囲がピコーンって光るやつみたいな)を作成してから、目的地へのルートを撰択するのね。 で、↓がスタート地点から総当たりでルートを探索してゆく(カベにぶつかったり戻ったりはナシのほうこうで)。 途中の通った経路をどんどん覚えていってゴールまでの全ルートを列挙。最後に最短のものを選ぶ。 (defun print-maze (maze &optional path &aux (size (maze-size maze))) (loop for row below size do (loop for col below size do (princ (cond ((eq (aref (maze-data maze) row col) 1) "+") ((member (list row col) path :test #'equal) "*") (t " ")))) (terpri))) (defun solve-maze-2 (maze &aux (start '(8 1)) (goal '(0 7)) (data (maze-data maze)) (size (maze-size maze))) (labels ((find-path (path pos &aux (x (first pos)) (y (second pos))) (cond ((or (< x 0) (< y 0) (>= x size) (>= y size) (= (aref data x y) 1) (member pos path :test #'equal)) nil) ((equal pos goal) (list (cons pos path))) (t (mapcan #'(lambda (d) (destructuring-bind (dx dy) d (find-path (cons pos path) (list (+ x dx) (+ y dy))))) '((1 0) (-1 0) (0 1) (0 -1))))))) (let ((found (find-path nil start))) (if (null found) "経路が見つかりません!! >_<" (print-maze maze (first (sort found #'< :key #'length)))))))
64 名前:29 mailto:sage [2007/06/14(木) 00:06:42 ] age ちった…。で、おそらくこれが 31 が示そうとしたコードかなと思った。
65 名前:29 mailto:sage [2007/06/14(木) 00:13:15 ] 何度もすまん、>>61 にイイ線いってたよと言いたかった。風邪ひいてボケてるな。 おしかったのは行ける方向を数値にして足しちゃうと経路として使えないんだよね。 座標を覚えておくか、歩数マップみたいに移動コストを計算して最短経路を選ぶかすれば正解だった。
66 名前:CLer mailto:lisp [2007/06/14(木) 01:02:39 ] >65 イイ線いっていないと思うんですが……。 31の回答で(解けていなくて)惜しい点というのが、 最短経路を求める問題そのものなのではないですか? だいたい、31の方法ではある座標をすでに通過したかどうかが判定できず、 いつまでも同じところを巡回する可能性がありませんか? というか……、 この再帰は抜けられるんですかね……。
67 名前:65 mailto:sage [2007/06/14(木) 01:24:34 ] 周囲を再帰的に探索していくという点が最初の壁だと思うから着眼点はいいと思うよ。 ここがわかればあとは条件を足すだけじゃん。壁チェックはしてあるから 1. 同じところでいったりきたりしない工夫 (経路を覚えるとかマップにマークするとか) 2. ゴールで止まる の二点が不足してただけ。配列を一回り大きくして外側を全部壁で囲っちゃえば座標チェックは省略できるしー。 31 のままじゃ無限ループに陥いって抜けられないけど、俺は評価したいね。 俺が C しか知らなかった頃には再帰的な探索なんて考えつかなっただろうという個人的理由が大きいけど。
68 名前:デフォルトの名無しさん mailto:sage [2007/06/14(木) 03:00:42 ] 文字列の最初の一文字を返すのと,それ以外の部分を返す関数ってないっすか? 文字列のcar, cdr見たいなことをしたいっす.
69 名前:デフォルトの名無しさん mailto:sage [2007/06/14(木) 03:20:00 ] >>68 (subseq "ABC" 0 1) => "A" (subseq "ABC" 1) => "BC"
70 名前:デフォルトの名無しさん mailto:sage [2007/06/14(木) 04:28:35 ] >>69 ありがとうございます もう一つ質問させてください Lispってループを抜けるC言語で言うbreak見たいな ものってないんですか?
71 名前:デフォルトの名無しさん [2007/06/14(木) 06:40:33 ] リターンを使えば抜けれますよ、sumっていう変数があるとすると (return sum) と書けばループを抜けて、loopの値がsumとなります (return) だけだとloopの値はnilになります
72 名前:デフォルトの名無しさん mailto:sage [2007/06/14(木) 09:01:45 ] vimでlisp書いてるんだけど、インデントにスペースとタブの両方が使われる。 インデントはスペースだけにしたいんだけど、誰か何とかする方法知らない? 余談: emacsでCを編集したらインデントにタブとスペースの両方使われて、 vimでCを編集したらインデントはタブだけが使われたはず。 なんでlispだと逆転するのかね……
73 名前:デフォルトの名無しさん mailto:sage [2007/06/14(木) 09:31:31 ] vim tab space でググるくらいはしたらどうか。 聞くとしてもスレ違い。
74 名前:デフォルトの名無しさん mailto:sage [2007/06/14(木) 15:07:33 ] >>72 スレチだけど、EmacsのCの編集でスペースで統一するのはc-mode-common-hookあたりで (setq indent-tabs-mode nil)すればよろし。
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関数をつかってパスがディレクトリかどうか判定できるようになりました。 ありがとう。