1 名前:デフォルトの名無しさん mailto:sage [2009/01/13(火) 23:16:33 ] ※ ここはCommon Lisp、SchemeをはじめとするLisp族全般のスレです ※ Part24: ttp://pc11.2ch.net/test/read.cgi/tech/1224939205/ Part23: ttp://pc11.2ch.net/test/read.cgi/tech/1215875388/ Part22: ttp://pc11.2ch.net/test/read.cgi/tech/1211381920/ Part21: ttp://pc11.2ch.net/test/read.cgi/tech/1207300697/ Part20: ttp://pc11.2ch.net/test/read.cgi/tech/1205021786/ Part19: ttp://pc11.2ch.net/test/read.cgi/tech/1200237296/ Part18: ttp://pc11.2ch.net/test/read.cgi/tech/1186922295/ Part17: ttp://pc11.2ch.net/test/read.cgi/tech/1177065699/ Part16: ttp://pc11.2ch.net/test/read.cgi/tech/1172404795/ Part15: ttp://pc10.2ch.net/test/read.cgi/tech/1151025773/ Part14: ttp://pc8.2ch.net/test/read.cgi/tech/1132275726/ Part13: ttp://pc8.2ch.net/test/read.cgi/tech/1115901841/ Part12: ttp://pc8.2ch.net/test/read.cgi/tech/1100229366/ Part11: ttp://pc5.2ch.net/test/read.cgi/tech/1091456033/ Part10: ttp://pc5.2ch.net/test/read.cgi/tech/1075630259/ Part09: ttp://pc2.2ch.net/test/read.cgi/tech/1069594582/ Part08: ttp://pc5.2ch.net/tech/kako/1058/10582/1058263391.html Part07: ttp://pc5.2ch.net/tech/kako/1042/10421/1042167213.html Part06: ttp://pc3.2ch.net/tech/kako/1031/10315/1031560687.html Part05: ttp://pc3.2ch.net/tech/kako/1023/10230/1023091882.html Part04: ttp://pc.2ch.net/tech/kako/1016/10162/1016211619.html Part03: ttp://pc.2ch.net/tech/kako/1008/10082/1008220265.html Part02: ttp://pc.2ch.net/tech/kako/1002/10025/1002584344.html Part01: ttp://piza2.2ch.net/tech/kako/987/987169286.html
449 名前:デフォルトの名無しさん mailto:sage [2009/03/07(土) 20:28:14 ] 現在のevalはLispらしさを演出するためだけの存在だからな
450 名前:デフォルトの名無しさん mailto:sage [2009/03/07(土) 21:07:27 ] evalを使うってのは、速度的にも不利になるし、普通にlispでプログラムを組む人は 避けるところだと思うよ。避けないとすれば腕の悪い人という印象しかないな。少な くとも他の方法を探すだろう。
451 名前:デフォルトの名無しさん mailto:sage [2009/03/08(日) 10:41:58 ] 大抵マクロでおkだからな
452 名前:デフォルトの名無しさん mailto:sage [2009/03/08(日) 15:39:34 ] Qiは データ [] program () のカッコをわけたらlispの意味ないとは思わなかったんだろうか
453 名前:デフォルトの名無しさん mailto:sage [2009/03/08(日) 16:21:06 ] >>451 マクロでできることはevalでもできるみたいな言い方だな 第一印象はそんなものだろうけど それをいつまでも引きずっていていいのかな?
454 名前:デフォルトの名無しさん mailto:sage [2009/03/08(日) 16:40:18 ] 451じゃないけど違うの?
455 名前:デフォルトの名無しさん mailto:sage [2009/03/08(日) 16:49:10 ] Lispのマクロ機能はevalで実装されていると思うのだが・・・
456 名前:デフォルトの名無しさん mailto:sage [2009/03/08(日) 17:11:36 ] codepad.org/kiclBi61
457 名前:デフォルトの名無しさん mailto:sage [2009/03/08(日) 18:36:31 ] (display (eval (let1 'y 2 `(+ ,x y)))) これで動くよ 何が言いたいのかわからんが
458 名前:デフォルトの名無しさん mailto:sage [2009/03/08(日) 19:00:31 ] 言いたいことは >>443 >symbol-functionってグローバルな関数定義しか参照しないんだな と同じことがevalにも言えるということ。 evalは外側のローカル変数xの定義を参照できないから >>457 では、事前にxのところを値で置き換えたものをevalに渡している。
459 名前:デフォルトの名無しさん mailto:sage [2009/03/08(日) 19:58:27 ] つーかevalは他のローカル変数のことなんか知らんから。 関数の引数として渡されたコンテクストで評価するしかない。 それを知らせる手段として(current-environment)みたいなものが 処理系にあればやりたいことは実現できるんじゃないか。
460 名前:デフォルトの名無しさん mailto:sage [2009/03/08(日) 20:13:48 ] Schemeのevalの話? Common Lispでは、 (defvar x 1) (print (eval '(+ x x))) 2 (let ((x 10)) (print (eval '(+ x x)))) 20 Schemeのevalは渡された環境への変更に制限もあるよね。 ;; R5RSとR6RSで少し違う
461 名前:デフォルトの名無しさん mailto:sage [2009/03/08(日) 21:10:14 ] (let ((x 10)) (print (eval '(+ x x)))) *** - EVAL: variable X has no value
462 名前:デフォルトの名無しさん mailto:sage [2009/03/08(日) 21:15:34 ] >>460 が一見意図通り動いてるように見えるのは 最初のdefvarでxをスペシャル変数にしてるから。 schemeで同じことをする場合はfluid-letを使う。 (define x 1) (display (eval '(+ x x))) 2 (fluid-let ((x 10)) (display (eval '(+ x x)))) 20 x 1
463 名前:デフォルトの名無しさん mailto:sage [2009/03/09(月) 08:01:39 ] mzschemeで、CGIをPOSTメソッドで使いたいのですが(クライアント側)、うまくいきません。 たとえば、 en.wikipedia.org/w/api.php?action=query&meta=siteinfo&siprop=namespaces と同じことをしたいのですが(これはGETメソッド)、 (let* ((url (string->url "en.wikipedia.org/w/api.php ")) (post (string->bytes/utf-8 "action=query&meta=siteinfo&siprop=namespaces")) (port (post-pure-port url post)) (xml (read-string 1000 port)) ) xml) でいけると思ったのですが、エラーメッセージが帰ってきます。 どこがまずいのでしょうか?
464 名前:デフォルトの名無しさん mailto:sage [2009/03/09(月) 08:57:46 ] コンビネータパーサを作ったから せっかくなのでR5RSかR6RS準拠のパーサを書いてみようと思ったんだが 全体のBNFのリストってどこかにまとまってる? 仕様書をざっと見した感じでは、 ばらばらにちょっとずつBNFが載っているように感じるんだが 仕様書ってのはこんな感じのもん?
465 名前:デフォルトの名無しさん mailto:sage [2009/03/09(月) 09:02:30 ] Schemeの仕様書はこんな感じのもん。 まぁLispでBNFもくそもないが。
466 名前:デフォルトの名無しさん mailto:sage [2009/03/09(月) 17:51:26 ] Lisp系言語の場合、構文のフォーマルな定義がBNFとはちょっと合わない。書けなくはないけれど。 構文の定義はこんな感じのレイヤになってる。 (1)まずtokenに分解 (R6RSの用語ではlexical syntax) (2)S式として読み込み (R6RSの用語ではdatum syntax) (3)S式の中の特定の構造をプログラムの構文として認識 (R6RSの用語ではprogram syntax) このうち、(2)の出力は既に抽象的な木構造のデータなんで、(3)のレベルの構文定義っていうのは 木構造に対する定義になる。もちろん木構造にマッチする文法を書けばいいんだけど。 プログラムの字面に対するBNFとは違ってくるな。 例えば、"(if x y z)" と"(if . (x . (y . (z))))" は字面では違うけどdatum syntaxとして 読まれた後は全く同じ木構造になる。program syntaxはその木構造だけを見る。
467 名前:デフォルトの名無しさん mailto:sage [2009/03/09(月) 18:22:02 ] コンビネタ・パーザだとレキサも一体で書くスタイルが多い。 >>466 で言うと(1)と(2)が一体。 ただ演算子多重定義出来る言語じゃないと、 見た目がシンプルにならない。
468 名前:デフォルトの名無しさん mailto:sage [2009/03/09(月) 20:48:06 ] >>467 それは知ってるんだが、要点はそこじゃなくて(2)と(3)が分離してるってとこ。仕様からして。 >>464 は言語構文のBNF定義がまとまってないってことに違和感を覚えたわけだろ。 (1)-(3)までまとめて書くことはできると思うがきれいになるかな?
469 名前:デフォルトの名無しさん mailto:sage [2009/03/09(月) 21:39:11 ] (3)は、R5RSとR6RSでちょっと違うし、 内部表現的には変える必要ない上に、 read/evalの分離構造ともマッチしているから、 あえて混ぜる必要はないと思う。 >>449 そういえばEuLispにはevalがなかったな。 おもしろい試みだったけどあっさりと廃れたね。 YooTooはまだ更新されているみたいだけど。 R6RSのmoduleも一部影響受けてるね。
470 名前:デフォルトの名無しさん mailto:sage [2009/03/10(火) 06:01:07 ] >>463 ですが、自己解決しました。 このコードで動きます。 (let* ((url (string->url "en.wikipedia.org/w/api.php ")) (post (string->bytes/utf-8 "action=query&meta=siteinfo&siprop=namespaces&format=xml")) (header '("User-Agent: MzScheme" "Accept: application/xml" "Accept-Encoding: deflate" "Accept-Charset: utf-8" "Content-Type: application/x-www-form-urlencoded")) (port (post-pure-port url post header)) (xml (read-string 1000 port))) xml) すくなくともen.wikipedia.orgのサーバーは、Content-Typeを指定しないとCGIだと認識してくれないようです。
471 名前:デフォルトの名無しさん mailto:sage [2009/03/10(火) 23:41:18 ] >>465-469 ありがとう。こういうもんか 特に466の説明はとてもわかりやすい。 R5RSのほうはBNFついてそうだから こっちやってみよかな しかし、PDFって扱いにくいわ <hoge>って表記をテキストでコピペするとhhogeiになるし <で検索できんから不便
472 名前:デフォルトの名無しさん mailto:sage [2009/03/11(水) 05:03:58 ] ファイルの basenameを取得する関数ってありますか? "foo.txt" -> "foo" "foo.bar.txt -> "foo.bar" といった風に取得したいのですが 自分で書くなら 一文字ずつ後ろから文字比較して . が来るまで探して その部分を削除。とするんですが もし既にあるなら書くのも悲しいので どなたかご存知ありませんか?
473 名前:デフォルトの名無しさん mailto:sage [2009/03/11(水) 05:37:46 ] (pregexp-replace "(.*)\\.[^.]+" "foo.bar.txt" "\\1")
474 名前:デフォルトの名無しさん mailto:sage [2009/03/11(水) 05:49:52 ] pathname-name www.lispworks.com/documentation/HyperSpec/Body/f_pn_hos.htm
475 名前:デフォルトの名無しさん mailto:sage [2009/03/11(水) 06:47:07 ] >>473-474 レスありがとうございます。 環境を書いていませんでした申し訳ありません。 R5RSで行うにはどうすれば良いでしょうか?
476 名前:デフォルトの名無しさん mailto:sage [2009/03/11(水) 07:39:05 ] R5RSにそんな高レベルな標準関数ないと思う
477 名前:デフォルトの名無しさん mailto:sage [2009/03/11(水) 08:52:04 ] R5RSで動く出来合いのライブラリが欲しいってことかね
478 名前:472 mailto:sage [2009/03/11(水) 09:17:26 ] >>476-477 ありませんか…。 仕方がないので自分で書いてみました。 もうちょっとすっきり書けないもんかと思うんですが 今の自分にはこれが限界でした。 (define (chop str) (substring str 0 (- (string-length str) 1))) (define (basename str) (if (string? (basename-if-thereis str)) (basename-if-thereis str) str)) (define (basename-if-thereis str) (cond ((= (string-length str) 0) #f) ((eqv? (string-ref str (- (string-length str) 1)) #\.) (chop str)) (#t (basename-if-thereis (chop str)))))
479 名前:デフォルトの名無しさん [2009/03/11(水) 11:47:54 ] >>472 SRFI 13 使えばいいんじゃね (let ((i (string-index-right s #¥.))) (if i (substring s 0 i) s))
480 名前:デフォルトの名無しさん mailto:sage [2009/03/11(水) 14:19:19 ] basenameの本質って拡張子を省くことじゃなくてディレクトリパスの削除じゃないのかな? (my-basename "foo.txt") => "foo.txt" (my-basename "foo.txt" #t) => "foo" (my-basename "/foo/bar.txt") => "bar.txt" みたいな 472の例はgaucheではpath-sans-extensionという手続きが割り当てられている
481 名前:デフォルトの名無しさん mailto:sage [2009/03/11(水) 15:07:51 ] クラススロットを辞書のように自由に登録したいのですが、 何かいい方法はありませんか? 例えば、 (define-class <test> () (())) というクラスから (define foo (make <test> :xxx 0 :yyy 10)) (ref foo 'xxx) -> 0 (ref foo 'yyy) -> 10 を可能にしたいのです。
482 名前:デフォルトの名無しさん mailto:sage [2009/03/11(水) 16:09:20 ] >>481 処理系は?
483 名前:デフォルトの名無しさん mailto:sage [2009/03/11(水) 16:16:34 ] >>482 gaucheです
484 名前:デフォルトの名無しさん mailto:sage [2009/03/11(水) 18:23:09 ] 簡単にやるならこんな感じかな (use gauche.sequence) (use util.list) (define-class <test> () (%slots)) (define-method initialize ((self <test>) initargs) (next-method) (slot-set! self '%slots (map (lambda (x) (cons (string->symbol (keyword->string (car x))) (cadr x))) (slices initargs 2)))) (define-method ref ((self <test>) slot) (assq-ref (slot-ref self '%slots) slot)) (define-method (setter ref) ((self <test>) slot val) (assq-set! (slot-ref self '%slots) slot val)) ほんとうのスロットのようにふるまわせたいならMOP使わないとだめかも。
485 名前:デフォルトの名無しさん mailto:sage [2009/03/11(水) 19:37:09 ] >>484 それだとクラス内に辞書を確保して、 setterとgetterをスロット操作のようにエミュレートするってことですね。 なるほど〜 ありがとうございます。 ところで、Gauche本やリファレンスを見てもMOPの使い方がいまいち分からないのですが、 MOPを使うとどのようなソースになるのでしょうか? よかったら教えてください。 よろしくお願いします。
486 名前:472 mailto:sage [2009/03/11(水) 22:12:20 ] >>479 こういうライブラリがあるんですね、紹介ありがとうございます。 ただ、これだけのためにライブラリ入れるのも何なんで もう少し難しい文字列処理が必要になったら入れることにします。 >>480 そうですね、確かに言われてみれば。 名前は変えることにします。
487 名前:デフォルトの名無しさん mailto:sage [2009/03/12(木) 01:34:42 ] コンビネータの勉強がしたいんですが (expand S)とすると (fun x (fun y (fun z ((x z) (y z))))) が返ってくるような関数orマクロを作ろうとしたら 実質インタプリタを作るようなもんでしょうか? もし楽な方法(特定の処理系の拡張機能etc)等があるのであれば知りたいです
488 名前:デフォルトの名無しさん [2009/03/12(木) 08:19:24 ] lispな方はバージョン管理は何を使ってますか? git svn cvs
489 名前:デフォルトの名無しさん [2009/03/12(木) 08:23:19 ] >>488 darcs
490 名前:デフォルトの名無しさん mailto:sage [2009/03/12(木) 08:28:28 ] mercurial, git
491 名前:デフォルトの名無しさん mailto:sage [2009/03/12(木) 09:14:18 ] Bazaar
492 名前:デフォルトの名無しさん mailto:sage [2009/03/12(木) 11:02:23 ] 質問します。 組合せ問題、経路問題などの、記号処理問題をリストを使って解決するのに 相応しい言語を教えてください。 環境はできるだけ特定のOSに限定されない方が結構です。 グラフ表示は別の専門家が扱うのでロジック部分のみです。
493 名前:492 mailto:sage [2009/03/12(木) 11:15:29 ] すみません。誤爆です。"初心者のためのプログラミング言語ガイド Part14"に書き込む つもりでした。直前にこのスレを確認していたのでpasteされたURLがここになって いました。 このスレの方々は それはSchemeだ! っておしゃいますよねw
494 名前:デフォルトの名無しさん mailto:sage [2009/03/12(木) 11:16:25 ] cl-graph boost::graph
495 名前:デフォルトの名無しさん mailto:sage [2009/03/12(木) 11:54:50 ] >>492 「リストを使って解決するのに相応しい」って、その質問がすでにLISPを想定しているとしか。その名も、LISt Processer。 昔は人工知能を書くために使われていたので、ターゲット分野的にもぴったり。 LISPをはずすなら、Haskellかなぁ。 ただ、Haskellはマルチバイト文字の処理周りが痛いらしい。
496 名前:デフォルトの名無しさん mailto:sage [2009/03/12(木) 12:03:13 ] >>485 Gauche特有の話だし、wilikiででも質問してみたら?
497 名前:デフォルトの名無しさん mailto:sage [2009/03/12(木) 16:25:52 ] ものまね鳥をまねる、14000円つけてるなw 今図書館で借りっぱなしで催促の電話が何度もかかってる。 忙しくて読めなかったんです。 この場を借りて予約入れてる人に謝るよ。
498 名前:デフォルトの名無しさん mailto:sage [2009/03/12(木) 16:33:29 ] lispのラーメンタイマーだよ (require :pythononlisp) (py::py "import noodletimer;noodletimer.noodletimer")
499 名前:デフォルトの名無しさん mailto:sage [2009/03/12(木) 16:43:28 ] QiはQiからlispよぶのは簡単なのに Qiをdumpしてlispから呼ばせるにはコードいじれって書いてある 自動でできないものなんだろうか
500 名前:デフォルトの名無しさん mailto:sage [2009/03/14(土) 03:25:49 ] lispは、カッコばかりでみづらいとよく言われるけど これは、慣れだね 生産効率性については、まだよくわからないけど
501 名前:デフォルトの名無しさん mailto:sage [2009/03/14(土) 05:23:24 ] 入門者レベルなんですが、lambdaを使わないと書けないんでしょうか 練習問題 1 次の関数を再帰を使って書いてください。 3. リスト (ls) から要素 (x) を取り除いたリストを返す関数。 ; 3 模範解答 (define (remove x ls) (if (null? ls) '() (let ((h (car ls))) ((if (eqv? x h) (lambda (y) y) (lambda (y) (cons h y))) (remove x (cdr ls))))))
502 名前:デフォルトの名無しさん mailto:sage [2009/03/14(土) 06:56:30 ] >>501 (define (remove x ls) (cond ((eq? x (car ls)) (cdr ls)) (else (cons (car ls) (remove x (cdr ls))))))
503 名前:502 mailto:sage [2009/03/14(土) 08:50:42 ] Σ(゚д゚) ls の中に x が二回以上出る場合はこうだ。 (define (remove x ls) (cond ((null? ls) '()) ((eq? x (car ls)) (remove x (cdr ls))) (else (cons (car ls) (remove x (cdr ls))))))
504 名前:デフォルトの名無しさん mailto:sage [2009/03/14(土) 08:58:47 ] >>502 突っ込もうと思っていました 最初のは、(remove 5 '(1 2 3 2))でもコケますね ヒントで実装までできました ありがとうございました
505 名前:デフォルトの名無しさん mailto:sage [2009/03/14(土) 19:18:21 ] これ読んでいるとlispのほうが良さそうにみえるね www.unixuser.org/~euske/doc/python/python-lisp-j.html
506 名前:デフォルトの名無しさん mailto:sage [2009/03/14(土) 20:54:29 ] Schemeでスタックを書こうとした場合 スタックのデータはグローバル変数に置くのが普通ですか? 出来たらクロージャとかに閉じ込めたいのですが 引数を2個にして1個目でpush/pop判断だとpopの時は引数が一つ無駄だし 個別にクロージャを使うと環境が別々になるし。 Gaucheのオブジェクト指向拡張とかだと綺麗にかけるんでしょうかね 他に思いつくのは、モジュールを作って そこにスタック本体のデータを置くとかですが どれが良いと思いますか 環境はGauche0.8.14です
507 名前:デフォルトの名無しさん mailto:sage [2009/03/14(土) 21:08:09 ] どれがって、consセルで作れば簡単じゃないかと
508 名前:デフォルトの名無しさん mailto:sage [2009/03/14(土) 21:21:08 ] (define top car) (define pop cdr) (define push cons) じゃまずいですか?
509 名前:デフォルトの名無しさん mailto:sage [2009/03/14(土) 21:40:07 ] >>505 例外処理の項目の数値が未だに信じられない
510 名前:デフォルトの名無しさん mailto:sage [2009/03/14(土) 21:52:51 ] >>508 スタックをリストとして直接触らせたくないってことなんじゃね? まぁ、Gauche の OO 関連はそんなに効率が良くないので、 クロージャに閉じ込める方がまだ無駄は少いかもね。
511 名前:デフォルトの名無しさん mailto:sage [2009/03/14(土) 22:01:34 ] >>509 > まぁ、Gauche の OO 関連はそんなに効率が良くないので、 > クロージャに閉じ込める方がまだ無駄は少いかもね。 くわしく なにと比べて? 効率って生産効率?
512 名前:デフォルトの名無しさん mailto:sage [2009/03/14(土) 22:06:56 ] >>506-508 想像だけど、破壊的更新をしたいじゃないの? オブジェト志向なら、 a = stack.pop() stack.push(b) … とか書くわけジャン。
513 名前:デフォルトの名無しさん mailto:sage [2009/03/14(土) 22:14:32 ] >>511 速度とかメモリ効率とか。 メソッドのディスパッチも基本的には実行時にしか出来ないし。 どうでもいいけど、アンカ間違ってるぞ。 速度的には検証していないけど、 なんとなく>>506 がイメージしているものを想像して書いてみた。 Gauche には依存していないつもり。 (define (make-stack) (let ((stack (cons '() '()))) (lambda(proc) (proc stack)))) (define (push stack-obj elem) (stack-obj (lambda(stack) (set-cdr! stack (cons (car stack) (cdr stack))) (set-car! stack elem)))) (define (pop stack-obj) (stack-obj (lambda(stack) (if (null? (car stack)) '() (let ((elem (car stack))) (set-car! stack (cadr stack)) (set-cdr! stack (cddr stack)) elem)))))
514 名前:デフォルトの名無しさん mailto:sage [2009/03/14(土) 22:23:34 ] スタックはconsで実装するつもりだったし、 なんか話がかみ合わないと思ったら・・そういうことか、理解しました 自分がやりたかったのは510氏のいうような意味でして ちょっと調べてたら可変長引数なる便利なものがあるってわかったので これで実装出来ました。もう少し処理を追加したら自分の目的には使えそうな感じ (define (stack) (let1 val '() (lambda a (let-optionals* a ((b 'none)(c '())) (cond ((eq? b 'none) val) ((eq? b 'top) (if (eq? val '()) '() (car val))) ((eq? b 'push) (set! val (cons c val)) c) ((eq? b 'pop) (if (eq? val '()) '() (let1 r (car val) (set! val (cdr val)) r)))))))) (define a (stack)) (a 'push 1) (a 'push 2) (a 'push) (a) (a 'pop) (a)
515 名前:デフォルトの名無しさん mailto:sage [2009/03/14(土) 22:43:02 ] >>513 (規制されてて書き込みのタイミングが悪かったのですが・・) そういえば、Schemeのライブラリは、こういう形のほうが多いですね 参考にさせてもらいます ありがとうございました
516 名前:デフォルトの名無しさん mailto:sage [2009/03/14(土) 23:03:47 ] 最近のスタックインターフェースは、 top, pop, pushと三つに分けるのが主流だよ。 もはやイディオムになっているといっていい。
517 名前:デフォルトの名無しさん mailto:sage [2009/03/15(日) 00:08:39 ] ;; クロージャに閉じ込める (define (with-stack f) (let ((stack '())) (f ;; push (lambda (obj) (set! stack (cons obj stack))) ;; pop (lambda () (if (null? stack) '() (let ((obj (car stack))) (set! stack (cdr stack)) obj))) ;; top (lambda () (if (null? stack) '() (car stack)))))) (with-stack (lambda (push pop top) (push 1) (push 2) (push 3) (write (top)) (write (pop)) (write (top)) (write (pop)) (write (pop)) (write (pop))))
518 名前:デフォルトの名無しさん mailto:sage [2009/03/15(日) 00:10:58 ] topってなんや?
519 名前:デフォルトの名無しさん mailto:sage [2009/03/15(日) 00:11:52 ] 解決 あとemptyっていうのも重要っぽいね
520 名前:デフォルトの名無しさん mailto:sage [2009/03/15(日) 02:34:25 ] []も使うようにしたほうがいいの? 処理系によっては [] を () と同じように使えて、多少見かけを区別することができます: (let ([x (calculate-x a b c)] [y (calculate-y d e f)]) body ...) (cond [(predicate x) (do-something) (do-something2)] [(predicate y) (do-another-thing)] [else (do-whatever)]) 括弧の意味の多重化 (中段) practical-scheme.net/wiliki/wiliki.cgi?Lisp%3aS%E5%BC%8F%E3%81%AE%E7%90%86%E7%94%B1
521 名前:デフォルトの名無しさん mailto:sage [2009/03/15(日) 03:12:22 ] どうせそんなのはppしたら消えてしまうでしょ。 意味がある試みとは思えない。
522 名前:デフォルトの名無しさん mailto:sage [2009/03/15(日) 03:32:55 ] つーかカッコが何種類も入り乱れるのは激しくウザい
523 名前:デフォルトの名無しさん mailto:sage [2009/03/15(日) 04:59:08 ] 世間でC言語みたいなものが好まれるのは、 演算子を含む式と文とのバランスが良く、 メリハリが付くからだと思う。 LISPは書式が関数も式も文も全く同じ規則で さらにそれを括る括弧に極端に縛られる。 C言語でも関数呼び出しだけで書いていけば 同じ印象になるが、C言語では関数のネストなんて 書こうと思わなければほとんどする必要がない。 要するに括弧の形を変えたところであまり効果はない。 S式ベースでうだうだ考えるよりは、括弧に縛られない 都合の良い構文フロントエンドを作った方がマシである。
524 名前:デフォルトの名無しさん mailto:sage [2009/03/15(日) 05:20:32 ] 俺は好きでよく使っているけどなぁ。 処理系によっては()[]{}の3種類が使えるから、数学の式を書くときみたいな感覚で。
525 名前:デフォルトの名無しさん mailto:sage [2009/03/15(日) 05:34:48 ] ・よく言われる演算子の有無 前置記法である事と関係する。 a.b.cは (ref(ref a 'b)'c) 1 2 3 のような書き方になる。 見ての通り1を脳内スタックに積んで2を読み、 1を降ろして3と結合する、という思考を要求する。 また、aとb,cは同一に扱えない。 ((ref a b c)とは書けず、何かしら歪になる) 演算子があれば a.b.c 1 2 3 や a().b().c() 1 2 3 どちらも1から3まで、左から右へと目を動かすだけで良い。 修正が発生しても一箇所で済む。 これはS式というより、前置記法では解決できない問題と認識している。
526 名前:デフォルトの名無しさん mailto:sage [2009/03/15(日) 05:46:04 ] 前置記法を排除すればS式でも(a -> b -> c)と書ける。 ここで、aをマクロ的に加工して実装してしまう事も考えられる。 が、それが現実的ではない事も判っている。 自分で演算子を作り、管理するのと同じ事になる。
527 名前:デフォルトの名無しさん mailto:sage [2009/03/15(日) 05:58:26 ] また>>526 の(a -> b -> c)のように、 S式内で独自言語を構築する場合、 独自言語の構文としての括弧もあるので、 S式のくくりの括弧がどうしても邪魔に見える。 ここまでやるならもうS式である意味がない。 a->b->cと書きたいならそのまま書けばいい。
528 名前:デフォルトの名無しさん mailto:sage [2009/03/15(日) 06:25:55 ] だから、どうせやるなら>>523 に書いた通り、必要時にS式も扱えるような ちゃんぽん言語でもLISPで作ったらどうかというわけ。 不毛な縛りの中で何かやるよりはよっぽど健全ではないかと思う。 S式はデータとしてならともかく、コードとして出てくる必然性はあまりない。 >>520 とどっちが読みやすいだろうか? let x=calculate-x(a, b, c), y=calculate-y(d, e, f) in body ...; if (predicate(x)) { do-something(); do-something2(); } else if (predicate(y)) { do-another-thing(); } else { do-whatever(); }
529 名前:デフォルトの名無しさん mailto:sage [2009/03/15(日) 06:54:38 ] 入門者なんですが、shchemeでS式以外の書き方の標準構文ってあるんでしょうか? 人間のパターン認知力なのか、人間の適応力のすごさ、慣れなのか、よくわからないけど 今のままのほうがいい気がする 基本レベルの正規表現が使える人で、schemeを100時間触ってみて、それで真っ当な意見を聞きたいかも みんな、「このまままでいいんじゃねえ?」って言いそう 採用する理由になった論文の疑似コードもみてみたいところだが
530 名前:デフォルトの名無しさん mailto:sage [2009/03/15(日) 07:12:55 ] >>525 refが関数なら、(define ref* (lambda x (fold ref (car x) (cdr x))) で (ref* a 'b 'c) って書けるんじゃない。 つか一般に二項演算子があるならfoldしてやりゃ不定長でも扱えるでしょ。 マクロならマクロでくるんでやればいいだろうし。 まあquoteは必要だけど、それは別の話だよね。
531 名前:デフォルトの名無しさん mailto:sage [2009/03/15(日) 07:43:20 ] >>529 昔の Lisp の論文とかには M 式ってあったね。 en.wikipedia.org/wiki/M-expression Scheme の方だと SRFI 49 で I 式っていうのが提案されてる。 srfi.schemers.org/srfi-49/srfi-49.html 正規表現云々は知らないが、どっちもあまり流行ってない。
532 名前:デフォルトの名無しさん mailto:sage [2009/03/15(日) 10:10:46 ] そういえば、syntax が安定するまでは yacc を使って試行錯誤して 安定したら手書きの parser を使うという話を聞いたことがある。 lisper は逆に yacc より更に柔軟な方向に進もうとするのか。
533 名前:デフォルトの名無しさん mailto:sage [2009/03/15(日) 10:31:03 ] リードマクロがあるからね。
534 名前:デフォルトの名無しさん mailto:sage [2009/03/15(日) 11:54:13 ] >>528 マクロを忘れてるぜ。 コードがS式だからマクロ変換子は単なるリスト操作をすれば済むんだろう。 Scheme のマクロは単なるリスト操作じゃないけど、S式は大前提だ。 リーダーマクロにしたところで、内部的にはやっぱりS式だしな。
535 名前:デフォルトの名無しさん mailto:sage [2009/03/15(日) 12:13:45 ] リードマクロってキャラクタストリームベースじゃなかったっけ?
536 名前:デフォルトの名無しさん mailto:sage [2009/03/15(日) 21:58:23 ] ; M-x run-scheme で下のコードをC-x C-eすると、最後に添付するエラーになってしまいます (define (foo x) (if (= x 0) '() (cond ((= (modulo x 15) 0) (cons "FizzBuzz" (foo (- x 1)))) ((= (modulo x 5) 0) (cons "Buzz" (foo (- x 1)))) ((= (modulo x 3) 0) (cons "Fizz" (foo (- x 1)))) (else (cons x (foo (- x 1))))))) 環境 "GNU Emacs 22.3.1 (x86_64-unknown-linux-gnu) of 2009-03-10 on localhost.localdomain" guile> "1.8.0" ちなみにon emacsでloadすると、うまくいきます。 guile> (load "fizzbuzz.scm") guile> (foo 21) ("Fizz" "Buzz" 19 "Fizz" 17 16 "FizzBuzz" 14 13 "Fizz" 11 "Buzz" "Fizz" 8 7 "Fizz" "Buzz" 4 "Fizz" 2 1) また、gosh on emacsだと、こうなります gosh> (32 31 #0="FizzBuzz" 29 28 #1="Fizz" 26 #2="Buzz" #1# 23 22 #1# #2# 19 #1# 17 16 #0# 14 13 #1# 11 #2# #1# 8 7 #1# #2# 4 #1# 2 1) OS再起動してもダメでした エラー(長いので、一部略) guile> ... ... Display all 1922 possibilities? (y or n) ... Display all 1922 possibilities? (y or n) $abs EISCONN ERROR: Unbound variable: s ABORT: (unbound-variable) "Fizz"
537 名前:デフォルトの名無しさん mailto:sage [2009/03/15(日) 21:58:57 ] Backtrace: In current input: 307: 0* [foo 3] 304: 1 (if (= x 0) (quote ()) ...) <unnamed port>:304:1: In procedure memoization in expression (if (= x 0) (quote ()) ...): <unnamed port>:304:1: In line 303: Missing or extra expression in (if (= x 0) (quote ()) d ((= (modulo x 15) 0) (cons "FizzBuzz" (foo (- x 1)))) s "Buzz" (foo (- x 1))). ABORT: (syntax-error) ERROR: In procedure scm_lreadr: ERROR: #<unknown port>:307:24: unexpected ")" ABORT: (read-error) ERROR: In procedure scm_lreadr: ERROR: #<unknown port>:307:25: unexpected ")" ABORT: (read-error) guile> Display all 1922 possibilities? (y or n) $abs %app %cond-expand-features %cond-expand-table %get-pre-modules-obarray %guile-build-info ERROR: Unbound variable: s ABORT: (unbound-variable) 4 Backtrace: In current input: 308: 0* [foo 3]
538 名前:デフォルトの名無しさん mailto:sage [2009/03/15(日) 21:59:36 ] <unnamed port>:304:1: In procedure memoization in expression (if (= x 0) (quote ()) ...): <unnamed port>:304:1: In line 303: Missing or extra expression in (if (= x 0) (quote ()) d ((= (modulo x 15) 0) (cons "FizzBuzz" (foo (- x 1)))) s "Buzz" (foo (- x 1))). ABORT: (syntax-error) ERROR: In procedure scm_lreadr: ERROR: #<unknown port>:308:19: unexpected ")" ABORT: (read-error) ERROR: In procedure scm_lreadr: ERROR: #<unknown port>:308:20: unexpected ")" ABORT: (read-error) ERROR: In procedure scm_lreadr: ERROR: #<unknown port>:308:21: unexpected ")" ABORT: (read-error) ERROR: In procedure scm_lreadr: ERROR: #<unknown port>:308:22: unexpected ")" ABORT: (read-error) ERROR: In procedure scm_lreadr: ERROR: #<unknown port>:308:23: unexpected ")" ABORT: (read-error) guile>
539 名前:デフォルトの名無しさん mailto:sage [2009/03/15(日) 22:58:47 ] (print (foo 21)) or (write (foo 21)) トップレベルプリンタが同一オブジェクトを複数回出力しないだけの問題では?
540 名前:デフォルトの名無しさん mailto:sage [2009/03/16(月) 02:04:38 ] >>539 どういう意味ですか? 自分なりに解釈して、やってみたけど、ダメでした
541 名前:デフォルトの名無しさん mailto:sage [2009/03/16(月) 04:02:54 ] >>540 >>539 の言っているのは gosh の出力についてだね。 guile のエラーについては式が guile にちゃんと渡されてない感じがする。 プロンプトが複数回表示されてるあたり、 式が複数に分割されて渡されている形になってそうなんだけど。 gosh だと C-x C-e でちゃんと動いてるのかな。
542 名前:デフォルトの名無しさん mailto:sage [2009/03/16(月) 06:02:16 ] アドバイスをきっかけに解決しました タブによるインデント構造をつくるとこのエラーになるみたいです スペースに置換してみたら、通りました おとといまでは、普通に使えていた気がしたので、謎です 特別な設定をしたとしたら、メニューバーのschme欄をちょっと触ったときなのかな 触ったあとに特別不都合は、なかった気がしたけど >>541 > >>539 の言っているのは gosh の出力についてだね。 把握しました > gosh だと C-x C-e でちゃんと動いてるのかな。 もちろん、そうです ドキュメント関係とデバッグ関係が整備されていそうなguileで行きたいんですよね 言語に慣れていないレベルなので、文字列処理関係は、まだ先っぽいので 気に掛けてくださったみなさま、お世話になりました
543 名前:デフォルトの名無しさん mailto:sage [2009/03/16(月) 07:18:20 ] ああそっちの問題か readlineが悪さをしてる予感 emacsで使うときはactivate-readlineを無効にしたらどうでしょう
544 名前:デフォルトの名無しさん mailto:sage [2009/03/16(月) 09:56:12 ] >>543 本当だ cat ~/.guile (use-modules (ice-9 readline)) (activate-readline) の設定を外したら、tabインデントでもC-x C-eが通るようになりました また、安直にcat ~/.gosh (use-modules (ice-9 readline)) (activate-readline) としていたんですが、これって効いていないんですね goshに関しては、info関連をまだ目を通していないので、あれなんですけど 構文を多少読めるようになったので、readline.scmとguile関連のinfoを眺めてみることにします
545 名前:デフォルトの名無しさん mailto:sage [2009/03/16(月) 16:32:24 ] gaucheのインタラクティブモードで読み込まれるスクリプトは.gaucherc。 それとice-9モジュールはguileの物であってgaucheにはない。 .guileから外すのは(activate-readline)だけでいいと思う。 gaucheを使うのならttp://practical-scheme.net/gauche/man/gauche-refj_toc.htmlを読む事を勧めます。 guileのgaucheに対する利点:多くのOSでportやpackageが用意されている。リードマクロがある。親方GNU。 gaucheのguileに対する利点:速い。日本語のドキュメントが多い。マルチバイト文字がサポートされている。
546 名前:デフォルトの名無しさん mailto:sage [2009/03/16(月) 22:37:55 ] (activate-readline)を外すのが嫌だったので、とりあえず関数に割り当ててみました scheme, lisp関連の設定って、みなさんは、どういうふつうにされているんでしょうか? 不都合がなければ、晒してほしい・・・ cat ~/.guile ; first setting (use-modules (ice-9 readline)) (define (a) (activate-readline)) ; adding (use-modules (ice-9 popen)) (use-modules (ice-9 rdelim)) (define date (read-line (open-input-pipe "date -R"))) (define pwd (read-line (open-input-pipe "pwd"))) (define echo-home (read-line (open-input-pipe "echo $PATH")))
547 名前:デフォルトの名無しさん mailto:sage [2009/03/16(月) 22:43:57 ] activate-readlineはemacsからrun-schemeで使うときは不要。っていうか邪魔。 (or (string=? "dumb" (getenv "TERM")) (activate-readline)) とか書けばいいんじゃないかな (run-schemeのときは環境変数TERMがdumbに設定されるから)
548 名前:デフォルトの名無しさん mailto:sage [2009/03/16(月) 22:59:01 ] ああそれからactivate-readlineは起動後の任意の段階で評価できるから .guileに書かないでおいて、シェルから直にguileを起動しただけ 手動で評価してもいい。 $ guile guile> (activate-readline) guile> scheme、lisp関連の設定といっても自分は.emacsくらいですね。 ttp://karetta.jp/book-node/gauche-hacks/004682などを参考にするといいと思います。
549 名前:デフォルトの名無しさん mailto:sage [2009/03/16(月) 23:11:27 ] >>543 なるほど、readline が \t を食っちゃうのか。 知らないと意外とはまりそうだな。覚えておこう。
550 名前:デフォルトの名無しさん mailto:sage [2009/03/16(月) 23:26:15 ] 逆に言えばreadlineでシンボル補完が効きます
551 名前:デフォルトの名無しさん mailto:sage [2009/03/17(火) 00:01:45 ] ドキュメントとデバッグ環境でGuileを選ぶってのも珍しい気がする。 そういう場合はPLTとかに行きそうなもんだけど。
552 名前:デフォルトの名無しさん mailto:sage [2009/03/17(火) 00:26:21 ] >>547 コンソール時 echo $TERM linux gnome-terminal時 echo $TERM xterm emacs時 echo $TERM emacs なのに、なぜemacs時だけ(activate-readline)が実行されないの? >>551 scheme処女なもんで4つのinfoがあるguileなのかなと思って PLTは、存じませんでした 候補として考えたのは、Gauche, guile(, tiny scheme)の2つ(3つ)ですね ちょっとした疑問なんですが、guileにあるhelp関数ってGaucheにもあるんでしょうか? あと日本人のguile率って少ないんでしょうか? SchemeでぐぐるとGaucheがいっぱいひっかかりますね
553 名前:デフォルトの名無しさん mailto:sage [2009/03/17(火) 00:47:53 ] Gaucheは高機能な上、日本人のShiro Kawaiさん作なので日本語のドキュメントがたくさんある。 guileはGNU標準でポータビリティは高いんだけど動作が遅くてスタックが(標準では)少ない。 入門用ならばR5RS規格に最も厳格にマッチしている上にguile以上のポータビリティがあるScheme48もお勧め。 自分はGauche>>guile>Scheme48の順に使ってます。 マクロの種類で言えば Gauche:syntax-rulesマクロ、伝統的マクロ guile:syntax-rulesマクロ、syntax-caseマクロ、伝統的マクロ、リードマクロ Scheme48:syntax-rulesマクロ、明示的改名マクロ なのでguileが最も充実してますが。
554 名前:デフォルトの名無しさん mailto:sage [2009/03/17(火) 04:34:29 ] >>552 gaucheにはhelp関数は無いけどinfo関数というのがある。 ただ、表示されるのが「その関数を含むinfoの1ページ」なのでちょっと面倒。 emacsから使ってるなら、カーソルのある関数のinfoエントリを一発で*info*バッファに 表示するelispが昔MLに流れたことがあった気がする。
555 名前:デフォルトの名無しさん mailto:sage [2009/03/17(火) 04:57:19 ] describeもaproposも使えるけど なんだかんだでhyperspecとslimeが使いやすいやね
556 名前:552 mailto:sage [2009/03/17(火) 05:23:33 ] 自己解決しました コピペまんまだと、activate-readlineきいていました "dumb"のところを"emacs"に変えればいいわけですね 当たり前と言えば、当たり前なんだけど 日本語WikipediaのSchemeの項目の最下部の外部リンクの「関数プログラミングは、なぜ必要か、うんぬん」の文章ってわけわからないっすね あの疑似コード、わかりにくいw プログラミングしていて、なんとなく関数言語がいうモジュール化がわかってきたかも >>553 今、気づいたんですが、日本語WikipediaにSchemeの処理系の項目は、Gauche以外書かれていないんですね そういう意味でもGaucheに流れる人が多いのかな >>554 info関数なんてあるんですね Gaucheのインストール失敗したのか、よくわかりませんが、info閲覧できないんですよね まだ必要に迫られていないので、ちゃんと調べていませんが >emacsから使ってるなら、カーソルのある関数のinfoエントリを一発で*info*バッファに >表示するelispが昔MLに流れたことがあった気がする。 便利そうですね >>555 slimeって聞きますね もうちょっとしたら、導入してみます
557 名前:デフォルトの名無しさん mailto:sage [2009/03/17(火) 08:05:53 ] あれ、run-schemeで起動したguileで guile> (getenv "TERM") "dumb" ってなりませんでしたか? guile> (getenv "TERM") "emacs" なら"dumb"を"emacs"でいいですけど…
558 名前:デフォルトの名無しさん mailto:sage [2009/03/17(火) 09:22:34 ] >>557 shellモードもrun-schemeモードも"emacs"と返りますね infoドキュメントでがんばって、勉強しているんですが けっこう大変ですね 基本的なlet, set, lambda関連の記述の仕方は、わかるんですが ちょっと複雑になると理解しにくい・・・
559 名前:デフォルトの名無しさん mailto:sage [2009/03/17(火) 10:39:23 ] >SchemeでぐぐるとGaucheがいっぱいひっかかりますね 絶望した!横文字をウェブ全体から検索した結果に絶望した!
560 名前:デフォルトの名無しさん mailto:sage [2009/03/17(火) 13:28:37 ] infoで勉強する心意気は結構ですけど 先ずは>>216 あたりのウェブページで勉強するほうが楽かもしれません。 わからない所はこことかに具体的にドシドシ書きこむと さらに後に続く人の為にもなるでしょう。
561 名前:デフォルトの名無しさん mailto:sage [2009/03/17(火) 19:17:54 ] >>560 > infoで勉強する心意気は結構ですけど > 先ずは>>216 あたりのウェブページで勉強するほうが楽かもしれません。 infoで勉強するのが今回の目的だったりするんですよね あとguileは、なにができるだ(どういう機能があるの?)というのも速く知りたいから、 とりあえず、なぞっているのもあります もちろん、Schemeの学習階段的には、日本語の入門サイトは有用ですね 英語圏の人は、infoだけで事足りるのか、プログラミング経験度を前提しているのかとか
562 名前:デフォルトの名無しさん mailto:sage [2009/03/17(火) 22:17:23 ] >infoだけで事足りるのか そんな完璧な文書があると思うか? あるわけねーだろ 完璧を目指すのはいいが少しずつ地道に改善していくしかない ちなみに、アジャイルとかなんとか言われるようになる以前は 一発で完璧なものが作れると思ってる奴がたくさんいたとかいないとか
563 名前:デフォルトの名無しさん mailto:sage [2009/03/18(水) 02:46:26 ] >>562 完璧な文書だとは、思わないけど 十分な文書だと思うよ
564 名前:デフォルトの名無しさん mailto:sage [2009/03/18(水) 12:35:17 ] common lispの情報探そうとするとhatenaなどのblogにいきあたること多い schemeは2chの過去スレが検索にかかることが多い この違いは何?
565 名前:デフォルトの名無しさん mailto:sage [2009/03/18(水) 12:46:13 ] Googleの中の人に聞いて下さい。
566 名前:デフォルトの名無しさん mailto:sage [2009/03/18(水) 12:48:47 ] schemeしか知らないけど、lispでぐぐればいいんじゃない? lisp --> common lisp scheme --> scheme という理解だけど
567 名前:デフォルトの名無しさん mailto:sage [2009/03/18(水) 12:48:51 ] &hl=en付けたら2chにもhatenaにもいきあたらないな
568 名前:デフォルトの名無しさん mailto:sage [2009/03/18(水) 13:00:54 ] >564 実用性があるか無いか、実アプリ開発に使ってるか否かの差だとオモ。 言い方を変えればSchemeは教育的効果は高いが…
569 名前:デフォルトの名無しさん mailto:sage [2009/03/18(水) 13:30:55 ] おっとBASICの悪口はそこまでだ
570 名前:デフォルトの名無しさん mailto:sage [2009/03/18(水) 15:54:36 ] schemeで、(car '())や(cdr '())の結果はどうなるんしょうか? 昔読んだLISPの本か何かでnilのcarやcdrはnilになるという 説明を見た気がするのですが、schemeにも当てはまるんでしょうか。
571 名前:デフォルトの名無しさん mailto:sage [2009/03/18(水) 16:04:13 ] r5rsでは空のリストにcar,cdrはエラーって定義されてるな
572 名前:デフォルトの名無しさん mailto:sage [2009/03/18(水) 16:05:36 ] R5RS 6.3.2
573 名前:デフォルトの名無しさん mailto:sage [2009/03/18(水) 16:06:31 ] r5rs-ja.pdfにありました。ありがとうございました。
574 名前:デフォルトの名無しさん mailto:sage [2009/03/18(水) 21:02:29 ] >>497 オレ、とある図書館でその本の順番待ちなんだが、 まさかオマエが止めてるのか?w
575 名前:デフォルトの名無しさん mailto:sage [2009/03/18(水) 22:54:43 ] なんだこいつ
576 名前:デフォルトの名無しさん mailto:sage [2009/03/18(水) 23:33:46 ] これをLIFOと言います
577 名前:デフォルトの名無しさん mailto:sage [2009/03/18(水) 23:59:26 ] 後入れ中出しだっけ
578 名前:デフォルトの名無しさん mailto:sage [2009/03/19(木) 00:29:47 ] アッー!
579 名前:デフォルトの名無しさん mailto:sage [2009/03/19(木) 01:54:40 ] guile, gaucheよりelispのほうがデバッガが整備されているの? >Shiro(2007/09/05 13:39:49 PDT): 慣れが半分、後は「バグを出しにくいコードの書き方」が半分でしょうか。出来る限り副作用無しで書いておくとバグの切り分けが非常に容易になります。 >たぶん、「ソースの動きを追う」という考え方自体、C/C++とSchemeで差があるんではないかと思います。 practical-scheme.net/wiliki/wiliki.cgi?Scheme%3a%E5%88%9D%E5%BF%83%E8%80%85%E3%81%AE%E8%B3%AA%E5%95%8F%E7%AE%B1#H-1frlpc5 C(手続き型言語)との対比でschemeにとってソースの動きを追うってどんな感じなんですか? 個人的にデバッガを使って、「ソースをよく読み、ときどき書き」というのをしたいんですが
580 名前:デフォルトの名無しさん mailto:sage [2009/03/19(木) 05:47:16 ] >>579 そのすぐ下に書いてある通りでは。 デバッガを使わずとも、replで個々の手続きを呼べるので、色々な入力を与えて出力を 見るかな。入力と出力の関係がすぐに把握できない(手続き内でステップ実行したいと思う) ようであればたぶん手続きが(あなたにとって)大きすぎる。
581 名前:デフォルトの名無しさん mailto:sage [2009/03/19(木) 07:32:34 ] で、何のソースを読みたいの? 抽象論はもう飽きたよ
582 名前:デフォルトの名無しさん mailto:sage [2009/03/19(木) 08:30:31 ] >C(手続き型言語)との対比でschemeにとってソースの動きを追うってどんな感じなんですか? そういえばあんまり追ったことないかも・・・スタックトレースが1000行と出ちゃうから。面倒なんでデバッガ使わなくなった。"Type (debug) to enter the debugger."とか出されても、もう無視(w
583 名前:デフォルトの名無しさん mailto:sage [2009/03/19(木) 08:34:34 ] >>580 処理系への絶対的な信頼性ってこと? 効率的なデバッグ術の個人の差ってかなり開きがありそうだね >>581 日本語サイトのサンプルとか、とりあえず、デバッグツールで読みたいなあと思って バグでハマって、解決はしたけど、ものすごく時間がかかった場合は バグの見つけ方のポイントを教えてくださいね
584 名前:デフォルトの名無しさん mailto:sage [2009/03/19(木) 10:56:39 ] 初心者ですけど (define (f x) (let ((a (hoge1 x)) (b (hoge2 a)) (c (hoge3 b)) (d (hoge4 c))) d)) ;; (f "なんちゃら") みたいな書き方をしています。 Emacsで、最後のコメントアウト行でC-c C-eで評価。 思ったような主力がでないときは、最後のdをcとかbとかに書き換えて、その段階での出力をみます。 手続き型に毒されたやり方でしょうか?
585 名前:デフォルトの名無しさん mailto:sage [2009/03/19(木) 14:10:57 ] それをやるならlet*じゃないかね
586 名前:デフォルトの名無しさん mailto:sage [2009/03/19(木) 14:33:22 ] >>579 自分はC++でプログラム書く時も、 デバッガ使うのはcore dump(assert含む)した時くらい。 基本的にユニットテストやってる。 自分のことを全然信用してないから、 全自動で網羅的なチェックした方がよい。 もちろんテストコードの方が圧倒的に多いし、 assertも馬鹿みたいに書いてる。 コードを書いたらすぐにユニットテストも書いてるから、 何かテストしたい時には、デバッガ立ち上げて操作するより、 既存のユニットテストコードを基に新たに書く方が速いw テスト、assertコードを書くのは設計の検討にもなってる。 設計をあらゆる角度から観察する必要があるから。 もちろんdtrace, profilerなんかも使いますが。
587 名前:デフォルトの名無しさん mailto:sage [2009/03/19(木) 14:36:15 ] >自分のことを全然信用してないから、 分かるわ〜 自分もいっつもデイジー・デイジー歌っちゃう
588 名前:デフォルトの名無しさん mailto:sage [2009/03/19(木) 15:46:53 ] そんなんじゃボーマンさんにスイッチ切られちゃうぞ。
589 名前:デフォルトの名無しさん mailto:sage [2009/03/19(木) 19:56:25 ] >>585 ご指摘のとおり、let* でした。
590 名前:デフォルトの名無しさん mailto:sage [2009/03/20(金) 21:57:53 ] そのテストツールの作り方の方針というか みたいなものをまとめている本ってないでしょうか
591 名前:デフォルトの名無しさん mailto:sage [2009/03/20(金) 23:28:14 ] そのってどの?
592 名前:デフォルトの名無しさん mailto:sage [2009/03/20(金) 23:32:39 ] まずデバッガに依存するのをやめて徹底的に構造化プログラミングを意識するようにした方がいいんじゃね?
593 名前:デフォルトの名無しさん mailto:sage [2009/03/21(土) 00:24:13 ] 具体的に何のコードをテストしたいのかを意識するべき。 そうでないと、ツールとか方針とかが正しいのか、そもそも必要なのかを検証できない。
594 名前:デフォルトの名無しさん [2009/03/21(土) 01:36:26 ] >>592 デバッガ使ってうまくいっている人は使えばいいと思うよ。
595 名前:デフォルトの名無しさん mailto:sage [2009/03/21(土) 01:53:44 ] デバッグのしやすさをよく考えて作ったほうがいいよ。つまり 手続っぽく作るのも可能だけど、なるべく関数のスタイルを身につけたほうが 効率的だよ。関数のスタイルをとるなら、デバッグはassertやtraceさえ出来れ ば、大体なんとかなるし。いわゆるデバッガが必要なのは、関数がでかくって、 その中で手続的に処理が乱雑になっちゃうからなのでは?
596 名前:デフォルトの名無しさん mailto:sage [2009/03/21(土) 02:13:43 ] そもそもの話はコードの読み方じゃなかったっけ。 まあ、それはreplで関数叩いて入出力確かめろ、ですでに結論出てるな。 とは言え、じゃあひどいコードはどうやったら効率よく読めますか、 とか訊かれると、どうしたもんかね、となるが。
597 名前:デフォルトの名無しさん mailto:sage [2009/03/21(土) 21:43:54 ] 本屋でO'reilly Gaucheをみかけて、軽く立ち読みしたけど 良さそうな感じだね
598 名前:デフォルトの名無しさん mailto:sage [2009/03/22(日) 08:10:07 ] >>590 処理系のソースに付いてくるテストコード読みなよ。
599 名前:デフォルトの名無しさん mailto:sage [2009/03/22(日) 20:33:23 ] >>597 新しいGauche本が出たのかと喜んでオライリーを覗きに行ったら ふぬああ本のことだったのか…
600 名前:デフォルトの名無しさん mailto:sage [2009/03/22(日) 20:45:12 ] 2133?
601 名前:デフォルトの名無しさん mailto:sage [2009/03/22(日) 20:57:45 ] フ ムフム ヌ クヌク ア プ ア ア
602 名前:デフォルトの名無しさん mailto:sage [2009/03/22(日) 22:20:27 ] フムフムヌクヌクアプアア ♪ www.youtube.com/watch?v=ir38tIOQdT0
603 名前:デフォルトの名無しさん mailto:sage [2009/03/22(日) 22:27:25 ] すまんがカッコ付きで話してくれんか
604 名前:デフォルトの名無しさん mailto:sage [2009/03/23(月) 01:13:46 ] (+ (* フム 2) (* ヌク 2) アプアア)
605 名前:デフォルトの名無しさん mailto:sage [2009/03/23(月) 01:34:35 ] Syntax Error
606 名前:デフォルトの名無しさん mailto:sage [2009/03/23(月) 01:36:23 ] >>605 お前が閉じろよ。
607 名前:デフォルトの名無しさん mailto:sage [2009/03/23(月) 12:27:25 ] 私のカギカッコは渚でしか見つけられませんでした。
608 名前:デフォルトの名無しさん mailto:sage [2009/03/23(月) 13:08:06 ] ))) ←波
609 名前:デフォルトの名無しさん mailto:sage [2009/03/23(月) 21:44:13 ] ))) ←こんなん見て人生おかしくならないか?
610 名前:デフォルトの名無しさん mailto:sage [2009/03/23(月) 22:04:11 ] >>609 おれのヘッドホンは beyerdynamics)))) だよ。
611 名前:デフォルトの名無しさん mailto:sage [2009/03/23(月) 22:16:03 ] (((((((((((パナウェーブ)))))))))))
612 名前:デフォルトの名無しさん mailto:sage [2009/03/24(火) 03:00:39 ] Lisp使い初めてから人生おかしくなったとか損したなんて人は 今まで一人も見たことがないな。 その前に周りにLisp使える人が一人も居ないお(´;ω;`)
613 名前:デフォルトの名無しさん mailto:sage [2009/03/24(火) 03:03:56 ] 損はしていないが、Lisp使えるだけでアレゲな現場に投入された経験はある。 周りが変態ばかりで困った記憶がある。 かくいう俺もド変態だ。どうだまいったか。
614 名前:デフォルトの名無しさん mailto:sage [2009/03/24(火) 05:11:32 ] アレゲってエロゲでAI作るとか?
615 名前:デフォルトの名無しさん mailto:sage [2009/03/24(火) 06:16:04 ] ぬるぽ
616 名前:デフォルトの名無しさん mailto:sage [2009/03/24(火) 09:07:38 ] LISPにNullPointerExceptionあるの?
617 名前:デフォルトの名無しさん mailto:sage [2009/03/24(火) 09:10:41 ] 規格上はない。 補足してトップレベルに復帰する処理系はある。
618 名前:デフォルトの名無しさん mailto:sage [2009/03/24(火) 09:26:42 ] おお、安心しました。
619 名前:デフォルトの名無しさん mailto:sage [2009/03/24(火) 09:29:47 ] 値が束縛されてないシンボルを参照したりすると出るエラーがぬるぽに相当するんでは?
620 名前:デフォルトの名無しさん mailto:sage [2009/03/24(火) 10:03:13 ] それはUNBOUND-VARIABLEだよね。 NILのCDR取るとか規格の範囲内で起きるものじゃなくて、 MEMREFなどの低レベルAPIや処理系バグで起きる、 *((char *)0)な話かと思ったが。
621 名前:デフォルトの名無しさん mailto:sage [2009/03/24(火) 19:13:24 ] >>574 謝ってるのにオマエとか言う奴には貸したくないな。
622 名前:デフォルトの名無しさん mailto:sage [2009/03/24(火) 19:58:32 ] いやいや、アナタの本じゃないし 読んでなくても一度返すのがスジですよ。 そして列の最後尾に並び直すのです。 (セドラーから5000円だか7000円だかで新古本を買った者より)
623 名前:デフォルトの名無しさん mailto:sage [2009/03/24(火) 20:32:59 ] 筋というか、普通はそういう規則じゃないの。 予約を入れた人がいなくても 貸し出し期間内に図書館にいって延長手続き(借り直し)するものだと思うんだけど。
624 名前:デフォルトの名無しさん mailto:sage [2009/03/24(火) 22:53:18 ] >>622 へー新古品なんてあるところにはあるんだなあ。 ところで訳書を出してたとこってたしかオンデマンド印刷とかで 幾つか出してるし、これもそれで復刊してくれないかなあ。
625 名前:デフォルトの名無しさん mailto:sage [2009/03/24(火) 23:07:18 ] 某大手書店の最後のディヴィグ本をゲットして喜んでたのに いつの間にか増刷されてamazonでさえ普通に新本が手に入るようになってて涙目w 手習いとかものまねも復刊されるかもね
626 名前:デフォルトの名無しさん mailto:sage [2009/03/24(火) 23:15:26 ] >>625 ま、そんなこともあるさ。 どんまいどんまい。
627 名前:デフォルトの名無しさん mailto:sage [2009/03/24(火) 23:23:31 ] 筋ってw ヤクザやさんがこんなところに居るとはw 規則なんだから返すに決まってるでしょ。 あればね… ていうか本なくしちゃったw
628 名前:デフォルトの名無しさん mailto:sage [2009/03/24(火) 23:30:41 ] >> 627 細かいこと気にするなって。買って返せば無問題♪
629 名前:デフォルトの名無しさん mailto:sage [2009/03/25(水) 01:11:21 ] >>621 とか>>627 とか、こういう奴がいるから、 図書館の中の人が苦労するんだろうな、と思った。 釣りならいいけど、素でその態度なら頭おかしいだろ。
630 名前:デフォルトの名無しさん mailto:sage [2009/03/25(水) 01:22:12 ] わざわざ言うことかw
631 名前:デフォルトの名無しさん mailto:sage [2009/03/25(水) 02:27:05 ] 絶版Lisp本ではものまね鳥と竹内先生の本が読みたいな。 あとLisp以外ではPrologの技芸。ヤフオクみたら29500円とかwwwwww オンデマンドで売ってくれくれ。
632 名前:デフォルトの名無しさん mailto:sage [2009/03/25(水) 02:44:01 ] Prologの技芸ってたまに名前を聞くんだが、そんなに偉大な本だったのか・・・・・
633 名前:デフォルトの名無しさん mailto:sage [2009/03/25(水) 02:49:05 ] Prologの技芸持ってるけど読んでないぜ そんなプレミア付きとは知らなんだ
634 名前: ◆7y/z31W.Wg mailto:sage [2009/03/25(水) 02:55:24 ] >>633 よかったら読んだら売ってよ。1万なら買うよ。
635 名前:デフォルトの名無しさん mailto:sage [2009/03/25(水) 02:56:26 ] 「Prologの技芸」はProlog版SICP。 SICPはアーキテクチャよりだけど、こっちは応用より。 内容グーで印刷ショボ。
636 名前: ◆7y/z31W.Wg mailto:sage [2009/03/25(水) 03:01:49 ] 間違ったヤフオクじゃなくてアマゾンだった。> 29500円
637 名前:デフォルトの名無しさん mailto:sage [2009/03/25(水) 06:41:10 ] これって業者がつり上げてんの?ひどい値段だなぁ。
638 名前:デフォルトの名無しさん mailto:sage [2009/03/25(水) 09:28:43 ] >Prolog版SICP なるほど
639 名前:デフォルトの名無しさん mailto:sage [2009/03/25(水) 11:06:13 ] the art of prologの和訳本だよね
640 名前:デフォルトの名無しさん mailto:sage [2009/03/25(水) 13:22:05 ] MITの教科書か。既に新しい版が出てるみたいだね。
641 名前:デフォルトの名無しさん [2009/03/25(水) 14:53:33 ] 話ぶった切ってすまないけど、SchemeでProcessingみたいに Arduinoを制御することができる処理系ってあるのかな? GaucheとかPLTってどうなんだろ? できればやりかた書いてあるリンク教えてください。
642 名前:デフォルトの名無しさん [2009/03/25(水) 15:20:28 ] >>641 chicken scheme + avr-gcc + avrdude 1010.co.uk/arduino.html#2
643 名前:デフォルトの名無しさん mailto:sage [2009/03/25(水) 15:55:03 ] 一方ポールグレアムはクラウドを制御した
644 名前:デフォルトの名無しさん mailto:sage [2009/03/25(水) 16:08:31 ] crowdコンピューター?
645 名前:デフォルトの名無しさん mailto:sage [2009/03/25(水) 22:24:21 ] 生きのこる術は大衆言語。
646 名前:デフォルトの名無しさん mailto:sage [2009/03/25(水) 23:02:14 ] だが気を付けたまえ。
647 名前:デフォルトの名無しさん [2009/03/26(木) 17:47:48 ] >>641 "Getting Started with Arduino"の6章"Talking to the Cloud"で Proce55ingを使ってクラウド上のPhysical computingを制御してます。 実はRubyやPerlやPythonでも出来るので、 もしかしたらGaucheとかPLTでもできるかも・・・Arduinoはavrdude経由で操作するかと思いますが・・・ スクリプトでなければ>>642 のようにavr-gccでArduino上のプログラムを 作成するのが良いでしょう。 そんな感じでクラウド側もPhysical computing側もSchemeは使えます。 といってもArduino上のというかAVR上のSchemeはまだないですね。 最近はメモリサイズが大分大きくなったようですが・・・
648 名前:デフォルトの名無しさん mailto:sage [2009/03/26(木) 18:55:27 ] >>647 >Arduino上のというかAVR上のSchemeはまだないですね。 つーかそもそもmegaの内蔵SRAM程度では厳しい。 外部コンパイルしてAVR上でVMを走らせる みたいな使い方ならできるだろうけど。 マイコンでscheme動かすならアドレス空間大きめの ものを選んだ方がいい。
649 名前:デフォルトの名無しさん [2009/03/27(金) 03:23:50 ] >>648 PICでSchemeが動いているw
650 名前:デフォルトの名無しさん mailto:sage [2009/03/27(金) 08:03:22 ] atmegaでも無理なのか ならschemeからマシン語のコードを吐くコンパイラというのならどうかな
651 名前:デフォルトの名無しさん mailto:sage [2009/03/27(金) 22:10:45 ] ハーバードアーキテクチャだからフラッシュとSRAMの扱いが違うんだよね フラッシュにオンタイムで書き込むにはブートローダもどきがいる
652 名前:デフォルトの名無しさん mailto:sage [2009/03/28(土) 15:07:29 ] Schemeじゃないけどこんなのはあるよ。 簡単なλ計算のインタプリタをArduinoで動かしてる。 Project LambdaCan: Lambda Calculus in a Can alum.wpi.edu/~tfraser/Software/Arduino/lambdacan.html
653 名前:デフォルトの名無しさん [2009/03/28(土) 23:38:51 ] >>652 有り難う御座います。このスレでもλ計算の話は久しぶりですね。 とっても気に入りました。でも、素のλ計算はメモリを喰うので この計算ぐらいが限界って例が書いてありますね。 簡約戦略がまずいとメモリオーバーしそうですねw
654 名前:デフォルトの名無しさん mailto:sage [2009/03/29(日) 23:38:06 ] 関数型スレでスルーされてしまったのでコチラで聞いてみますが lazy-kやunlambdaの式をλ式にしてくれる変換器ってないでしょうか (もしあればCombinator Birdsのような式が直接計算出来るのが理想ですが) というのも、W=C(BMR)=λab.bbb≠λab.abbな気がするので 検算してみたいんです。 後Combinator Birdsのページ、 W=SS(KI)がおそらく一番シンプルな答えですね
655 名前:デフォルトの名無しさん mailto:sage [2009/03/31(火) 19:23:24 ] なんか流れを止めてしまったみたいなので、654は撤回します ごめんなさい
656 名前:デフォルトの名無しさん mailto:sage [2009/03/31(火) 21:39:56 ] 過疎板の過疎スレで気にするような事じゃない
657 名前:デフォルトの名無しさん mailto:sage [2009/03/31(火) 22:13:21 ] >>655 いや、関係ないだろ W=C(BMR)=λab.bbb≠λab.abbとW=SS(KI)ってどういう意味なの? 暗号にしかみえないw
658 名前:デフォルトの名無しさん mailto:sage [2009/03/31(火) 22:25:41 ] 撤回するな!CLかSchemeで実装してみろ! と焚きつけてみる
659 名前:デフォルトの名無しさん mailto:sage [2009/03/31(火) 22:53:00 ] 良かった。それじゃせっかくなので解説してみます λをlと表記すると lab.abbってのは(lambda (a) (lambda (b) ((a b) b))と同じ意味(abbの部分は左結合)で、 これはWコンビネータのλ式の表現でもあります。 W=SS(KI)、つまり((S S) (KI))ってのは以下のS,Kを用いてWが表せますよ、という意味 ;lxyz.xz(yz) (define S (lambda (x) (lambda (y) (lambda (z) ((x z) (y z)))))) ;lxy.x (define K (lambda (x) (lambda (y) x))) ;lx.x (define I (lambda (x) x)) (define turing-type-quine (lambda (x) (lambda (y) (list y (list x (list 'quote x) (list 'quote y)))))) (define w (lambda (x) (lambda (y) ((x y) y)))) ((((S S) (K I)) turing-type-quine) 2) ((w turing-type-quine) 2) 最後の2行は同じ結果になりますよね Combinator Birdsでググるとトップに出てくるページには この他にW=C(BMR)っていう定義が載っていて これを簡約するとlab.bbbになるのではないか、というのが自分の疑問です。 というか、上のようなコードを書いて気づいたけど、 Scheme殿に計算してもらえば良かったわけだ 今から試してきます。気づかせてくれてさんきゅ
660 名前:デフォルトの名無しさん mailto:sage [2009/03/31(火) 23:03:17 ] (define C (lambda (x) (lambda (y) (lambda (z) ((x z) y))))) (define B (lambda (x) (lambda (y) (lambda (z) (x (y z)))))) (define M (lambda (x) (x x))) (define R (lambda (x) (lambda (y) (lambda (z) ((y z) x))))) (define W (C ((B M) R))) ((W turing-type-quine) 2) 普通に出来た。 自分の計算ミスかー、ショック ちなみにW=SS(KI)はこんな感じで計算できます。 lab.abb =lab.(ab)b =la.S(lb.ab)(lb.b) =la.SaI =la.(Sa)(KIa) =S(la.Sa)(la.KIa) =SS(KI)
661 名前:デフォルトの名無しさん mailto:sage [2009/04/01(水) 00:49:42 ] >>660 2割ぐらい理解したw あとで再挑戦・再理解してみる lambdaを3つ使うのを初めてみた おれはlambdaを3つ使うコードを書くことがあるのだろうか このロジック(表記法?)は、どういう用途で使えそうなの?
662 名前:デフォルトの名無しさん mailto:sage [2009/04/01(水) 07:02:04 ] 意味はさっぱり分からんがラムダだらけで楽しそうだ
663 名前:デフォルトの名無しさん mailto:sage [2009/04/01(水) 09:24:12 ] >>661 オレ、660じゃないけど、べつに実用性とかじゃなくて最小の関数型言語の形のひとつ: e.tir.jp/wiliki?%CB%DD%CC%F5%3A%A5%D7%A5%ED%A5%B0%A5%E9%A5%DF%A5%F3%A5%B0%B8%C0%B8%ECLazy_K
664 名前:デフォルトの名無しさん mailto:sage [2009/04/01(水) 16:00:20 ] >>663 Thank you 知らない概念や処理系が、いっぱいあったけど 2割ぐらい理解した 感想は、うまく言葉にできない
665 名前:デフォルトの名無しさん mailto:sage [2009/04/01(水) 19:15:59 ] 660ですが、ML系(たぶんHaskellも)の言語ではカリー化という機能があって Schemeでいう以下の2つは同じ物として扱われる (lambda (x) (lambda (y) (lambda (z) ... (lambda (x y z) ... 3引数の関数なら書いたことあるでしょ? そう考えたらそんなに複雑でもなく見えてくるかもね
666 名前:デフォルトの名無しさん mailto:sage [2009/04/01(水) 19:45:19 ] >>665 素朴な疑問なんですが 普段は、なんの言語を使っているんですか? ちなみに自分はbash 5%, C/C++ 30%, gauche 10%, Python 30%, その他 25% エディタはemacs? 差し支えなければ、教えてください
667 名前:デフォルトの名無しさん mailto:sage [2009/04/01(水) 20:23:21 ] 聞かれていない自分も晒すと gauche95%、sh3%、sed1%、C1%くらいだな。 1年半くらい前はsh70%、sed20%、C8%、(Scheme48+guile)2%くらいだったけど。 カリー化と可変長引数は両立がむずかしげでML系はカリー化を、Lisp系は可変長引数を取ったんだとおもう。 あとカリー化とthunkも相性が悪くて 正格評価のMLは、評価を遅延させる式を ():unitを受け取るなんちゃってthunkで実現してた気がする。
668 名前:デフォルトの名無しさん mailto:sage [2009/04/01(水) 20:42:54 ] >>667 gaucheを使っていて、不都合はないの? 他の言語を選ばずに、gaucheを選んだいくつかの理由ってなに? lisp系じゃなくて、gaucheの理由も知りたいかも
669 名前:660 mailto:sage [2009/04/01(水) 20:57:38 ] Gauche使ってる時間が50%ぐらいで、 OCaml&F# 30% C++ 15% Perl 5%ぐらい エディタはVC付属エディタとemacs/viです ところで、可変長引数がダメなのはカリー化というより 型付けが出来ないからではないでしょうか? 呼び出し時に引数の型を指定するprintfのような関数なら I,T,Qコンビネータと関数合成とカリー化で一応実現できます 効率にハンデはあるかもしれませんが
670 名前:デフォルトの名無しさん [2009/04/01(水) 21:04:07 ] 500 :Classical名無しさん :09/04/01 20:55 ID:qtulE/8k よろしくお願いします。 【URL】 pc12.2ch.net/test/read.cgi/tech/1231856193/ 【名前欄】 660 【メール欄】 sage 【本文】↓ Gauche使ってる時間が50%ぐらいで、 OCaml&F# 30% C++ 15% Perl 5%ぐらい エディタはVC付属エディタとemacs/viです ところで、可変長引数がダメなのはカリー化というより 型付けが出来ないからではないでしょうか? 呼び出し時に引数の型を指定するprintfのような関数なら I,T,Qコンビネータと関数合成とカリー化で一応実現できます 効率にハンデはあるかもしれませんが
671 名前:667 mailto:sage [2009/04/01(水) 21:20:19 ] >>668 自分のScheme処理系の変遷は 1.scm。多倍長整数が使いたくなる。 2.Gambit-C。SRFI周りがオレ様過ぎる。 3.MzScheme。非メジャーCPU、非メジャーOSへのポートに挫折。 4.Scheme48。本格的にSchemeを使い始めるが非保健的マクロが独自、SLIBのサポートがビミョー。 5.Guile。機能的にはほぼ文句はないが、遅い。そして重い。 6.Chicken。非メジャーCPUで最適化バグがあったような気がする。 7.Gauche。現状フリーR5RS処理系でベスト。非メジャーCPU、非メジャーOSへのポートも楽。 という感じです。 ドキュメントも豊富、高機能で軽くて高速、とくに正規表現周りはcl-ppcreよりも使いやすいのも◎。 いままでC+sed+shでやってたことをgaucheだけで置き換えられるようになったのがいいですね。 速度重視とかマルチスレッドバリバリなことをしなくなったということもありますが。
672 名前:デフォルトの名無しさん mailto:sage [2009/04/01(水) 22:52:45 ] SGIが倒産したらしい
673 名前:デフォルトの名無しさん mailto:sage [2009/04/01(水) 22:58:17 ] そうか、そうか
674 名前:デフォルトの名無しさん mailto:sage [2009/04/01(水) 23:00:18 ] lisp系は自作に限るよ
675 名前:デフォルトの名無しさん mailto:sage [2009/04/02(木) 03:41:44 ] LispスレでSGIといったら創価じゃなくて シリコン・グラフィックの方だろJK
676 名前:デフォルトの名無しさん mailto:sage [2009/04/02(木) 03:47:31 ] 2度目の倒産なんだって? なんかLispに関して大きいことやってたっけ? OpenGLぐらいしかシランわ。
677 名前:デフォルトの名無しさん mailto:sage [2009/04/02(木) 07:44:57 ] ずっと自作のSchemeモドキを使っています。モドキというのは、あまり 使わない機能を削って代わりに部分継続やソフトタイピングを入れたり してるためです。それなりに高速でデバッグ機能も充実していると思って いますが、RnRSやSRFIの類は全く考慮せず作っているので公開していま せん。ドキュメント書くのもめんどくさいし(論文は書いたけど)。
678 名前:デフォルトの名無しさん mailto:sage [2009/04/02(木) 09:10:38 ] >>672 エイプリルフールだと思ってた…
679 名前:デフォルトの名無しさん mailto:sage [2009/04/02(木) 14:18:51 ] 勘違いしたかも。 SGI(非創価)ってLisperが作った会社だと思ってました。
680 名前:デフォルトの名無しさん mailto:sage [2009/04/02(木) 14:20:30 ] lispでモナディウスなみの速度は出せるのだろうか
681 名前:デフォルトの名無しさん mailto:sage [2009/04/02(木) 16:33:15 ] >>679 ジムクラーク? Lisper ではないね。専門は CG らしい。 ワークステーション屋で Lisper が作った会社ってあったっけ? Sun のビルジョイはハッカーだけど Lisper じゃないし。
682 名前:デフォルトの名無しさん mailto:sage [2009/04/02(木) 16:58:18 ] 昔、N-Worldって、SGI (Indy?)向けの3D CG作成アプリなかった? Lispマシンから移植されたものだったと思う。Lispで動いていたはず。 プロトタイピング強いから、いろいろな分野の初期大型アプリで使われてるね。 数式処理、ウィンドウシステム、プログラミング可能エディタなど。 CG関係も昔はもっと多かった。
683 名前:デフォルトの名無しさん mailto:sage [2009/04/02(木) 18:25:17 ] sgiといえば、インディゴだな。doomでネット対戦に使わせてもらったよ。
684 名前:デフォルトの名無しさん mailto:sage [2009/04/02(木) 19:27:02 ] sigは破産申請したらしいね
685 名前:デフォルトの名無しさん mailto:sage [2009/04/02(木) 20:34:16 ] CGはもうからないのか
686 名前:デフォルトの名無しさん mailto:sage [2009/04/02(木) 23:50:42 ] >>682 ニチメンなんとか、ってやつのことかな。Shiroさんが詳しそう
687 名前:デフォルトの名無しさん mailto:sage [2009/04/03(金) 00:37:30 ] 前回の破産でCG方面からサーバー屋に商売変えしてたんじゃなかったっけ?
688 名前:デフォルトの名無しさん mailto:sage [2009/04/03(金) 00:39:09 ] なんかMIPSの灯がどんどん消えてく気がするなぁ…
689 名前:デフォルトの名無しさん mailto:sage [2009/04/03(金) 01:43:52 ] /.Jによると、どこだかに買収されるんで、それに必要な手続きなんだと。
690 名前:デフォルトの名無しさん mailto:sage [2009/04/03(金) 01:57:27 ] >>681 そうゆう名前で呼ばれてかかどうかはおいといて、MIT 由来の LISP マシンってワークステーション以外のなのものでもないが…
691 名前:デフォルトの名無しさん mailto:sage [2009/04/03(金) 02:28:13 ] >>685 技術の発展とともに、作業端末は高価なUNIXワークステーションではなく 安価なWindowsマシンが優位になり、未開の領域に強く柔軟なLispから 高速で大規模なプログラムに強い? C++に置き換わったとかじゃないの。
692 名前:681 mailto:sage [2009/04/03(金) 09:54:17 ] >>690 あーそうね。シンボリクスとかがそうか。 Unixワークステーション屋で、と言うべきだったかな。
693 名前:デフォルトの名無しさん mailto:sage [2009/04/03(金) 11:16:16 ] carやcdrがちゃんと理解できん・・・ アセンブラの方が簡単かも。
694 名前:デフォルトの名無しさん mailto:sage [2009/04/03(金) 12:14:13 ] そんなに難しいかな? 単方向リンクリストの、先頭を取り出すか、それ以外を取り出すか、 だけなんだが。
695 名前:デフォルトの名無しさん mailto:sage [2009/04/03(金) 12:16:17 ] 括弧とドットの表記法でつまづくか、ポインタでつまづくかのどっちかですよねー
696 名前:デフォルトの名無しさん mailto:sage [2009/04/03(金) 12:42:44 ] carは左って覚えれば良いと思うよ
697 名前:デフォルトの名無しさん mailto:sage [2009/04/03(金) 12:48:44 ] >>693 コンスは単なる2つのポインタの対 Lispよりも低レベルではcarとcdrは可換で線形リストとは何の関係もない 線形リストに利用しているのはLispより高レベルだけの話 アセンブラ的に考えればこう
698 名前:デフォルトの名無しさん mailto:sage [2009/04/03(金) 13:05:28 ] まずボックス表記を手で書いて それからいろんな構造をconsだけで組み立てる ドット対→線形単リスト→2分木みたいに徐々に複雑にしていくといい
699 名前:デフォルトの名無しさん mailto:sage [2009/04/03(金) 13:14:01 ] Common Lisp: A Gentle Introduction to Symbolic Computation 付録の sdraw 使うと図示してくれる CL-USER> (sdraw '(1 2 3 (4 5))) [*|*]--->[*|*]--->[*|*]--->[*|*]--->NIL | | | | v v v v 1 2 3 [*|*]--->[*|*]--->NIL | | v v 4 5 www.cs.cmu.edu/~dst/Lisp/sdraw/
700 名前:デフォルトの名無しさん mailto:sage [2009/04/03(金) 13:17:57 ] ちゃんと理解できないったって(と)の対応はわかりますよね? Lispのリスト記法はドット記法の構文糖 任意のリスト記法はドット記法で表せる(逆は偽) ドット記法の基本は( A . B )でホワイトスペース+ドット+ホワイトスペースがcarとcdrの間の仕切り (開き/閉じ括弧の周りはホワイトスペースの省略可) そしてドット記法を(A B C)みたいなに直すのは ドット+開き括弧を見つけたら、それと、それに対応する閉じ括弧を消しゴムで消すだけ
701 名前:デフォルトの名無しさん mailto:sage [2009/04/03(金) 13:22:22 ] ( A . B ) ≡ [ A | B ]
702 名前:デフォルトの名無しさん mailto:sage [2009/04/03(金) 14:15:16 ] (cons 'a 'b) => (a . b) (cons 'a (cons 'b '())) => (a b) '(a . (b . (c . ()))) => (a b c)
703 名前:デフォルトの名無しさん mailto:sage [2009/04/03(金) 14:22:09 ] 'とかquoteが絡んでくると解りづらくなるから 任意のアルファベット1文字のシンボルと空リストは自己評価的という設定にしよう (cons A B) => (A . B) ;; [ A | B ] (cons A ()) => (A . ()) ≡ (A) ;; [ A | NIL ] (cons (cons A B) ()) => ((A . B) . ()) ≡ ((A . B)) ;; [ [ A | B ] | NIL ] (cons () (cons A ())) => (() . (A . ())) ≡ (() A) ;; [ NIL | [ A | NIL ] ] (cons A (cons B C)) => (A . (B . C)) ≡ (A B . C) ;; [ A | [ B | C ] ]
704 名前:デフォルトの名無しさん mailto:sage [2009/04/03(金) 14:24:40 ] lispのリストはヘテロジニアスリストでさらにペアにもなるから難しいよな ML系みたいにリストは空か値とリストを持つコンスって定義だとまだわかりやすいのに
705 名前:デフォルトの名無しさん mailto:sage [2009/04/03(金) 15:27:28 ] 分かりにくくないだろw
706 名前:デフォルトの名無しさん mailto:sage [2009/04/03(金) 15:48:41 ] ふと思ったんですけど 効率の為にlistではなくvectorを使っているアルゴリズムって 静的にコンパイル+破壊的代入なしって条件なら プログラマにはlistとして見せつつ 内部的にはvectorとして処理できませんかね? たとえば(list 1 2 3 4 5)は 表面的にはコンスによる線形リストなんだけど内部的には#(1 2 3 4 5)であるオブジェクトを返すとか。 書き換えられない事が解っているn要素の線形リストは2ワードのセルをn個アロケートするより nワード+αのベクタで記憶するほうがよさそう。 Haskellが文字列をリストとして実装してるのはそんな理由だったりするのでしょうか?
707 名前:デフォルトの名無しさん mailto:sage [2009/04/03(金) 15:50:16 ] それは「cdr coding」と呼ばれるもので散々実験済み。
708 名前:デフォルトの名無しさん mailto:sage [2009/04/03(金) 15:52:55 ] 書き込んでから気づいたけど、 部分リストを複数オブジェクトで共有している場合 先頭部分の参照がはずれてもGCで回収できなくて逆に効率が悪くなりますね。 ベクタの最初の方だけGCできる方法を取れば別ですけど そうするとベクタの情報が増えて結局コンスと大差なくなるかも
709 名前:デフォルトの名無しさん mailto:sage [2009/04/03(金) 16:14:39 ] >>707 おや、そうでしたか。不勉強でした。 見た所、線形リストを少しでも効率よく処理する為の物の様で ベクタを置き換えるには至らなかったようですね。
710 名前:デフォルトの名無しさん mailto:sage [2009/04/03(金) 16:35:18 ] vector的利用がはっきりしているところでは、 vectorを使えばいいしね。 listで構造体を模倣してprototypingしても、 accessor使っておけば簡単に移行できるし。
711 名前:デフォルトの名無しさん mailto:sage [2009/04/03(金) 17:59:01 ] evalと大域変数でhashを模倣する初心者を見てニヤニヤするんですよねー
712 名前:デフォルトの名無しさん mailto:sage [2009/04/03(金) 18:02:44 ] それは君だけ。
713 名前:デフォルトの名無しさん mailto:sage [2009/04/03(金) 22:15:13 ] やべえ、サボってたらSeasoned Schemerわかんねえw また後戻りか…英語もやってないし… λ.......