1 名前:デフォルトの名無しさん [2012/03/05(月) 04:06:46.71 ] Lisp Schemeスレでは恥ずかしくて聞けないようなことを質問したり、 Lisp Schemeスレの話題は高度すぎて気後れする人が話しあったり。 それ以外でもCommon Lispについての話題なら歓迎します。 ま、ゆっくりやりましょう。 「いいものの本質は、いかなる時代においても変わらない」byパワーズ ■前スレ 【入門】Common Lisp その8【質問よろず】 toro.2ch.net/test/read.cgi/tech/1309940115/ ■Wiki wiki.fdiary.net/lisp/ (id:guest pass:cl) cl.cddddr.org/ tips.lisp-users.org/common-lisp/
116 名前:デフォルトの名無しさん mailto:sage [2012/04/12(木) 01:58:54.87 ] 今はASDF-InstallよりもQuicklispを使った方が良いと思う。 インストールもquicklisp.lispをロードして画面の指示に従うだけだし。 www.quicklisp.org/beta/ cl.cddddr.org/index.cgi?Quicklisp
117 名前:デフォルトの名無しさん mailto:sage [2012/04/12(木) 21:15:14.31 ] Gauche-tkとな?
118 名前:デフォルトの名無しさん mailto:sage [2012/04/12(木) 21:37:40.36 ] もっと波動を送りたい。
119 名前:デフォルトの名無しさん mailto:sage [2012/04/12(木) 21:58:44.01 ] ここはCLだぜ
120 名前:デフォルトの名無しさん [2012/04/13(金) 00:05:59.70 ] >>116 ありがとうございました。おかげさまですんなり行きました。 いいですねQUICKLISP。
121 名前:デフォルトの名無しさん mailto:sage [2012/04/13(金) 00:48:11.62 ] >>120 上手くいったようで何より。楽だよね。
122 名前:デフォルトの名無しさん mailto:sage [2012/04/13(金) 20:48:17.87 ] >>119 Lisp Schemeスレと間違えてたw
123 名前:デフォルトの名無しさん mailto:sage [2012/04/20(金) 01:31:19.33 ] www.sbcl.org/platform-table.html からリンクされているsbclのwindows forkを使って居ます 外部プログラムを動かそうとして CL-USER> (sb-ext:run-program "ls" '()) こう書いたら Couldn't fork child process: No error [Condition of type SIMPLE-ERROR] となりました どうすればよいのでしょうか
124 名前:デフォルトの名無しさん mailto:sage [2012/04/20(金) 07:46:52.34 ] >>123 こうすれバインダー。 (sb-ext:run-program "ls" nil :search t) > :search > Look for program in each of the directories in the child's $PATH environment variable. > Otherwise an absolute pathname is required.
125 名前:デフォルトの名無しさん mailto:sage [2012/04/20(金) 09:22:21.47 ] >>124 できました!ありがとうございます。
126 名前:デフォルトの名無しさん mailto:sage [2012/04/20(金) 11:05:46.73 ] 同じ引数の取り方をする違う関数を効率よく作成したいのですが方法が分かりません たとえば (defun foo1 (arg1 arg2) (princ (+ arg1 arg2))) や (defun foo2 (arg1 arg2) (princ (- arg1 arg2))) で (foo1 1 2)や(foo2 3 4)とする動作を単純化して、 (foo #'+ 5 6) や (foo #'- 7 8)でokにする方法はありますか
127 名前:デフォルトの名無しさん mailto:sage [2012/04/20(金) 11:55:38.46 ] >>126 うほほーい。 (flet ((f (fn &rest rest) (princ (apply fn rest)))) (values (f #'+ 5 6) (f #'- 7 8))) 個人的には畳み込み。 (ql:quickload :alexandria) (let ((fx (alexandria:compose #'princ #'+)) (fy (alexandria:compose #'princ #'-))) (values (reduce fx '(5 6)) (reduce fy '(7 8))))
128 名前:デフォルトの名無しさん mailto:sage [2012/04/20(金) 19:48:28.18 ] >>126 (defun foo (fn x y) (princ (funcall fn x y))) もしくは可変長引数を使って (defun foo (fn &rest args) (princ (apply fn args))) 呼び出し方はどっちも (foo #'+ 5 6) とかでおk
129 名前:デフォルトの名無しさん mailto:sage [2012/04/20(金) 21:06:36.46 ] リストのatomの一文字目をもとにグループ分けする処理を書きました。 (remove-if (lambda (x) (string= "@" (subseq (string x) 0 1))) '(t1 t2 @t3 t4 @t5 t6 @t7 t8 t9)) これでremove-ifとremove-if-notで@がついているグループとついていないグループに分けられました。 つぎに、@が出現したらその直後のatomを ((@t3 t4) (@t5 t6) (@t7 t8)) のようにまとめて、残った物は (t1 t2 t9) とリストにまとめて最終的にvaluesで両方を返したいです。 リストの先読み?が必要そうだと思っているのですが処理を思いつきません。 よろしくお願いします。
130 名前:デフォルトの名無しさん mailto:sage [2012/04/20(金) 21:40:38.36 ] >>129 '(@t1 @t2 @t3)の場合はどうなってほしいの?
131 名前:デフォルトの名無しさん mailto:sage [2012/04/20(金) 21:54:16.68 ] >>129 @つきシンボルの直後がatomでない場合は?
132 名前:129 mailto:sage [2012/04/20(金) 22:06:04.23 ] 説明不足ですみませんでした >>130 ((@t1 @t2) (@t3 nil)) こういう風にまとめたいです つまり左から走査して@~のつぎはとりあえずまとめてしまい、 尻切れトンボになっているときはnilで補完する、ということです >>131 その場合も強制的にまとめてしまいたいです たとえば '(@t1 (test) @t3 '()) これは ((@t1 (test)) (@t3 nil)) こういう風にです
133 名前:デフォルトの名無しさん mailto:sage [2012/04/20(金) 23:03:36.25 ] 動きがなんか、キーワード引数っぽいね
134 名前:デフォルトの名無しさん mailto:sage [2012/04/20(金) 23:33:41.06 ] >>129 fare-matcherを使いたくない場合は頑張って条件分岐書いてくだしあ。 (ql:quickload :fare-matcher) (defpackage :fare-matcher.use (:use :cl :fare-matcher)) (in-package :fare-matcher.use) (labels ((@-p (x) (match (coerce (string x) 'list) ((cons #\@ _) t) (_ nil))) (rec (rest acc) (match rest (() (values (nreverse (car acc)) (nreverse (cdr acc)))) ((like-when (list x) (@-p x)) (rec nil (cons (cons (list x nil) (car acc)) (cdr acc)))) ((list x) (rec nil (cons (car acc) (cons x (cdr acc))))) ((like-when (list* x y rest) (@-p x)) (rec rest (cons (cons (list x y) (car acc)) (cdr acc)))) ((cons x rest) (rec rest (cons (car acc) (cons x (cdr acc)))))))) (values (rec '(t1 t2 @t3 t4 @t5 t6 @t7 t8 t9) (cons nil nil)) (rec '(@t1 @t2 @t3) (cons nil nil)) (rec '(@t1 (test) @t3 '()) (cons nil nil))))
135 名前:デフォルトの名無しさん mailto:sage [2012/04/20(金) 23:47:06.52 ] あと@かどうかを調べるときの処理は、subseq使うより、 (defun @-p (x) (eql (position #\@ x) 0)) とかのが効率良いと思う。subseqは新しくシーケンス作るので、 それが必要な場合以外では効率悪いで。
136 名前:デフォルトの名無しさん mailto:sage [2012/04/20(金) 23:50:47.76 ] >>127-128 ありがとうございます ご指摘のとおりfuncallかapplyを使うことでokでした common-lisp.net/project/alexandria/draft/alexandria.html alexandriaの存在は知っていましたがcompose関数をこう使うとは分かりませんでした 大変勉強になります
137 名前:デフォルトの名無しさん mailto:sage [2012/04/20(金) 23:51:36.57 ] 出遅れた… orz Scheme版書いてみて、移植。 Common Lisp的にはどうやるのがフツー? (defun test (lst) (labels ((myloop (r1 r2 lst) (if (null lst) (values r1 r2) (if (and (symbolp (car lst)) (string= "@" (subseq (string (car lst)) 0 1))) (myloop (append r1 `((,(car lst) ,(if (null (cdr lst)) '() (cadr lst))))) r2 (if (null (cdr lst)) '() (cddr lst))) (myloop r1 (append r2 (list (car lst))) (cdr lst)))))) (myloop '() '() lst)))
138 名前:デフォルトの名無しさん [2012/04/21(土) 00:02:42.63 ] remove-if 使って書こうとして挫折して、自力でコード書いたら キショいコードが出来上がったという、どうしようもない結果になったでござる ideone.com/1JVva
139 名前:デフォルトの名無しさん mailto:sage [2012/04/21(土) 00:11:52.06 ] 脳内ステレオタイプCommon Lisper曰く、 * Common Lispの文化ではnullで空リストかどうか判別しない(() = nil) * よって、'()とかないわー。nil以外使ったことないわー * 再帰を使わずにloopやiterateを使うことが多い * lstという変数名はScheme文化なので堂々とlistと書け * 気が利いた奴はcarやcdrではなくdestructuring-bindを使う * appendは甘え だけど、そんな非実在Common Lisperとか気にせず好きなスタイルで良いのではないかと思う。
140 名前:デフォルトの名無しさん mailto:sage [2012/04/21(土) 00:57:18.84 ] >>139 >* appendは甘え ここ詳しく聞きたい
141 名前:デフォルトの名無しさん mailto:sage [2012/04/21(土) 00:58:18.08 ] >>135 それだと最初の文字以外も調べちゃうから (defun @-p (x) (eql (elt (string x) 0) #\@)) (defun @-p (x) (eql (char (string x) 0) #\@)) の方が良くね?
142 名前:デフォルトの名無しさん mailto:sage [2012/04/21(土) 01:37:53.52 ] >>140 Schemeでもそうなんだけど、consで逆順に繋いでいって、最後に反転した方が効率が良いんだ。 appendで繋げていくと、最終的に不要な中間データが複数作られるのでかなり効率が悪い。 ;; ある処理系でのappendの実装 (defun append (&rest lists) (declare (dynamic-extent lists)) "Construct a new list by concatenating the list arguments" (if lists (let* ((head (cons nil nil)) (tail head)) (declare (dynamic-extent head) (cons head tail)) (do* () ((null lists) (cdr head)) (let* ((list (pop lists))) (if (null lists) (rplacd tail list) (dolist (element list) (setq tail (cdr (rplacd tail (cons element nil))))))))))) これは、Lispでリストに要素を追加していくときに良く使われる定番の手法なので、 覚えておくと、他人のコード読むときなんかでも便利だと思う。
143 名前:デフォルトの名無しさん [2012/04/21(土) 06:49:28.22 ] prognて何の略ですか
144 名前:デフォルトの名無しさん [2012/04/21(土) 07:40:00.28 ] prognて何の略ですか
145 名前:デフォルトの名無しさん mailto:sage [2012/04/21(土) 09:54:14.37 ] (string :test)で"test"が得られますが (x :test)で":test"を得るような関数xは作成可能でしょうか?
146 名前:デフォルトの名無しさん mailto:sage [2012/04/21(土) 10:03:00.28 ] >>145 (format nil "~S" :test)
147 名前:デフォルトの名無しさん mailto:sage [2012/04/21(土) 11:10:19.18 ] >>146 formatでできるのですか。盲点でした。 ありがとうございました。
148 名前:デフォルトの名無しさん mailto:sage [2012/04/21(土) 14:34:41.30 ] >> 142 解説してるテクニックが前半と後半で違くね? cons+nreverseと、cdrを繋いでいく方法の2種紹介ってことだったらわかりづらい説明だね あと、なんでもappendってのはSchemeでも駄目でしょ
149 名前:デフォルトの名無しさん mailto:sage [2012/04/21(土) 19:57:11.58 ] >>148 最終的には 「tconc とか queue って呼ばれてるものを使え」 になるような気が…
150 名前:デフォルトの名無しさん [2012/04/21(土) 22:13:44.75 ] 素人すぎて申し訳ないんですが、人工知能の勉強がてらlispを初めてみたいのですが、sbclをダウンロードしたところで ギブアップしてしまいました。どなたかこのページを解説していただけませんか。www.sbcl.org/getting.html
151 名前:デフォルトの名無しさん [2012/04/21(土) 22:15:06.19 ] >>150 ちなみにOS Xです
152 名前:デフォルトの名無しさん [2012/04/21(土) 22:27:11.15 ] >>150 ちなみにOS Xです
153 名前:デフォルトの名無しさん mailto:sage [2012/04/21(土) 22:48:12.74 ] 解説もくそも書いてあるまんまなんだけど。 とりあえず何がわからんのか質問してみそ。
154 名前:デフォルトの名無しさん [2012/04/21(土) 23:16:41.58 ] >>153 まずここが分からないです! unpack the tarball: bzip2 -cd sbcl-1.0.56-x86-linux-binary.tar.bz2 | tar xvf - replacing sbcl-1.0.56-x86-linux-binary.tar.bz2 with the name of the tarball you downloaded. Then enter the directory which was unpacked, and run the installation script to install SBCL in your /usr/local directory: cd sbcl-1.0.56-x86-linux sh install.sh
155 名前:デフォルトの名無しさん mailto:sage [2012/04/21(土) 23:17:34.35 ] >>154 ターミナルから入力するコマンドだから しばらく一般的なcui操作に慣れた方がいいかと
156 名前:デフォルトの名無しさん mailto:sage [2012/04/21(土) 23:25:19.71 ] 質問です。 指定した文字を複数個連続して作りたいのですが、 (defun repeat-string (num string) (format nil "~{~A~}" (loop repeat num collect string))) (repeat-string 100 "?") これで一応はできるのですが、 loopを使わずに出来ないものでしょうか。
157 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 00:02:49.72 ] >>156 (make-string 100 :initial-element #\?)
158 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 00:06:08.17 ] >>148 流石にそんなアクロバティックな誤読されても困る。最初のコメントに書いてあるように、 斯様にappendは非効率的だから、使う場合に注意を要するって意味なんだけど。
159 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 00:08:46.28 ] 最初のコメントに書いてあるっていうのは語弊があったな。 つまり「例えばある処理系ではこういう実装をしているけど、非効率的でしょ?」って話。
160 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 00:11:08.50 ] >>156 文字を連続ってことなら157の方法だね。 文字列ってことなら (defun repeat-string (num string) (format nil "~V@{~A~:*~}" num string)) とか
161 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 00:15:19.23 ] ああ、ごめん。理解したわ。俺が悪かった。「これは」って代名詞が混乱させたのか。 「cons+reverseは」って置き換えてくれるとありがたい。
162 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 00:30:44.49 ] >>157 >>160 ありがとうございます。
163 名前:デフォルトの名無しさん [2012/04/22(日) 20:14:48.90 ] >>155 CUI勉強してやってみましたが、sh install.shを打ち込むと、 mkdir: /usr/local: Permission deniedとなります。次はどうすればいいでしょうか
164 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 20:38:50.28 ] まずMac OS X用のbinary持ってこいよ。そしたら、 $ sudo sh install.sh
165 名前:デフォルトの名無しさん [2012/04/22(日) 21:36:18.49 ] >>164 mac os x用のbinaryとはなんでしょうか
166 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 21:46:46.84 ] www.sbcl.org/platform-table.html ここ読め。テーブルをクリックできる。
167 名前:デフォルトの名無しさん [2012/04/22(日) 21:53:52.94 ] >>166 WARNING: Improper use of the sudo command could lead to data loss or the deletion of important system files. Please double-check your typing when using sudo. Type "man sudo" for more information. To proceed, enter your password, or type Ctrl-C to abort. Password: ってなりました
168 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 22:01:19.53 ] Common Lisp スレで Mac の使い方説明せないかんの?
169 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 22:08:23.79 ] >>167 Mac OS Xの初心者スレ、CUIスレ、ターミナルスレのどれかに行って。 (後ろ二つはまだあるかどうかしらんけど)
170 名前:デフォルトの名無しさん [2012/04/22(日) 22:30:48.43 ] >>166 WARNING: Improper use of the sudo command could lead to data loss or the deletion of important system files. Please double-check your typing when using sudo. Type "man sudo" for more information. To proceed, enter your password, or type Ctrl-C to abort. Password: ってなりました
171 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 22:34:22.07 ] ターミナルの宿命はよ
172 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 22:37:20.84 ] >>169 ありがとうございます そっちに行ってみます
173 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 23:16:41.98 ] うまくいくといいです
174 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 23:20:49.53 ] とりあえずmanとグーグル先生を調べてから質問しような
175 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 23:44:56.05 ] >>174 わかりました。 ありがとうございます。 それについてもターミナルスレで聞いてみます。
176 名前:デフォルトの名無しさん [2012/04/23(月) 13:32:13.32 ] >>167 のものです。今度は GNU Make not found. Try setting the environment variable GNUMAKE. と出てきました。これはこちらで聞いていい質問ですか?
177 名前:デフォルトの名無しさん mailto:sage [2012/04/23(月) 13:50:28.56 ] >>176 おおざっぱに言えば処理系を起動してからがこのスレの話題。 初心者ってのはそういうもんだというのはわかってるが、 このスレの住民からするとたいそう「もどかしい」状態。
178 名前:デフォルトの名無しさん mailto:sage [2012/04/23(月) 14:10:34.44 ] 人工知能とのやり取りみたいだ
179 名前:デフォルトの名無しさん mailto:sage [2012/04/23(月) 14:22:34.94 ] >>176 lispworks試用版のmacosx版でもつかったら良いんじゃないかな www.lispworks.com/downloads/index.html とりあえず処理系動かすだけならフリーの処理系も試用版も同じかな五時間の時間制限あるけど
180 名前:デフォルトの名無しさん mailto:sage [2012/04/23(月) 16:02:49.26 ] lispworksはmacosxにも対応していたのか
181 名前:デフォルトの名無しさん mailto:sage [2012/04/23(月) 18:46:12.05 ] >>176 エラーメッセージ(の一部)でググレ。 さすがに釣りに思えて来た。
182 名前:デフォルトの名無しさん mailto:sage [2012/04/24(火) 10:41:13.06 ] 数行のコードを試しに動かすだけなら ideone.com/ とかでも。
183 名前:デフォルトの名無しさん mailto:sage [2012/04/26(木) 23:16:09.72 ] すぐ使えるLisp環境ならLispboxを使えばいいのでは。 ttp://common-lisp.net/project/lispbox/ WindowsとMacとLinuxに対応していて、 ダウンロードして解凍してダブルクリックすればすぐ使える。 処理系はSBCLじゃなくてCCLだけど、初心者からしたら違いはない。
184 名前:デフォルトの名無しさん mailto:sage [2012/04/26(木) 23:28:21.60 ] clispってcommon lispではないのですか? On Lispの例がそのままでは動かなかったりするのですが
185 名前:はちみつ餃子 ◆8X2XSCHEME mailto:sage [2012/04/26(木) 23:39:21.30 ] Common Lisp の規格に沿った処理系はいくつもあるけど、規格の不明瞭なところをそれぞれの解釈で実装してたり、 そもそも規格では未定義にされていたり、規格以上の機能を提供しようと拡張されていたりすることもある。 そういった言語の微妙なところに依存してしまっている記述はあるかもしれない。 あと、定義を書く順番が関係してくる箇所もあるので、動かないという箇所を具体的に提示すればこのスレで何らかの助言を得られるかもしれない。
186 名前:デフォルトの名無しさん mailto:sage [2012/04/26(木) 23:50:21.73 ] >>184 CLISPは代表的なCommon Lisp処理系のひとつですよ。 オープンソースだとSBCLやCCLに次ぐくらいには使われている。 On Lispの著者のお気に入りの処理系のひとつでもあります。 >>185 の言うように、書籍のミスなのか、あなたのミスなのか、 >>184 の情報だけではわれわれとしても何とも言えません。
187 名前:デフォルトの名無しさん mailto:sage [2012/04/27(金) 14:33:07.78 ] (6 4 0 4 8 3 7 4 5 7) このリストの各要素を逐一足し合わせて (6 10 10 14 22 25 32 36 41 48) こういうリストを作るにはどうすればいいですか? reduceを使えばいいのかと思ったのですが、 reduceに#'+を渡す例を考えると最終的な値はリストではなく一つの値になってしまいます
188 名前:デフォルトの名無しさん mailto:sage [2012/04/27(金) 15:54:04.53 ] (loop for x in list for y = x then (+ y x) collect y)
189 名前:デフォルトの名無しさん mailto:sage [2012/04/27(金) 16:02:39.06 ] ありがとうございます。ばっちりです。 for ... then を使えばこんなにすっきりと書けるんですね。
190 名前:デフォルトの名無しさん mailto:sage [2012/04/27(金) 16:56:48.09 ] (loop for x in '(6 4 0 4 8 3 7 4 5 7) sum x into y collect y) --> (6 10 10 14 22 25 32 36 41 48) でもいけるね
191 名前:デフォルトの名無しさん mailto:sage [2012/04/27(金) 18:44:37.15 ] 相変わらずloopは黒魔術
192 名前:デフォルトの名無しさん mailto:sage [2012/04/28(土) 00:04:03.22 ] >>187 reduceでの解ということでひとつ。 (nreverse (reduce (lambda (r x) (cons (+ (or (car r) 0) x) r)) '(6 4 0 4 8 3 7 4 5 7) :initial-value nil)) こういうのはloopやiterate、Seriesとかの方がすっきりできる感じがする。 あるいは内包表記とかもこういうの得意分野な感じ。 https://github.com/g000001/srfi-42 CLだとこの辺とか。
193 名前:デフォルトの名無しさん mailto:sage [2012/04/28(土) 00:46:01.06 ] >>192 を見て疑問に思ったんだけど schemeの世界のsrfiってcommon lisp向けに移植されていないのかな
194 名前:デフォルトの名無しさん mailto:sage [2012/04/28(土) 00:59:24.42 ] 上に書いてる https://github.com/g000001 に大半のSRFIがあるよ。
195 名前:デフォルトの名無しさん mailto:sage [2012/04/28(土) 02:11:38.34 ] 本当だ。ありがとう。地道にもやっていたのか。
196 名前:デフォルトの名無しさん mailto:sage [2012/04/28(土) 17:07:30.76 ] >>187 CL詳しくないのでHaskellで sumlist xs = sumlist' 1 xs where sumlist' n xs | n > length xs = [] sumlist' n xs = sum (take n xs) : sumlist' (n+1) xs CLにも同じ機能あると思うので、参考までに
197 名前:デフォルトの名無しさん mailto:sage [2012/04/28(土) 17:23:23.52 ] CLですでに回答済なのに、場違いに出て来るHaskellerって・・・。