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/
2 名前:デフォルトの名無しさん mailto:sage [2012/03/05(月) 05:04:54.94 ] アセンブリとCommon Lispの関係は?
3 名前:デフォルトの名無しさん mailto:sage [2012/03/05(月) 05:26:00.37 ] Common Lispでウェブアプリ書いてる人いる?
4 名前:デフォルトの名無しさん mailto:sage [2012/03/05(月) 05:38:24.33 ] >>2 質問の内容が良く分からないけど、ネイティブコードにコンパイルする処理系なら、 内部でアセンブリ言語を中間形式として使ってたりするよ。SBCLとかCCLとか。 >>3 事例があるか、って話ならGoogleに買収されたITAが商売でやってたし、 日本でいるか、って話ならpaserveとかHunchentootとか使ってやってる人はいる。
5 名前:デフォルトの名無しさん mailto:sage [2012/03/05(月) 10:11:56.10 ] ポール・グラハムおじさんを忘れちゃいけない
6 名前:デフォルトの名無しさん mailto:sage [2012/03/05(月) 11:21:39.40 ] グラハムの話はウェブ黎明期の話だからな 今から新規にウェブアプリを開発するときにCommon lispを 使うのはかなりの冒険だろ
7 名前:デフォルトの名無しさん mailto:sage [2012/03/05(月) 11:49:41.83 ] clackを忘れたら可哀そうだよー。 深町さん、はてなをLispに染めてくれんかな。
8 名前:デフォルトの名無しさん mailto:sage [2012/03/05(月) 16:13:57.08 ] Lucid Common Lispはよくできていたな。
9 名前:デフォルトの名無しさん mailto:sage [2012/03/06(火) 16:57:33.54 ] ***でSTGを作りますが何か?:いで庵 www.usamimi.info/~ide/programe/stg_doc/index.html common lispでGUIシューティング・ゲームを動かすみたい land of lispはCUI上のゲームだったっけ
10 名前:デフォルトの名無しさん mailto:sage [2012/03/06(火) 17:34:44.27 ] >>9 これFFIなのかな FFIで呼び出した先で落ちたりすると結構涙目なデバッグする羽目になることあると思うのだけど頑張ってほしいな
11 名前:デフォルトの名無しさん mailto:sage [2012/03/07(水) 02:29:23.17 ] Lisp界隈の進歩が亀のようにノロい理由として、 すぐに俺実装を作りたがって開発リソースが分散しがちというのが 大きな理由としてあると思っている。例えば clojure-py を見ろ。
12 名前:デフォルトの名無しさん mailto:sage [2012/03/07(水) 07:14:56.04 ] 何度目だこれ
13 名前:デフォルトの名無しさん mailto:sage [2012/03/07(水) 12:06:07.77 ] 俺実装を作るってのもニーズの一つだから良いんよ。 あとスレチなんよ。
14 名前:デフォルトの名無しさん mailto:sage [2012/03/07(水) 19:21:02.62 ] 自分はcommon lispの初心者にPAIPやCLtL2など限られた書籍をまず読ませる、 とどなたかわかりませんが書いていた覚えがあるのですが、 ご存じの方はいらっしゃいますか?
15 名前:デフォルトの名無しさん mailto:sage [2012/03/07(水) 22:46:19.82 ] CPUがi7の場合 並列実行できると高速になるはずなのですが sbclはスレッドが不安定とも聞きます i7で一番高速な処理系はどれになるのでしょうか
16 名前:デフォルトの名無しさん mailto:sage [2012/03/07(水) 23:05:05.36 ] >>15 OSは?
17 名前:デフォルトの名無しさん mailto:sage [2012/03/07(水) 23:24:39.36 ] >>15 >sbclはスレッドが不安定とも聞きます ソースはどのあたり?
18 名前:デフォルトの名無しさん mailto:sage [2012/03/08(木) 00:42:35.40 ] >>15 突っ込みどころは捨て置くとしても最速はFranzだと思うぞ 高いけど
19 名前:デフォルトの名無しさん mailto:sage [2012/03/08(木) 00:42:49.56 ] OSはlinuxです ソースは以前にいろいろブログみてまわってた時の印象です
20 名前:デフォルトの名無しさん mailto:sage [2012/03/08(木) 00:47:43.94 ] 1.0.54のリリースノートで > We still don't consider threads on non-Linux platforms good enough to enable > them by default, but they're in a clearly better shape now. って書いてるし、Linux以外の環境ではあながち外してもないんじゃいか。 とはいえ、>>15 のソースは別口だとは思うけど。 この所SBCLはリポジトリに動きがない。みんな忙しいんだろうか。
21 名前:デフォルトの名無しさん mailto:sage [2012/03/08(木) 00:52:29.17 ] >>18 残念ながらAllegro CLはWindows以外ではネイティブスレッド非対応。 ユーザレベルスレッドだから、マルチコアでスケールしたりしないはず。 cl.cddddr.org/index.cgi?Allegro%20Common%20Lisp common-lisp.net/~dlw/LispSurvey.html www.franz.com/support/faq/#s-mp
22 名前:デフォルトの名無しさん mailto:sage [2012/03/08(木) 01:02:18.88 ] >>21 Windows だけでってのは珍しいな。
23 名前:デフォルトの名無しさん mailto:sage [2012/03/08(木) 01:17:04.26 ] androidでcommon lispを使った開発してる人 いますか? ググってみたところecl,abcl、cclあたりが候補になるのかな? あとsl4aというスクリプト実行環境を 利用する手もあるみたいです。 どれも敷居がたかそうだけど、lispで android開発できたら素敵だなっと。
24 名前:デフォルトの名無しさん mailto:sage [2012/03/08(木) 04:30:03.42 ] >>23 CommonLispでなくて良いならClojureがswank丸ごと動くのでSlime使って開発できたりするよ
25 名前:デフォルトの名無しさん mailto:sage [2012/03/08(木) 23:34:50.53 ] 数値を受け取り、 1桁なら0を10の位に挿入して文字列として、 そうでなければそのまま文字列として返す処理はどう書けばよいですか? (defun num->string (i) (if (<= 10 i) (princ-to-string i) (format nil "0~A" i))) こう書いてみたのですが、princ-to-string と format が似たようなことをしているので 他の書き方は無いかと気になりました princ-to-stringとformatのどちらかを書かずに同じ結果を取得できないものでしょうか
26 名前:デフォルトの名無しさん mailto:sage [2012/03/08(木) 23:42:34.89 ] formatの書式指定で出来る。
27 名前:デフォルトの名無しさん mailto:sage [2012/03/08(木) 23:49:19.25 ] ~2,'0d
28 名前:デフォルトの名無しさん mailto:sage [2012/03/08(木) 23:49:48.10 ] (format nil "~2,1,,'0@A" 1) かな。
29 名前:デフォルトの名無しさん mailto:sage [2012/03/09(金) 00:19:45.06 ] >>26-28 ありがとうございます。>>28 でOKでした。
30 名前:デフォルトの名無しさん mailto:sage [2012/03/12(月) 19:48:12.32 ] CLAZY: Lazy Calling in Common Lisp common-lisp.net/project/clazy/ ここでthunkというものが出てくるのですが、なぜthunkというものを 使おうとするのでしょうか?
31 名前:デフォルトの名無しさん mailto:sage [2012/03/12(月) 20:54:29.68 ] >>30 delayとforceが何をするものかを考えれば 簡易的な実現の一つとして、例えば (defmacro delay (expr) `(lambda () ,expr)) (defun force (thunk) (funcall thunk)) というのもありだと分かるだろう。
32 名前:デフォルトの名無しさん mailto:sage [2012/03/12(月) 21:01:55.71 ] en.wikipedia.org/wiki/Thunk_ (functional_programming) 最初の方だけ読めばいいよ
33 名前:デフォルトの名無しさん mailto:sage [2012/03/15(木) 15:53:53.81 ] >>31-32 ありがとうございます。理解できました。
34 名前:デフォルトの名無しさん mailto:sage [2012/03/17(土) 01:20:38.04 ] (defun hoge () " ここにコメントを書く " foo) コメント部分に"とかを含めたい時ってどうやるんでしょ? Pythonみたいに"""みたいなことって出来るんでしょうか?
35 名前:デフォルトの名無しさん mailto:sage [2012/03/17(土) 05:53:51.52 ] 評価されるならいくつか逃げ道思い付くけど、docstringは「not evaluated」だし、 \でエスケープするしかないんじゃなかったっけ。 奥義のリーダーマクロを使えばどうとでもなるとは思うけど。 CL-INTERPOLに望みの機能があった気が。 weitz.de/cl-interpol/
36 名前:デフォルトの名無しさん [2012/03/20(火) 10:07:11.65 ] 関数の途中で処理をstopさせたいのですが。 C言語のreturnのように、途中で処理を戻す方法はありますか? (defun test-func () <中略> (if flag (message ”stop”) (message ”continue”)) <中略> )
37 名前:デフォルトの名無しさん mailto:sage [2012/03/20(火) 10:26:15.55 ] >>36 (defun f () (dotimes (n 10) (when (= n 5) (return-from f)) (print n))) 多分、return-fromが期待してるものだと思う。 www.lispworks.com/documentation/HyperSpec/Body/s_ret_fr.htm ただ、最近は、loop以外ではあまりreturn-fromって使わないと思う。
38 名前:36 mailto:sage [2012/03/20(火) 14:01:04.14 ] >>37 ありがとうございます。助かりました。
39 名前:36 mailto:sage [2012/03/20(火) 21:26:44.25 ] >>37 すいません。以下をEmacsの上で実行したのですが、 (defun temp (x) (if x (return-from temp 'dummy)) 44) (temp nil) => 44 はうまく行くものの、 (temp t) のほうは、以下のようにエラーが出てしまいます。 Debugger entered--Lisp error: (no-catch --cl-block-temp-- dummy) 正常終了してくれると助かるのですが。
40 名前:デフォルトの名無しさん mailto:sage [2012/03/20(火) 22:17:01.66 ] >>39 GNU Emacs Lispリファレンスマニュアル: Catch and Throw www.geocities.co.jp/SiliconValley-Bay/9285/ELISP-JA/elisp_127.html >Common Lispに関した注意: Common Lispを含むほとんどの他のLispには、 >非逐次的に制御を移す方法がいくつかある。 >たとえば、return、return-from、go。 >Emacs Lispにはthrowしかない。 common lispの関数がemacs lispにあるとは限らない一例だね
41 名前:デフォルトの名無しさん mailto:sage [2012/03/20(火) 22:21:45.26 ] Lispでオブジェクト指向プログラミングをやるときのスタイルについて質問です。 CLOSでオブジェクト指向をやろうとすると、オブジェクトのスロットの値の変更が必要になったりしますが、 Lisper的には普通にsetfで代入してしまうのか、あるいは変更する度に新しいオブジェクトを作ってそれを渡したりするのでしょうか。 そもそも関数プログラミングとオブジェクト指向やクロージャって相容れないように思えます。
42 名前:デフォルトの名無しさん mailto:sage [2012/03/20(火) 22:40:53.03 ] >>39 (require 'cl) でreturn-fromを使えるようになるけれど、 elispのdefunはブロックを作らないので、 (defun temp (x) (block temp (if x (return-from temp 'dummy)) 44)) とするか、Common Lispのdefun互換のdefun*を使って (defun* temp (x) (if x (return-from temp 'dummy)) 44) ここまで書いといてなんだけれど、elispに関してはこっちで Emacs Lisp 3 toro.2ch.net/test/read.cgi/tech/1191875993/
43 名前:36 mailto:sage [2012/03/20(火) 23:15:25.05 ] >>40 >common lispの関数がemacs lispにあるとは限らない一例だね あー、なるほど。 >>42 何から何まで親切にありがとうございました。
44 名前:デフォルトの名無しさん mailto:sage [2012/03/20(火) 23:19:46.67 ] いいってことよ!
45 名前:デフォルトの名無しさん mailto:sage [2012/03/20(火) 23:25:16.97 ] >>41 CLOSは普通に代入するスタイルですねー。 ただし、仰るような、関数的なオブジェクトシステムも存在します。 自分は以前Schemeで書かれたものをちらっと見掛けた程度ですが。 それと、OOPはさておき、クロージャは関数プログラミングでは不可欠な概念だと思います。 これがないと、例えばHaskellでもモナドのbindができなくて困るんじゃないでしょうか。
46 名前:デフォルトの名無しさん mailto:sage [2012/03/20(火) 23:28:00.07 ] 被るし、良く分からんのだけど、聞いた話の受け売りで。 >41 CLの基本データ構造はミュータブル。 racket,clojureはイミュータブル。 ・・・らしい。 イミュータブル(純粋な関数型)とオブジェクトの話は、CLではあまり関係ないかも。 またイミュータブル中心でも、ocamlやscalaみたいに、直交させてるのもあるし、clojureみたいに別の方法で代用させたりしてるのもある。 クロージャーはウィキぺさんに書いてあるみたいに言語によって扱いが違うかも。 ja.wikipedia.org/wiki/%E3%82%AF%E3%83%AD%E3%83%BC%E3%82%B8%E3%83%A3 そして純粋な関数型でも、限定継続みたいな手法で、複雑な制御構造を復活させたりしてる。
47 名前:はちみつ餃子 ◆8X2XSCHEME mailto:sage [2012/03/20(火) 23:51:13.61 ] >>41 例えば C++11 に導入される lambda 構文を見てみると、 実態はオブジェクトに過ぎない。 cpplover.blogspot.com/2009/12/lambda.html クラス定義をちょろっと省略できるだけの構文糖だ。 C++ は GC を前提としていないので変数キャプチャのルールが少しばかり面倒だが、 要するにクロージャとオブジェクト (レコード) は抽象化の仕方が違うだけで 変数の束を閉じ込めるという意味では同じとも言える。 C++ で lambda が導入できるなら逆に Lisp でオブジェクト (レコード) とメソッドで オブジェクト指向するのも別にアリじゃね? クロージャとオブジェクトの関係を説明した面白い記事があるので紹介しておく。 www.ibm.com/developerworks/jp/opensource/library/itm-progevo3/index.html www.ibm.com/developerworks/jp/opensource/library/itm-progevo4/index.html
48 名前:デフォルトの名無しさん mailto:sage [2012/03/21(水) 01:18:50.29 ] CLじゃ、標準だから当たり前だけど、CLOSは普通に使われてるんだよね。 自作オブジェクト指向システムも良いかもしれないけど、 自作ライブラリには、もれなく自作オブジェクト指向システムも付いてくることになったら正直辟易
49 名前:デフォルトの名無しさん mailto:sage [2012/03/21(水) 01:53:19.98 ] クロージャは評価される度に内部状態が変わるような例題のイメージが強かったので副作用必須かと思ってけど、実際はそうでもないのか
50 名前:デフォルトの名無しさん mailto:sage [2012/03/21(水) 06:06:37.80 ] >>49 (let ((n 0)) (defun f () (print (incf n)))) とかのことですか? この手のコードは、変数のエクステントが分かりやすいから良く例に使われますけど、 関数fに参照透明性がない(副作用がある)のは、単に破壊的変更のせいです。 (let ((n 0)) (lambda () n)) のような形でもクロージャは良く使われますが、この式が返す関数に副作用はありません。
51 名前:デフォルトの名無しさん mailto:sage [2012/03/21(水) 06:27:42.40 ] >>50 流石に例が不親切だった気がするので、もう少し実際のコードに出てきそうな例を。 (defun x+-all (x l) (mapcar (lambda (y) (+ x y)) l)) こんな感じで、レキシカル変数を参照することは多いです。
52 名前:デフォルトの名無しさん mailto:sage [2012/03/21(水) 10:23:39.39 ] これくらいじゃないとクロージャーっぽくないと思う (defun x+-all (x l) (mapcar (lambda (y) (lambda () (+ x y))) l))
53 名前:デフォルトの名無しさん mailto:sage [2012/03/22(木) 08:34:48.40 ] >>49 λ式の評価器に必要なのがクロージャですから。 funarg問題のために。
54 名前:デフォルトの名無しさん [2012/03/23(金) 21:01:06.44 ] 任意の数の引数を取る関数に、一個一個引数をつけるのではなく、 リストか何かでまとめて渡したいのですが、どう記述すれば良いですか? (setq item1 '(item ”1”)) (setq item2 '(item ”2”)) (setq item3 '(item ”3”)) (widget-create 'radio-button-choice item1 item2 item3) の代わりに、 以下のように記述したいのですが。 (setq itemList '(item1 item2 item3)) (widget-create 'radio-button-choice 'itemList);; //NG
55 名前:デフォルトの名無しさん mailto:sage [2012/03/23(金) 21:19:50.26 ] apply?
56 名前:54 mailto:sage [2012/03/23(金) 22:42:16.67 ] >>55 applyとwidget-createの組み合わせだとうまく行きませんでした。 (apply 'widget-create 'radio-button-choice '(item1 item2 item3)) ;;NG (widget-create 'radio-button-choice item1 item2 item3) ;;OK 以下だとうまく行ったのですが。 (defun seki3 (x y z) (interactive ”r”) (eval (* x y z))) (apply 'seki3 '(2 3 4)) ;;OK (apply 'seki3 2 '(3 4)) ;;OK widget-create関数の使い方として以下を参考にしています。 なんとかリストで渡して選択画面を作りたいのですが。 www.dina.kvl.dk/~abraham/custom/widget.html#SEC16
57 名前:デフォルトの名無しさん mailto:sage [2012/03/23(金) 23:01:52.31 ] >>56 Emacs Lisp 3 toro.2ch.net/test/read.cgi/tech/1191875993/ (setq itemList '(item1 item2 item3)) だと item1などが評価されない。 (setq itemList (list item1 item2 item3)) (apply 'widget-create 'radio-button-choice itemList)
58 名前:54 mailto:sage [2012/03/23(金) 23:33:47.68 ] >>57 できました。ありがとうございます。
59 名前:デフォルトの名無しさん [2012/03/24(土) 06:22:34.52 ] ごく基本的に質問ですみません。 リストのn番目の要素の値を変更はどのように書けば良いのでしょうか? たとえば、 (setq x '(”a” ”b” ”c” ”d”)) というリストがあった場合に、"c"の値を"C"と変更するにはどう書けば良いのでしょうか?
60 名前:デフォルトの名無しさん mailto:sage [2012/03/24(土) 06:28:40.96 ] >>59 www.geocities.jp/m_hiroi/xyzzy_lisp/abclisp10.html#chap20 とか参照
61 名前:59 mailto:sage [2012/03/24(土) 06:57:45.55 ] >>60 ありがとうございます。
62 名前:デフォルトの名無しさん mailto:sage [2012/03/24(土) 19:47:28.72 ] >>59 (setf (car x) "1") とか (setf (nth 2 x) "2") とか… function ではなく accessor と分類されているオペレーターは setf と組み合わせて 破壊的操作に使用可能 詳細は以下の 5.1.1 と 5.1.2 www.lispworks.com/documentation/HyperSpec/Body/05_a.htm
63 名前:デフォルトの名無しさん mailto:sage [2012/03/26(月) 16:47:20.88 ] emacsのslimeでcommon lispのソースを編集している際、 slime-eval-last-expressionで任意のs式を評価した結果(返り値)を そのs式の直後に改行して結果を貼り付けることはできないでしょうか。 今はソースのs式をコピーしてslimeのreplで評価し、 その結果をソースに手作業で貼り付けおり、面倒です たとえば(ceiling 1.1)とあるとき (ceiling 1.1) ;; result: 2 ;; result: -0.9 こういうふうに結果をs式の後に追記したいのですが、何か方法はありますか。
64 名前:デフォルトの名無しさん mailto:sage [2012/03/27(火) 07:09:50.36 ] C-u M-x slime-last-expression
65 名前:デフォルトの名無しさん [2012/03/27(火) 07:14:32.67 ] slime-eval-print-last-expression
66 名前:デフォルトの名無しさん mailto:sage [2012/03/27(火) 07:15:22.35 ] 間違えてageた上に遅れたorz
67 名前:デフォルトの名無しさん mailto:sage [2012/03/27(火) 17:15:23.32 ] >>64-66 ありがとうございます。捗るようになりました。
68 名前:デフォルトの名無しさん mailto:sage [2012/03/27(火) 17:32:57.87 ] M-x slime-scratch っていう手もある
69 名前:デフォルトの名無しさん [2012/03/27(火) 22:16:40.23 ] CommonLispでclojureの -> みたいな関数ありましたでしょうか?
70 名前:デフォルトの名無しさん mailto:sage [2012/03/27(火) 23:04:33.45 ] www.lispworks.com/documentation/HyperSpec/Front/X_Master.htm で確認する。 もしくは、slimeで、 -> の上にカーソルを持っていき、M-x slime-hyperspec-lookup すると ミニバッファに->が表示され、スペースや、リターンでは、[No match]になる。 つまり標準にはないということが分かる
71 名前:デフォルトの名無しさん mailto:sage [2012/03/27(火) 23:16:01.18 ] >>69 同じような機能のものってことなら、CommonLispにはないんじゃないかな Clojureのはメタ情報を活用してるから、同じ使い勝手のものを再現するのはなかなか難しいかも
72 名前:デフォルトの名無しさん mailto:sage [2012/03/27(火) 23:49:05.61 ] Clojureの -> (arrow macro) を使うと (list (int (Math/sqrt 25))) を (-> 25 Math/sqrt int list) と書けるのか
73 名前:デフォルトの名無しさん mailto:sage [2012/03/28(水) 17:20:39.81 ] paipとpclを読み終わってcommon lispでたいていのことはできるようになったと思います そこで質問しますが、common lispのスキルを上げるというかステップアップするには どういうものに取り組めばよいでしょうか? 2,3年で廃れてしまうかもしれない流行に左右されるよりも、 10年20年先でも通用するような新しい試みが何かあれば知りたいです
74 名前:デフォルトの名無しさん mailto:sage [2012/03/28(水) 17:58:32.17 ] 単にCommon Lispの知識が得たいなら、リーダーマクロやコンパイラマクロ、 パッケージやCLOS、MOPなどの細かい機能について調べれば良いと思うけど、 そういうこと? あとはマクロの応用とか。好みから微妙に外してる気がするけど。 現在のLispの世界では、あまり先進的な言語機能って研究されてないと思う。 Common Lispは今進化が止まってるし。Schemeのhygienic macroくらい?
75 名前:デフォルトの名無しさん mailto:sage [2012/03/28(水) 18:30:00.45 ] 処理系の実装やハック。有名なソースの読解やオープンソースやブログでの公開。 他には計算機科学系の論文でも漁ってCommon Lispの機能で実装してみるとか? 数年先にどんな技術が通用するかなんて分からんよ。 それに言語は目的があって使うものだから、言語自体のスキルアップの意味が分からん。 先進的な機能はライブラリとして実装されるから、言語自体の進化には見えないだけ。
76 名前:デフォルトの名無しさん mailto:sage [2012/03/28(水) 19:03:10.94 ] さっき思い付いたけど、限定継続とかは割とLisp方面でも積極的に研究されてる気がする。 元ネタはFilinskiの論文? まあこっちもSchemeなんだけども。 言語自体を深く知ってもあまり意味がないことには同感。 他の言語で基礎はもうできあがってて、単にCommon Lispに親しみたいのか、 言語の機能は把握したので、次にアルゴリズムやデータ構造を知っていきたいのか、 その辺も教えてもらえれば、みんなもっと適切な助言をしてくれるんじゃないかな。
77 名前:デフォルトの名無しさん mailto:sage [2012/03/28(水) 20:32:25.56 ] 73です 皆さんありがとうございます >>74 処理系自体を改変することよりも、使い方を磨こうと思っています。うまく言えなくてすみません。 >>75 >先進的な機能はライブラリとして実装されるから、言語自体の進化には見えないだけ。 これは盲点でした。たしかにそうですね そして、paipを読んで強く思ったのですが、 >>76 さんのおっしゃるところのアルゴリズムやデータ構造が知りたい内容だとわかりました。 それらを体系的に(試しながら)勉強できる、(common)lispを使う教材があれば知りたいです。
78 名前:デフォルトの名無しさん mailto:sage [2012/03/28(水) 20:50:13.66 ] ちょっと目標が遠大すぎる気もするし まあこんなとこから始めて様子を見たらどうだろう www.geocities.jp/m_hiroi/xyzzy_lisp.html
79 名前:デフォルトの名無しさん mailto:sage [2012/03/28(水) 23:48:51.63 ] いまさらアルゴリズムやデータ構造を知りたいのはプログラム自体の初心者か。 言語毎の差異は小さいから、アルゴリズム系の本を買ってCommon Lispで実装すると良いよ。 逆引きCommon LispやCommon Lisp CookBookのコード例も参考になる。 あとは定評のあるソースをたくさん読んで、とにかく何か自前で書く。 どの言語でも入門がすんだ後の本はあまりない。他人のソースを参考に自前で書くのが一番。 あとOn Lispは必読。
80 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/03/29(木) 08:10:18.10 ] 限定継続の勉強ならSchemeのほうがいいんじゃないかな。 限定じゃない継続を使ってさくっと実装できるし。
81 名前:営利利用に関するLR審議中@詳細は自治スレへ [2012/03/29(木) 23:04:37.03 ] >>70 >>71 無いですか。わかりました。ありがとうございました。
82 名前:営利利用に関するLR審議中@詳細は自治スレへ [2012/03/31(土) 14:57:12.70 ] (setq allList '(("a" . ("a1" "a2" "a3")) ("b" . ("b1" "b2" "b3")) ("c" . ("c1" "c2" "c3")))) 上のような連想リストallListのなかの、"b"に対応する配列を差し替えたいのですが、 以下の(1)のように直書きするとうまく行くのですが、(2)のように(setf (nth 1 allList) '("b" . bList));と実行すると、 (3)以降を実行するのに、Wrong type argument: sequencep, bListとエラーが出ます。 どのように記述すればできますか? (setf (nth 1 allList) '("b" . ("b01" "b02" "b03" "b04")));;(1)OK (setq bList '("b01" "b02" "b03" "b04")) (setf (nth 1 allList) '("b" . bList));;(2)NG (setq myList (cdr (assoc "b" allList)));;(3)bの内容の表示 (setq i 0) (while (< i (length myList)) (message (concat "myList(" (int-to-string i) "):" (nth i myList))) (setq i (+ i 1)))
83 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/03/31(土) 15:13:17.35 ] >>82 (assoc "b" allList :test #'equal) www.lispworks.com/documentation/HyperSpec/Body/f_assocc.htm#assoc www.lispworks.com/documentation/HyperSpec/Body/17_ba.htm
84 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/03/31(土) 22:59:57.73 ] concatで怒られてるんじゃね? '("b" . bList) だと bListが評価されないから (list "b" . bList)に置き換えてみ。
85 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/03/31(土) 23:15:35.66 ] >>84 間違えたorz (cons "b" bList) か。
86 名前:82 mailto:sage [2012/03/31(土) 23:15:56.58 ] >>83 ありがとうございます。 >(setf (nth 1 allList) '("b" . bList));;(2) (2)のbListになにか符号をつけるなりして、(1)と同じかたちで読み込ませることはできるのでしょうか?
87 名前:82 mailto:sage [2012/03/31(土) 23:17:18.54 ] あ、ちょうどタイムリーに回答いただけました。試してみます。ありがとうございました。
88 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/01(日) 11:55:56.24 ] herokuでsbclで動くのかな? www.slideshare.net/mtraven/lisp-in-the-cloud
89 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/01(日) 12:01:58.56 ] https://github.com/mtravers
90 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/01(日) 12:12:50.47 ] >>88 buildpack使って書いたみたいね。 https://devcenter.heroku.com/articles/buildpacks
91 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/01(日) 12:18:17.88 ] >>89 これはClozure CLベースで、それを元に作った https://github.com/jsmpereira/heroku-buildpack-cl がSBCLベースだな。
92 名前:営利利用に関するLR審議中@詳細は自治スレへ [2012/04/02(月) 18:41:37.93 ] hunchentootについて教えて下さい。 複数のサブドメインを一つのサーバで扱おうと考えています。 cc.bb.com://AA/BB.html => cc.bb.com://cc/AA/BB.html の様にしてサブドメインをディレクトリに変換したいのです。 hunchentoot:hostでドメイン名が取得出来る事は分かったのですが、 うまくフック出来ません。 (defmethod handle-request :before ((*acceptor* hunchentoot::acceptor)(*request* hunchentoot::request))...) (defmethod hunchentoot:process-request :before ((*request* hunchentoot::acceptor))...) 共に全く引っかかりません。(一度も実行されないって事です) あと、この変換後の値で通常のディスパッチをさせたいのですが、そのやり方も教えて頂けませんでしょうか。 ググってもうまくサンプルが見つけられません。HUNCHENTOOTのドキュメントは簡単過ぎて私には全く役に立ちません。 ちなみにLISPもCLOSもWEBアプリケーションも初心者ですんで見当外れな事を書いてるかもしれませんので 目的が達成出来るなら手法にはこだわりません。ヒントで構いませんのでお願いします。
93 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/02(月) 19:48:07.09 ] Apacheやnginxをリバースプロキシに仕立てた方が楽な気がする。 コンテンツごとに別々のacceptor作って。
94 名前:営利利用に関するLR審議中@詳細は自治スレへ [2012/04/02(月) 20:51:44.84 ] >>93 ありがとうございます。 それも検討してみます。Apacheなんかで受けて各々振り分ける形ですよね。 あとは全てのアクセスを引き取って自分でディスパッチャー実装しちゃうとかも考えています。 レンタルVPSなんでメモリーがタイトなんですよ。出来たら裏で重い処理を走らせたいし。 アクセスはほとんど無いんで勿体ないってのもあります。 やり方さえ分かれば数行で出来る処理だと思うんだけどいかんせん資料が見つからないんですよ。 全称関数に:beforeを付ければ処理に割り込めるってのはあってます? hunchentootのソースコード読めば理解出来るものでしょうか? googleコードサーチも終わっちゃったんで、サンプル探すのに koders上でhunchentootで検索しても25(重複入れても59)件しか無いとかどうしましょう。 あと、PORT指定なんかしてたんで混乱してました。 cc.bb.com/AA/BB.html => cc.bb.com/cc/AA/BB.html ですね。自分でも笑っちゃいます。
95 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/02(月) 22:28:50.87 ] なるほど。じゃあ、hunchentoot:acceptor-dispatch-requestの特殊化は? 適当にacceptorを継承したクラスを作って、それ用のacceptor-dispatch-requestを定義して、 そのメソッドの中でrequestのホストを見て処理を分岐すれば良さそうな気がする。 acceptor.lispとかeasy-handlers.lispに書いてる既存の定義を見ればやり方は分かると思う。 流し読みなんで外してたらごめん。
96 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/02(月) 22:36:28.40 ] hunchentoot-vhost.lispってのがある。
97 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/02(月) 22:43:35.76 ] これか。 > (ql:system-apropos "vhost") #<SYSTEM hunchentoot-vhost / hunchentoot-vhost-20110418-git / quicklisp 2012-03-07>
98 名前:営利利用に関するLR審議中@詳細は自治スレへ [2012/04/02(月) 23:34:26.97 ] >>95 流石です。発想が柔軟ですね。 私の中ではまだどうもLISPとオブジェクト指向が繋がっていないんですよ。 コードまで参照して下さったのですか? 理屈の上ではそれで行けそうです。あとは私の努力次第ですかね。 ありがとうございます。 >>96 ありますね。これは用途的にはバッチリみたいなんですが 使い方が簡単には見つかりませんね。探してみます。 ソースは短いんですけど私には難しいです。 >>97 お陰様でQLでロードまでは出来ました。
99 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/03(火) 00:27:47.14 ] >>98 サンプルコード書いたよー。 paste.lisp.org/display/128721 hunchentoot-vhostは~/quicklisp/dists/quicklisp/software/hunchentoot-vhost-20110418-gitに READMEがあるので、そこに使い方書いてるよー。
100 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/03(火) 00:40:29.33 ] script-nameの変更ミスってたので修正。 paste.lisp.org/display/128725
101 名前:営利利用に関するLR審議中@詳細は自治スレへ [2012/04/03(火) 01:52:24.31 ] >>99 vhostのそれをずっと見ていたのですがserverに何入れるのかとか ずっと悩んでいました。hunchentoot:serverってあるのに。。。 LISPのドキュメントやエラーメッセージなんか今一つコツが掴めません。 エラーなんかもパラメタの数が違うとかは見つかるのですが どこのエラーだか見当もつきません。書いてあるのですかね? >>100 素晴らしい! localhostと127.0.0.1で切り替わりました。これで行きたいと思います。 わざわざサンプルまでありがとうございます。 hunchentoot:acceptor-dispatch-requestなんですね。 もう一つ下だったか。。。
102 名前:営利利用に関するLR審議中@詳細は自治スレへ [2012/04/03(火) 03:15:19.72 ] >>100 さんのお陰さまで思い通りのものが出来ました。 要望はありませんが、嬉しいので勝手にあげます。 以下を追加するだけで今までのコードを一切変更する事なく ttp://cc.bb.aa/AA/BB.html => ttp://cc.bb.aa/aa/bb/cc/AA/BB.html として扱う様になります。(仕様が変わっていますが、当初の目的はこれです) ASPECT指向(って言うのかな?)万歳??? --- (defmethod hunchentoot:acceptor-dispatch-request :before ((acceptor hunchentoot:easy-acceptor) request) (flet ((add-prefix (x) (format nil "~{/~a~}~a" (reverse (split-sequence:split-sequence #\. (hunchentoot:host))) x))) (setf (slot-value request 'hunchentoot::uri) (add-prefix (hunchentoot:request-uri request)) (slot-value request 'hunchentoot::script-name) (add-prefix (hunchentoot:script-name request)))) ) --- fletやらadd-prefixなんかの意味は分かっていないのですが、動いたのでOKです。
103 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/03(火) 03:52:19.47 ] おめっとー。 fletはローカルな関数を定義する特殊形式で、 件のコードではadd-prefixってローカル関数を定義してる。 似たような処理が複数あるけど他では使わない、ってときに使うと便利。
104 名前:営利利用に関するLR審議中@詳細は自治スレへ [2012/04/03(火) 18:56:29.74 ] >>103 ありがとう! LISPすごいよ!他の言語じゃこうはならないんじゃないかな。 LISPもっと早く始めていればよかったな。 LISPERの人に怒られそうだけど、括弧がキモくて避けていたんですよね。 UNIXシェル程度にLISPのREPLが使えてたら生産性が段違いだったろうに。 fletも一応軽くネットで調べたんですけどよく分からなかったのですよ。 >似たような処理が複数あるけど他では使わない、ってときに使うと便利。 と言われてみると何となくやってる事がわかりますね。 ありがとうございました。
105 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/04(水) 01:48:02.07 ] (flet ((test (x) (not (pathname-match-p x #p"~/quicklisp/dists/**/")))) (cl-fad:walk-directory "~/quicklisp/" #'print :test #'test))
106 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/04(水) 02:04:25.45 ] ちょっと訂正。多分これで大丈夫な気がする。 (flet ((test (x) (not (pathname-match-p x #p"~/quicklisp/dists/**/*")))) (cl-fad:walk-directory #p"~/quicklisp/" #'print :test #'test))
107 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/04(水) 21:50:35.95 ] paul grehamのon lispにmappendというユーティリティ関数が出てきます。 mapcarした物をappendで繋げるという関数です。その実装がこうなっています。 (defun mappend (fn &rest lsts) (apply #'append (apply 'mapcar fn lsts))) なぜ&restを使っているのでしょうか? 可変長にした所で可変長の引数を使うとエラーになりますし ex: (mappend #'identity '(asdf zxcv) '(asdf zxcv)) applyを使いたいがためにしか思えません。(applyを使うと周りの括弧が一つ外れるが、&restは副作用で周りに括弧が一つつくから) ↓なぜこうしないのでしょうか? (defun mappend (fn lsts) (apply #'append (mapcar fn lsts)))
108 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/04(水) 22:07:14.32 ] >>107 2引数以上取れる関数を使えや ex: (mappend #'list '(asdf zxcv) '(asdf zxcv))
109 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/04(水) 22:09:35.99 ] >>107 エラーが出てるのはidentityがひとつの引数しか取らないからだと思う。 (mappend #'list '(0 1 2) '(3 4 5) '(6 7 8)) ;=> (0 3 6 1 4 7 2 5 8) 後者の場合、多くのケースでわざわざリストを一度作って渡さないといけなくて不便。 (mappend-2 #'identity '((0 1 2) (3 4 5) (6 7 8)))
110 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/04(水) 22:28:23.29 ] >>108 ,109 なるほど!2つ以上の引数を取る関数について考えていませんでいた。 その際&restが生きてきますね。御二方レス有難うございました
111 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/04(水) 22:30:18.29 ] あと書き忘れたけど、>>107 の後者のは意味変わっちゃってる。mapcarの部分で。
112 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/04(水) 23:12:38.27 ] 意味が変っちゃってるというのは後者で(mappend #'list '(asdf zxcv) '(asdf zxcv)) というような事ができないという事を言いたいのですか?
113 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/05(木) 01:57:15.50 ] 試せばすぐ分かるのに。データの渡し方を別としても、関数の挙動が変わってる。 (mappend #'list '(asdf zxcv) '(asdf zxcv)) ;=> (ASDF ASDF ZXCV ZXCV) (defun mappend-2 (fn lsts) (apply #'append (mapcar fn lsts))) (mappend-2 #'list '((asdf zxcv) (asdf zxcv))) ;=> ((ASDF ZXCV) (ASDF ZXCV)) (defun mappend-3 (fn lsts) (apply #'append (apply #'mapcar fn lsts))) (mappend-3 #'list '((asdf zxcv) (asdf zxcv))) ;=> (ASDF ASDF ZXCV ZXCV)
114 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/05(木) 20:37:11.59 ] その事でしたか。&restを使わない + applyを使わない で &restもapplyも使っている関数を再現しようとした所でした。 (mappend #'list '(asdf zxcv)) ;=> (asdf zxcv) (mappend-2 #'list '(asdf zxcv)) ;=> (asdf zxcv) 引数を2個取る関数について考慮していなかったのでダメでしたが。 では、これにて失礼します。ありがとうございました。
115 名前:デフォルトの名無しさん [2012/04/11(水) 20:59:50.24 ] MacOSX(LION) の CLISPにASDF-INSTALL を導入したいのですがやりかたがどうにもわかりません。 いちばん普通のやりかたはどうやればいいのでしょうか。
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って・・・。