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))
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
176 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 01:31:07 ] >>173 任意のファイル開いて諸元の一部を表示して、入力欄の数値を使って解析して 結果を別の名前のファイルでしまうっていうタイプのよくある奴です。 入力欄に日本語のコメントつっこんだらLTKが毎回落ちるので orz ATOK使ってるせいかもしれないけど。
177 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 01:46:55 ] >>176 lispuser.net のスクリーンショットでは LTK の日本語入力できていたようだけどなー。 文字コードの設定まちがってるとかない?日本語入れたいなら LispWorks も厳しいかもねぇ。 IME のインライン入力なんか対応してる気配ゼロです。
178 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 08:28:50 ] >>177 おはようございます。 ご指摘の通りエンコードでした、cp1250だからラテンになってました。 lispuser.netとかの記事とltk.lisp本体を参考にして次のようなフック組んだらなんとかなりました。 (defun wish-enable-japanese () (let* (( s (ltk:wish-stream ltk:*wish*)) ( i (two-way-stream-input-stream s)) ( o (two-way-stream-output-stream s)) ( n (make-two-way-stream (sb-sys:make-fd-stream (sb-sys:fd-stream-fd i) :input t :external-format *CURRENTENCODE*) (sb-sys:make-fd-stream (sb-sys:fd-stream-fd o) :output t :external-format *CURRENTENCODE*)))) (setf (ltk:wish-stream ltk:*wish*) n))) (pushnew 'wish-enable-japanese ltk:*init-wish-hook*) set-external-formatとか(setf (external-format is))とかで処理できるかと思ったのですがデキマセンでした。 ここで小一時間ほど時間を食ってしまいました(仕事に遅れるかと思ったです@通勤電車) #slimeからだとutf-8でlispファイルダブルクリックだとsjisなのもなんとかしたいなぁ。 Lispworksですがpersonal版はちゃんとime制御されていましたのでそんなに心配はしてないのですが、いかんせん今の円ドルレートだと送料込みで16万超えるのでショボーンって感じです。 allegroは絶対安全なんですが、事業所内分のランタイムライセンス出せません(w
179 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 08:43:45 ] うう、lispファイルダブルクリックだとエンコードが何になるのかわからないです > _ < ltkの戻りはutf-8で食えばsbcl側で認識するんですが orz コンパイル時のエンコードがどこかにあるのかな?
180 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 21:05:02 ] (setf sb-impl::*default-external-format* :cp932) ググリまくって該当する解見つけました、
181 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 17:02:03 ] numberp とかの p は predicate の p ですか property の p ですか? たぶんどっちもありかも知れませんが、 property の p だという記述を見つけて気になったもので。
182 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 17:05:39 ] predicateに決まってるじゃん。number propertyじゃ意味わからん。
183 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 17:12:21 ] >>182 ttp://nicosia.is.s.u-tokyo.ac.jp/pub/essay/hagiya/kaisetsu/lisp_nyuumon
184 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 17:20:29 ] >>183 単なる間違いだと思うが
185 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 17:32:59 ] >>183 たんなるミスでしたか。predicate だと思ってたので、あれ?って感じで。 (数値の性質 obj) でも通じるかなぁと。
186 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 22:52:18 ] どんだけ肩書き補正かかってんだよ。 predicate ったら predicate 〜 匿名の言う事よりも肩書を信じたいなら、GLS も predicate の略だといっている、と覚えよう。
187 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 23:54:50 ] 俺の本にも述語(predicate)って書いてあるよ。
188 名前:デフォルトの名無しさん mailto:sage [2007/07/07(土) 12:19:17 ] >>163-164 ちょっと効率よくしてみた (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))) (catch 'solved (abura (list start))))) (defun abura (goal-stack) (let ((state (first goal-stack))) (cond ((funcall *goal-p* state) (throw 'solved (reverse goal-stack))) ((member state (rest goal-stack) :test #'equal) nil) ((some #'(lambda (amt cap) (> amt cap)) state *capacity*) nil) (t (dolist (s (successors state)) (abura (cons s goal-stack))))))) 違うのは catch, throw を使うようにしたところ。 これで abura の再帰呼び出し部分の reduce, mapcar がなくなった。 あとは lset も copy-seq と破壊的操作にすると少しだけ空間効率がよくなるみたい。
189 名前:デフォルトの名無しさん mailto:sage [2007/07/07(土) 16:15:51 ] 質問です。 対話によるCommon Lisp入門 栗原正仁 著 p103で (defun to (b) (< (random 1.0) b)) という関数toが出てくるのですが、 これが副作用を持つと書いてあります。 どこに副作用が有るのでしょうか?
190 名前:デフォルトの名無しさん mailto:sage [2007/07/07(土) 16:17:29 ] >>189 random
191 名前:デフォルトの名無しさん mailto:sage [2007/07/07(土) 22:39:11 ] え、randomって副作用なんですか? 副作用ってsetfで変数に値を代入したり、 defunで関数が使えるようになる事じゃないんですか?
192 名前:デフォルトの名無しさん mailto:sage [2007/07/07(土) 22:46:39 ] randomは疑似乱数列を返す。つまり、どういう順序でどういう数値が返るのか あらかじめ決定している。従って、randomを呼ぶか呼ばないかによって、次の randomで返る値は変化する。これを副作用と呼ばずして何を副作用と呼ぶ?
193 名前:デフォルトの名無しさん mailto:sage [2007/07/07(土) 22:56:50 ] ははぁ、成る程! 分かりました!
194 名前:デフォルトの名無しさん mailto:sage [2007/07/07(土) 22:57:19 ] 引数が同じなら何度呼んでも結果が変わらないのが副作用のない関数だよ。 したがって random には副作用がある。
195 名前:デフォルトの名無しさん mailto:sage [2007/07/07(土) 23:02:23 ] こんなに詳しく解説していただいて感動です。 精進します。
196 名前:169 mailto:sage [2007/07/07(土) 23:29:11 ] >>170 , 172 返答どうもです。とりあえず、(asdf:oos 'asdf:load-op :htmlgen)もしくは(require :htmlgen) で、何やらいろいろ読み込んでいるメッセージがでます。そのあと、サンプルファイルtest.clをloadしたいのだけど、 失敗します。test.clはファイルの先頭行で (defpackage :user (:use :htmlgen))をしているのだけど、(load "test.cl")したときに、 ----ここから debugger invoked on a SB-KERNEL:SIMPLE-PACKAGE-ERROR: The name "HTMLGEN" does not designate any package. Type HELP for debugger help, or (SB-EXT:QUIT) to exit from SBCL. restarts (invokable by number or by possibly-abbreviated name): 0: [ABORT] Exit debugger, returning to top level. (SB-INT:%FIND-PACKAGE-OR-LOSE "HTMLGEN") ----ここまで というエラーがでます。"HTMLGEN"というパッケージは存在しないという 内容のように見えますが、これはつまり最初の読み込みがうまく行ってないということでしょうか?
197 名前:169 mailto:sage [2007/07/07(土) 23:30:13 ] >>196 の続き htmlgen.asdファイルは以下のようになってます。 ----ここから kengo@Somali:/usr/share/common-lisp/source/htmlgen$ view htmlgen.asd ;;; -*- mode: lisp -*- (defpackage #:htmlgen-system (:use #:cl #:asdf)) (in-package #:htmlgen-system) (defclass acl-file (cl-source-file) ()) (defmethod source-file-type ((c acl-file) (s module)) "cl") (defsystem htmlgen :author "John K. Foderaro" :licence "LLGPL" :default-component-class acl-file :components ((:file "htmlgen")) :depends-on (acl-compat) :perform (load-op :after (op htmlgen) (pushnew :htmlgen cl:*features*))) ----ここまで まずasdfについて勉強しないと駄目なのかな・・・さっぱりわからん。。
198 名前:デフォルトの名無しさん mailto:sage [2007/07/07(土) 23:38:24 ] >>194 > 引数が同じなら何度呼んでも結果が変わらないのが副作用のない関数だよ。 ちょっと語弊があるんじゃないか? 結果って書くと普通は戻り値と解釈されることが多いが、戻り値が一定でも 副作用のある関数を書くことはできる。 逆に現在時刻を返す関数等は副作用があるとは言わないと思うし。
199 名前:デフォルトの名無しさん mailto:sage [2007/07/07(土) 23:47:54 ] 横レスだけど、 >逆に現在時刻を返す関数等は副作用があるとは言わないと思うし。 全く同じ引数を渡したのに毎回異なる結果(現在時刻)を返すのであれば、 参照透明が崩されるので副作用があると思います。 現在時刻に合わせて変動する環境へのポインタみたいなのを引数に渡す 様になっていればその限りでは無いと思いますが。
200 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 00:36:21 ] >>196 ubuntuのだとhtmlgenのパッケージ宣言がnet.html.generatorになっていてtest.clと異なるからダメポみたいだね。 取り合えずこうやって呼び出しパッケージ変更すると先にはいけます (require :htmlgen) (defun simple-table-a () (with-open-file (p "test.html" :direction :output :if-exists :supersede) (net.html.generator:html-stream p ;;net.html.generator:パッケージを指定 (:html (:head (:title "Test Table")) (:body (:table (:tr (:td "0") (:td "0")) (:tr (:td "1") (:td "1")) (:tr (:td "2") (:td "4")) (:tr (:td "3") (:td "9")) (:tr (:td "4") (:td "16")) (:tr (:td "5") (:td "25")))))))) でもこれよりhtml-templateの方が使いやすい気がするんだけどそれじゃいやなのかな? #実はcgiでlisp使おうとしてるんで学習がてらです。 #ちっともlisp自体には詳しくないです。
201 名前:200 mailto:sage [2007/07/08(日) 00:37:43 ] うぐ、コードはtest.clの物です、インデントは脳内で補間してください
202 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 00:42:57 ] 副作用という単語の定義の問題だと思う。個人的には時間取得関数を「副作用がある」と言う のには抵抗を感じる。便宜的に「副作用がある」と宣言して、ある種の最適化を抑止しなければ ならないケース(言語)は多いと思うけど。 上記の乱数の例についても、もし予測不能な「真の乱数」(物理乱数)を返す関数だったらどう だろう、とか考えてしまった。(混乱させてしまったらごめんなさい)
203 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 01:07:57 ] >>202 (setf a (f x)) こう書いたときにaが常に一意に決まる関数は副作用が無い。 aの結果が変わることを無視すれば副作用は無いように 見えるかもしれないけど 副作用の無い関数を組み合せた結果 副作用のある関数が作りうるのは副作用が無いといえないのではないか? と、この観点では真の乱数は副作用があって、 疑似乱数で必ず種を受けとらないと動作しないものは副作用の無い関数として 扱ってよいと考える。 オプショナルで省略されたデフォルトグローバルな種を書き換えるかどうかは この場合あまり重要ではない。 参照透明性とか言っている人はこういう風に考えているんじゃないかなと思った。 違ったらスマヌ
204 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 01:10:26 ] >>196 > (defpackage :user (:use :htmlgen))をしているのだけど、(load "test.cl")したときに、 (defpackage :user (:use :cl :net.html.generator)) とすればいいよ。asd の定義は Makefile のプロジェクト名とターゲット指定相当なんで 実際の CL におけるパッケージ名とは別。パッケージ名は net.html.generator 。 というかそのパッケージにはドキュメントついてこないのか。ヒドいなぁ…
205 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 01:11:21 ] 思考実験をする前に、脳内定義を外界と摺り合わせしておくのも悪くない事だと思う サンプルとして、純粋関数型言語オタクの言う副作用はこんな感じ ttp://www.sampou.org/haskell/article/whyfp.html
206 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 01:54:47 ] wikipediaの副作用の項にある 1. 同じ条件を与えれば必ず同じ結果が得られる 2. 他のいかなる機能の結果にも影響を与えない が良く分からん。 1は当然として(パソコンの時間が狂ってたらアレだけれど)、 2はどういう意味なんだ? 上の例だと時間取得関数は、その戻り値(時間)を使用した 関数の結果には影響を与えるから副作用を持つ?
207 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 02:16:33 ] >>206 2. は(上記疑似乱数の例のように)その関数を呼び出すことによって、その後に呼び出す関数の 動作が変化しないという意味じゃないかな。例えば上の疑似乱数の例は呼び出すことによって乱数 の系列がずれてしまうので副作用がある。 (正直、君の言っている意味のほうが理解できない)
208 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 02:20:03 ] その関数呼び出しによってほかの場所に影響をあたえる、ってのが副作用じゃない? random を一回呼び出すと次の random 呼び出しに影響を与えるけど、 時刻取得関数を呼び出しても次の時刻取得関数には影響をあたえない。 戻り値は『ほかの場所』じゃないから気にしなくていいんじゃないかな。 って書いてたら >>206 に先を越された。
209 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 02:20:40 ] >>206 じゃなくて >>207
210 名前:デフォルトの名無しさん [2007/07/08(日) 02:28:09 ] >>206 ぶっちゃけ状態を扱う関数はみんな副作用がある関数と言える 1.が状態を取り出す 2.が状態を書き換える 副作用というと書き換えるほうをイメージしちゃって>>202 みたいに思っちゃう人が多い
211 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 02:31:14 ] >>199 全く同じ引数を渡した時に同じ結果を返す(いわゆる「純関数」である)というのは副作用とは別の概念じゃないかな。 例えばグローバル変数の値を返すという関数は「純関数」ではないが「副作用がある」とは一般には言わないと思う。 時間を返す関数もこれと同じだよね。 もちろん、副作用のある関数は(たとえ同じ引数に同じ結果を返しても)「純関数」とは呼ばないだろうけど。
212 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 02:33:05 ] >>210 ああ「取り出すほうも副作用と呼ぶ」のか。議論がかみ合わない理由がわかった。 日本語的には激しく抵抗があるが、そういう定義は一般的なの?
213 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 02:42:11 ] 関数型言語屋はそういう定義を使うことが多いね(偏見かな)
214 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 04:52:39 ] >>212 日本語的にとかいい出すなら、参照透明でないものを関数と呼ぶ方が抵抗あるだろ……。
215 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 05:51:37 ] Lispってこんなこともできねーの?
216 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 09:07:59 ] >>214 副作用って一般的にも使うし、そもそも「作用」の一般的な意味が | (1)他に力や影響を及ぼすこと。また、そのはたらき。 | 三省堂提供「大辞林 第二版」 だから、「取り出すほうも副作用と呼ぶ」なんて言うのは違和感が あるのはしょうがない。 対して、参照透明なんて普通の人はあまり使わんから、どんな定義 でも「はあそういう定義ね。」っで終わり。 専門用語と一般的に使われる言葉の意味が異なることは珍しくないよ。