1 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 00:14:56 ] 過去スレ 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/ Part9: ttp://pc2.2ch.net/test/read.cgi/tech/1069594582/ Part8: ttp://pc5.2ch.net/tech/kako/1058/10582/1058263391.html Part7: ttp://pc5.2ch.net/tech/kako/1042/10421/1042167213.html Part6: ttp://pc3.2ch.net/tech/kako/1031/10315/1031560687.html Part5: ttp://pc3.2ch.net/tech/kako/1023/10230/1023091882.html Part4: ttp://pc.2ch.net/tech/kako/1016/10162/1016211619.html Part3: ttp://pc.2ch.net/tech/kako/1008/10082/1008220265.html Part2: ttp://pc.2ch.net/tech/kako/1002/10025/1002584344.html Part1: ttp://piza2.2ch.net/tech/kako/987/987169286.html
488 名前:デフォルトの名無しさん mailto:sage [2008/02/07(木) 23:27:38 ] 日本語schemeキタコレ
489 名前:デフォルトの名無しさん mailto:sage [2008/02/08(金) 00:20:27 ] 全角カッコのあつかいはどうなるのでしょうか
490 名前:デフォルトの名無しさん mailto:sage [2008/02/08(金) 01:27:27 ] 全角なんてありませんよw
491 名前:デフォルトの名無しさん mailto:sage [2008/02/08(金) 01:34:32 ] lispとかschemeとかやってるとチョコレートもらえないって 先輩が言ったんですけど、ほんまですか?
492 名前:デフォルトの名無しさん mailto:sage [2008/02/08(金) 01:36:14 ] あ、それは本当です。でも人に喋っちゃ駄目だよ。
493 名前:デフォルトの名無しさん mailto:sage [2008/02/08(金) 01:38:25 ] いつもの倍でお得になります。
494 名前:デフォルトの名無しさん mailto:sage [2008/02/08(金) 01:47:57 ] チョコレートもらえないからlispとかschemeとかやって せつないきもちをまぎらわすんだよ
495 名前:デフォルトの名無しさん mailto:sage [2008/02/08(金) 06:09:52 ] チョコレートなんてLispで書けばいいだろ。
496 名前:デフォルトの名無しさん mailto:sage [2008/02/08(金) 08:51:30 ] ((lambda (choco) (choco choco)) (lambda (choco) (choco choco)))
497 名前:デフォルトの名無しさん mailto:sage [2008/02/08(金) 10:33:35 ] guileでUTF-8で guile> (define hoge "ほげほげ") guile> hoge "?\x81??\x81\x92?\x81??\x81\x92" guile> (string-length hoge) 12 となってしまうけど、4にはならないの?
498 名前:デフォルトの名無しさん mailto:sage [2008/02/08(金) 15:26:02 ] >>497 guileではcharacterは8bitだったはず (integer->char 256)はエラー バイナリデータと文字が混在するファイルを扱う場合は こっちのほうが割り切って使えるからいい
499 名前:デフォルトの名無しさん mailto:sage [2008/02/08(金) 16:31:45 ] ちょうどいいからお前らにUTF-8の文字数を数える プログラムでも書いてもらおうかな。 【問題】上のGuileのような文字列のバイト列を UTF-8とみなし、その文字数を返す関数を書け。
500 名前:デフォルトの名無しさん mailto:sage [2008/02/08(金) 16:44:49 ] 宿題スレでLispの質問しちゃいけないわけじゃないでしょ?
501 名前:デフォルトの名無しさん mailto:sage [2008/02/08(金) 17:15:55 ] (define (utf8len str) __(begin (define (follow-char? c) ____________(char<=? #\200 c #\277))) __(and (string? str) _______(let ((strlen (string-length str))) _________(let loop ((acc 0) ____________________(i 0)) ___________(cond ((= i strlen) acc) _________________((char<=? #\0 ___________________________(string-ref str i) ___________________________#\177) __________________(loop (+ acc 1) (+ i 1))) _________________((and (< (+ i 1) strlen) _______________________(char<=? #\300 ________________________________(string-ref str i) ________________________________#\337) _______________________(follow-char? (string-ref str (+ i 1))))
502 名前:デフォルトの名無しさん mailto:sage [2008/02/08(金) 17:19:21 ] 続きが書き込めない
503 名前:デフォルトの名無しさん mailto:sage [2008/02/08(金) 17:52:54 ] ;; SICP挫折中の見習いです (define (utf8-string-length s) (define (first-byte->length b) (define byte (char->integer b)) (cond ((<= #x00 byte #xbf) 1) ((<= #xc0 byte #xdf) 2) ((<= #xe0 byte #xef) 3) ((<= #xf0 byte #xf7) 4) ((<= #xf8 byte #xfb) 5) ((<= #xfc byte #xfd) 6))) (define strlen (string-length s)) (define (strlen-iter index len) (if (<= strlen index) len (strlen-iter (+ index (first-byte->length (string-ref s index))) (+ len 1)))) (strlen-iter 0 0))
504 名前:デフォルトの名無しさん mailto:sage [2008/02/08(金) 17:53:58 ] __(loop (+ acc 1) (+ i 2))) _((and (< (+ i 2) strlen) _______(char<=? #\340 ________(string-ref str i) ________________#\357) _______(follow-char? (string-ref str (+ i 1))) _______(follow-char? (string-ref str (+ i 2)))) __(loop (+ acc 1) (+ i 3))) _((and (< (+ i 3) strlen) _______(char<=? #\360 ________________(string-ref str i) ________________#\367) _______(follow-char? (string-ref str (+ i 1))) _______(follow-char? (string-ref str (+ i 2))) _______(follow-char? (string-ref str (+ i 3)))) __(loop (+ acc 1) (+ i 4))) _(else #f)))))) これならどうだ
505 名前:デフォルトの名無しさん mailto:age [2008/02/09(土) 21:41:09 ] Windows Vistaなんだけど、 SBCL1.0.13よりLarcenyのほうが圧倒的に速いんだけど こんなものなの?
506 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 21:52:43 ] コンパイルした?
507 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 22:12:21 ] >>462 3-Schemeと言っていい、Brownと後継Bloodはみつからず、 その代わり米澤研のRScheme, Blackが見つかりました。 RSchemeは論文に全コードが、Blackは米澤研のWebサーバ:/pub/black
508 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 23:38:58 ] ウィンドウスxpで使えて最初から hspみたいなライブラリがついてる実装って無い?
509 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 01:03:55 ] >>505 測定したプログラムや測定方法を書いてくれたら追試してくれる人が居るかもよ
510 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 01:06:52 ] Larcenyのほうが設計が10年以上新しいんだし、そんなもんじゃね。 >>508 はPLT Schemeとかどうよ。
511 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 03:04:12 ] scsh という Scheme シェルを入れてみた。未だ起動もしてないけど。 www.scsh.net/ それだけ。
512 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 08:43:08 ] >>508 つ community.schemewiki.org/?scheme-faq-standards#H-3sv08v つ community.schemewiki.org/?scheme-faq-standards#specialimpl
513 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 11:47:46 ] >>510 見てみます ありがとうございました
514 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 22:14:31 ] >>505 Larceny めちゃくちゃ速いんで驚いたよ。 主要開発メンバーってLight Ship MacScheme 作ってた人でしょ。 この処理系、かなり期待。
515 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 22:31:00 ] いやだからコンパイラで比べてるのかインタプリタで比べてるのかくらい晒してくれよ
516 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 22:47:46 ] > (time (tak 12 6 0)) Words allocated: 0 Words reclaimed: 0 Elapsed time...: 156 ms (User: 156 ms; System: 0 ms) Elapsed GC time: 0 ms (CPU: 0 in 0 collections.) 12 compile-file にしてもしなくても同じ結果。読み込んだ時点で コンパイル済みなんじゃないかな。 記憶違いかもしれないけどアセンブラがどうとかってHPにあったような。 かなり最適化をしているのかも。
517 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 23:00:19 ] 現在のLisp処理系のコンパイラってどんな仕組みになってんの? Lisp1.5の時代はLAPを使ってたけど、今はVMなんかね? Arcのコード読みでああいう簡単なのはおおよそわかったけど、 本格的なのってどういう仕組みをとってるんだろう。
518 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 23:05:01 ] ネイティブ吐くのもいるし、 独自じゃなくて、JVMをターゲットにするのもある。
519 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 23:58:11 ] 最近ではC言語のソースを吐くってのは流行らんのかね? あれ、良いと思うんだけどな。
520 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 00:03:19 ] C言語のソースを吐かれても人間が可読でなければ意味がない。
521 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 00:04:18 ] yaccとかlexの立場がないな
522 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 00:04:51 ] いや、新しいCPUの最適化とかをC言語コンパイラに任す事ができるw。
523 名前:デフォルトの名無しさん mailto:age [2008/02/11(月) 00:30:25 ] SBCLのManualページを見たけどよくわからない ・・・俺が馬鹿なのは知ってるから。 SBCLのコンパイルから実行までの手順をご教授願いたい。 正直言って 初めてLISPをインストールして 「どんなのかなあ?使ってみようかなあ」と思っても CやJAVAのように簡単に入口の手順が調べられないんですよ。 「そんな厨はLISP使うな!」は無しでお願いします。
524 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 00:44:41 ] 「SBCLをコンパイルする」のか「SBCLでコンパイルする」のかで、話が変わると思うよ
525 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 00:47:36 ] >523 で、プラットフォームは何? Mac,Linux,Windows? 初めてでWindows上ならxyzzy上のLispなんかの方が手近だと思うが。 Meadowだ、slimeだ、Emacsだとかは面倒くさいでしょ?
526 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 01:01:22 ] xyzzyは独自仕様だからお勧めしにくいな。俺のお薦めはCLISP。
527 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 01:08:39 ] 1. LispWorks Personal Edition をダウンロードする 2. インストールする 3. New File でファイルを編集 4. コンパイルボタンを押す 5. REPL から呼び出す
528 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 01:09:31 ] って言うか、何のために「SBCLのコンパイルから実行」したいの? それによっても答えが変わると思う
529 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 01:13:14 ] i386とpowerpc以外のCPU LinuxとFreeBSDとMacOSX以外のUnixLikeOSで動かせて Gauche並の軽さ&速さとは言わないけど Pythonくらいの軽さ&速さはあるCL処理系ってありますか? SchemeでもGaucheより速い処理系も軽い処理系もあるけど 速さと軽さのバランスが一番いいのはやはりGauche コンパイルすればCLのがチョッ速だと思うけど重い処理系が多いように思えます
530 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 01:16:48 ] >CやJAVAのように簡単に入口の手順が調べられない と書いてあるから、SBCL 自体のコンパイルをしたい訳ではないと予想。 cc や javac を使う様な感じで、コンパイル済みファイル(fasl?)を作成して それをロード→実行する方法を聞いているんじゃないかしら。 すまんが俺は最近 SBCL を触っていないので、やり方が分からん。
531 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 01:18:32 ] >>529 CLISP
532 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 01:22:00 ] わざわざ答えて頂いたのに申し訳ないのですが CLISPの最近のverはi386-OpenBSDでも動かないのです (ビルドは出来るけどsaveinitmem:executable Tとか動かない) それにちょっと遅すぎます ECLのほうが速いくらいです
533 名前:デフォルトの名無しさん mailto:age [2008/02/11(月) 01:23:15 ] >524、525 すみません説明不足で 要するに先に出てた、SBCL VS Larceny を Tak関数を使ってやりたいのです。 OS:Windows Vista LISP:SBCL1.0.13 でTak関数がtak.clというファイル名であるとして (compile-file "tak.cl") とすれば、tak.fasl ファイルができるのですが・・・ ここから先が・・・orz でもコンパイルしたとしても 実行時にSBCL起動して (time (tak 12 6 0)) なんてすると意味の無いような気がするし、 "(time)"の部分も当初の tak.cl に入れて コンパイルすればいいのでしょうが、 そこまで頭が回らないので助けていただこうかと。
534 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 01:23:53 ] そんな無理して CL 使わんでも…。 今度は CLISP より ○○ のほうが優れているように思えます!! とか言いそうだな…。 無理せず Gauche 使えばいいじゃん。
535 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 01:25:40 ] >>532 そういう事は先に書かないと駄目だよ ECL はネイティブコンパイルするから CLISP よりも速くて当然なんじゃないの?
536 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 01:27:38 ] ECLは速さはまあ及第点なのですが 重すぎるのが難点 KCLファミリーでありながらCLtl2な所とか 長所もいろいろあるのですが (*package*がCOMMON-LISP-USERだからCLtl2とみなしてもいいんですよね?)
537 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 01:29:18 ] Larceny が勝利!!よって Scheme >>> CL !!! とかやりだしそうだな…。 まぁ、10年以上後発なんだし結果は見えているような。
538 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 01:31:25 ] 元気な奴だな。マニュアルも読まれずに評価されるCLコンパイラがちょっとだけ気の毒
539 名前:529=532=536 mailto:sage [2008/02/11(月) 01:43:40 ] 普段はSchemerですが CLにも敬意を表してちゃんと使えるようになりたいと考えております 多分に主観的ですが エレガントさはSchemeに分が それ以外の大部分はCLに分があると思っています LuaみたいにAnsiCさえあれば動くぜ!みたいな処理系がCLにもSchemeにもほしいものです
540 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 02:09:14 ] >>539 GC等のことを考えると速度的なペナルティ無しに完全にANSI-Cの範囲で記述するのは難しい んじゃないかな。遅い処理系なら作れると思うけど、速くするには何かズルしないと。w
541 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 02:09:25 ] (define (valentine choco) (if (zero? choco) (display "お前は既に死んでいる") (display "カエルchokochoko3chokochoko/n合わせてchokochoko6chokochoko")))
542 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 02:11:41 ] >>533 (load "tak.fasl")
543 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 02:37:04 ] Gaucheの本ってまだぁ?チンチン
544 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 04:26:33 ] Common Lispに敬意を払いたいといいつつ takを選んでしかも最適化宣言無し…意図が無いとしたら天才かもしれん。 haskell使えば?
545 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 04:46:57 ] tak の人とは別人じゃないかな? 俺も Schemer が余興でやるなら CL より Haskell が良いと思う
546 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 17:38:54 ] ttp://lispuser.net/memo/lisp/2006-12-08-03-54.html これを参考にしてSchemeでScheme処理系を書いている。 ↑これはわかりやすくて短くていいわ。 それと「Schemeによる記号処理入門」森北出版
547 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 18:03:40 ] そこのサイトって誰が書いてるのかわからんし。 結局LISPユーザー向けじゃなくてACLユーザー向けのサイトじゃん。 読んでいて ム カ つ く んですよね。
548 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 18:06:07 ] そこはCで書いてくれ
549 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 18:06:35 ] またバストダンジョンか
550 名前:546 mailto:sage [2008/02/11(月) 19:40:01 ] >>547 そこってなんかヤバイんかい? しっかりしたまともな内容だと思うけど...
551 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 19:47:46 ] >>550 ごめんかんちがいかも。 でもなんか気色悪いわ。
552 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 19:49:08 ] >>547 は別のサイトと勘違いしてるっぽい感じがするけど
553 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 19:52:38 ] >>547 俺には一部のACL向けの記事があるだけのように思うが。 ちゅうか中の人はCLISPの開発者なんだし、誤解のような気もするけど。
554 名前:547 mailto:sage [2008/02/11(月) 20:55:01 ] >>553 そうなんだ?完全に勘違いですね。ごめんなさい>>All
555 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 21:08:43 ] 日本語で PLT Scheme を説明してるサイトってどっかにありませんかね?
556 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 21:46:32 ] >>>555 Shiroさんとこのwilikiにある↓をいつも参考にしてるよ。 ttp://practical-scheme.net/wiliki/wiliki.cgi?MzScheme
557 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 21:48:00 ] あ、まちがえた。MzじゃなくてDRの方だよね。
558 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 23:00:04 ] Drに入ってる言語のオプションがよくわからないんです><
559 名前:555 mailto:sage [2008/02/11(月) 23:13:00 ] >>557 PLT Scheme で GUI を作りたいと考えています。
560 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 23:27:19 ] >>559 Drは使ったことがないのでよくわからないけど MrEDと連携してグラフィクスなんかできたんじゃ なかったっけ。
561 名前:デフォルトの名無しさん [2008/02/12(火) 19:14:40 ] HaskellにはLispのような優秀なマクロがないので埋め込み言語を実装しにくいって本当かね?
562 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 19:45:30 ] マクロよりS式の方が大きいでしょ。 S式はDSLのプロトタイプに最適だもん。 Lisp1.5の時代から、俺eval、俺apply作れたんだから。
563 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 19:47:36 ] 一方、しっかりした仕様のある言語なら、 pugsの例を見るまでもなくHaskellも結構いける。 宣言型のコード書きやすいから。 Prologはどっか行っちゃった。
564 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 08:57:01 ] 第2回gauche.nightチケット売り切れました。 本当にありがとうございました。
565 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 12:31:55 ] どういたしまして
566 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 00:50:36 ] >>564 本も売り切れるといいね。
567 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 01:05:33 ] 初心者です.マクロについて質問させてください. 以前に出ていた日本語のScheme本から(一部抜粋) (define-syntax Cond (syntax-rules (else =>) ;; #0 ((Cond (else result1 result2 ...)) (begin result1 result2 ...)) ;; #1 ((Cond (test => result)) (let ((temp test)) (if temp (result temp)))) ;; #2 ((Cond (test => result) clause1 clause2 ...) (let ((temp test)) (if temp (result temp) (Cond clause1 clause2 ...)))) ;; #3 ((Cond (test)) test) ;; #4 ((Cond (test) clause1 clause2 ...) (or test (Cond clause1 clause2 ...))) ;; #5 ((Cond (test result1 result2 ...)) (if test (begin result1 result2 ...))) ;; #6 ((Cond (test result1 result2 ...) clause1 clause2 ...) (if test (begin result1 result2 ...) (Cond clause1 clause2 ...))))) (let ((=> #f)) (Cond (#t => 'ok))) scmだと本の解説通り ok と表示されるのですが, scm ではないある処理系に 読み込ませたところ,'ok がprocedureではない,というエラーになりました. どうやら「=>」に#fが束縛されておらず keywordである「=>」として扱われたようです. 正しくは,すべてのsymbolの束縛関係が解決されてから syntaxに渡され (て,最終的にokとな)ると考えて良いのでしょうか.
568 名前:567 mailto:sage [2008/02/15(金) 01:32:22 ] もしそうだとすると,その束縛関係が参照されるのは, syntax定義の時点でしょうか,それとも syntax呼び出しの時点でしょうか.
569 名前:567 mailto:sage [2008/02/15(金) 01:57:21 ] >>568 の質問の形を変えます. syntax定義時と呼び出し時とで異なる値に束縛されたsymbolは どちらの値に置き換えられて評価されるのでしょうか. 単純なscopeの優先度からすると,syntax呼び出し時の値が使われそうですが, closureやsyntaxが制作者の意図通り動くことを保証するためには syntax定義時の値が使われるべきなのではないかと思うのです. closureだとclosure定義時の環境が参照されると理解しています.
570 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 02:48:34 ] そこまで確信してるなら「scm ではないある処理系」の製作者に直接言えば?
571 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 08:29:51 ] どちらが正しいかを決めるルールが存在するとは限らない。
572 名前:567 mailto:sage [2008/02/15(金) 08:52:11 ] 混乱していましたが一晩寝たら少し整理できたように思います. 本の説明とscmの実装が正しいとして,束縛関係の優先順位が 1.syntax定義時 2.syntax呼び出し時 であれば納得できそうです.
573 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 12:51:51 ] R5RSに於いては マクロに於けるリテラル識別子(この場合はelseと=>)がマッチするのは マクロ定義とマクロ使用でともに同じ束縛を持つか ともに束縛を持たない場合のみだから その「scm ではないある処理系」の挙動は正しくない。 マクロのパターンマッチに束縛情報が使われることから 束縛関係を解決してから展開されるという解釈は正しいと思う。 ただしSchemeの場合は値ではなく場所に束縛される。 だから (define foo 100) (let ((foo foo)) foo) ではトップレベルのfooとlet式中のfooは同じ値で違う束縛である。 (さらに細かく言えば束縛されるのはSymbolではなくidentifierである。) このCondの例は定義時に=>が束縛を持たなかったのに(あるいは定義時の字句的束縛を持っていたのに) 使用時に=>がローカルな束縛を持っていたから#1にマッチしなかっただけである。 同じ束縛を持っていた場合は変数参照式として値が使われることはなく、リテラル識別子として#1にマッチする。 また、マクロ使用において束縛関係の優先順位が 1. 定義時 2. 使用時 というのは逆。 マクロ使用式の識別子の束縛は使用される式の位置に於ける字句的束縛である。 だからマクロ名である構文キーワード(この場合はCond)はローカル変数束縛に隠蔽されうる。 ただし展開され、挿入された式は定義に於ける字句的束縛を持つ。 犬飼大氏はscmやSLIBはR5RSに準拠してると仰ってるけれども scmや派生処理系のGNU guileはマクロ周りを含め準拠していない部分も結構あるから R5RSの学習には不向きだと思われる。
574 名前:567 mailto:sage [2008/02/15(金) 13:04:47 ] >>573 要を得ない質問の意図をくみ取ってくださり 的確なご解説をいただきましてありがとうございます. >>573 を読み返して考えてみます.
575 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 14:10:32 ] C言語風に言い換えれば束縛という名詞は変数のアドレス。 (define x 100) (define y 1000) (define-syntax foo (syntax-rules () ((foo y) (+ x y)))) ;パターン(foo y)に現れていなくてテンプレート(+ x y)に現れている識別子は+とx ;さらに自由識別子だから ;+とxは挿入された場所の字句的束縛ではなく ;マクロ定義された場所の字句的束縛を持つ ;yはマクロに於ける仮引数だからマクロ使用の式の値になる (let ((x 10)) (foo y)) -> 1100 (let ((x 10)) (foo x)) -> 110 (let ((y 1)) (foo x)) -> 200 (let ((y 1)) (foo y)) -> 101 (let ((+ -)) (foo 10000)) -> 10100
576 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 14:10:53 ] R5RS保健的マクロの束縛識別子は処理系によって解釈が分かれてるから使わない方が吉かも。 束縛識別子とは(let ((x 10)) ...)とか(define x 100)に於けるxのことで 変数捕獲を防ぐ為にリネームされるハズなんだけど リネームしてくれないscm系 必要最小限にリネームするGauche系 必ずリネームするScheme48系があって それぞれ挙動が違う。
577 名前:567 mailto:sage [2008/02/15(金) 14:16:58 ] >>573 ありがとうございます.ようやく理解できました. マクロ使用における束縛関係の優先順位も,使用時の束縛関係が 定義時の束縛関係に優先するとしたほうが自然であると納得できました. 私の混乱の原因のひとつに,マクロのtemplate上のsymbol「=>」と, マクロを適用するユーザコード上のsymbol「=>」とを混同していたことが ありました.これらを明確に区別すべきでした. なお,>>567 に書きました非scmの処理系はbigloo(ver.3.0c)です. また,guileはdefine-syntaxやsyntax-rules自体を実装していないようです.
578 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 14:18:31 ] guileは(use-syntax (ice-9 syncase))をすると syntax-caseとsyntax-rulesが使えるようになります
579 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 14:22:37 ] 束縛識別子でもlet系の場合はどの処理系もリネームしてくれるんだった。 defineは使わない方が吉、の間違い。 scm系はリネームせずにdefineします。 Gaucheは(多分)set!として働く場合はリネームしませんがそれ以外はリネームします。 Scheme48系は常にリネームします。 なのでマクロテンプレート以外から参照できません。
580 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 14:28:19 ] ああさらに間違い。 Gaucheはトップレベルdefineはリネームせず、内部defineのみリネームするようです。
581 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 14:36:22 ] また少しだけ衛生的マクロが嫌いになりました
582 名前:567 mailto:sage [2008/02/15(金) 14:36:34 ] >>575 - >>580 みなさま情報ありがとうございます >>578 の方法でguileでも>>567 のコードを正しく評価できました
583 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 14:38:29 ] >>577 マクロテンプレート(例えば(let ((temp test)) (if temp (result temp))))中の(この例では現れていませんが)=>は マクロ定義された場所で可視だった束縛を参照します。 マクロパターン(例えば(Cond (test => result)))中の=>は マクロ使用式(Cond (#t => 'ok))中の識別子=>とのマッチングに使われます。 マクロ使用式の=>とマクロ定義の=>がともに未束縛であるか 或いは同じ束縛(例えばトップレベル変数)を持つ場合にのみマッチする訳です。
584 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 14:59:43 ] テンプレート(foo X Y)に於いてfooという識別子に意味はありません。 最初の識別子はマッチングに利用されません。 なので(_ X Y)等と書くこともあります。 XとYはいわばメタ仮引数。マクロ使用式の同じ位置の式にマッチします。 そしてテンプレート中ではマクロ使用式の同じ位置の式が挿入されます。 (syntax-rules (hoge funi) ...)に於いてhogeとfuniはリテラル識別子となります。 パターンに現れる場合はマッチングにのみ利用されます。 マッチングは同じ識別子で且つ同じ束縛である場合にのみ成功します。 テンプレート中に現れる識別子のうち、パターンの中にリテラル識別子以外で現れた識別子以外は マクロ定義された場所で可視だった束縛を参照します。 ただし束縛コンストラクタで作られる場所に束縛される場合は実質的に改名されます。 なのでテンプレート中に=>が出現してたらそれはマクロ定義された場所の束縛を参照します。 (define bar 100) (define-syntax foo (syntax-rules (bar) ((foo bar) bar)) (foo bar) -> 100 (let ((bar 10000)) (foo bar)) => ERROR! ;パターンマッチングに失敗
585 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 15:00:33 ] 最初の単語から間違えたorz パターン(foo X Y)の間違い
586 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 15:36:36 ] リテラル識別子ってsyntax-rulesのところで束縛されているように見えるけど 本当に束縛してしまうと絶対にマッチしないパターンになるのか 紛らわしいな
587 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 15:54:38 ] なんか長々と分かりにくい書き方だったな リテラル識別子はパターン部分で特別扱いするだけ でもリテラルといいながら変数と看做したときの束縛までマッチングに利用するのは少し変な気がする。 パターン変数:任意の式にマッチする。テンプレート中ではマッチした式として挿入される。 リテラル識別子:同じ束縛を持つ同じ識別子とだけマッチする。テンプレート中ではパターン変数以外の識別子と同じ扱い。 パターン変数以外の識別子:テンプレート中の変数参照はマクロ定義された位置での束縛の参照が挿入される。 テンプレート中の束縛コンストラクタで新たに束縛される場合はその参照と共に改名される。 これの方がいいかな
588 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 16:01:42 ] ttp://www.r6rs.org/final/html/r6rs/r6rs-Z-H-14.html#node_sec_11.19 >A literal identifier matches an input subform if and only if >the input subform is an identifier and >either both its occurrence in the input expression and >its occurrence in the list of literals have the same lexical binding, or >the two identifiers have the same name and both have no lexical binding.