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
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.
589 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 16:55:31 ] R5RSの3.1によれば 構文の型の名前は全て構文に束縛されていて構文キーワードである 変数とは構文キーワードでない任意の識別子である(elseと=>も構文キーワードだから変数でない) またR5RSの4・5章によれば defineは (define <変数> <式>) (define (<変数> <仮引数部>) <本体>) (define (<変数> . <仮引数>) <本体>) のいずれか set!は (set! <変数> <式>) lambdaは (lambda <仮引数部> <本体>) 但し<仮引数部>は(<変数1> ...)、<変数>、(<変数1> ... <変数n> . <変数n+1>)のいずれか てことは構文キーワードをを隠蔽するローカル変数あるいはトップレベル変数をdefine、set!、lambda、let、let*、letrec、doで作る事はR5RS外だったんだ 構文キーワードの変数参照がR5RS外って事は知ってたけどこの事は知らなかった だけど4.3にはローカル変数束縛がキーワード束縛を隠蔽しても良いって書いてあるけど どうすれば構文キーワードを隠蔽できるローカル変数束縛ができるの? 他方、構文束縛は変数でなく識別子に対して行われるからローカル構文束縛で隠蔽されることはあり得る。 7.2.1の抽象構文に於いては変数と識別子が同一されているから<変数>の解釈が2パターンあるってオチなんだろうけど
590 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 16:56:06 ] typo 同一されている->同一視されている
591 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 18:14:38 ] Gauche0.8.13がリリースされてたのか! 気付かなかった
592 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 18:15:03 ] Schemeのconsを少し勉強していたら以前さっぱりだったC++の 再帰のメタプログラムがわかるようになってきた。 両方勉強しようと思う。
593 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 01:49:25 ] すみませんが、質問です。 DrSchemeのGUI環境で、選択できる言語の一つに、遅延評価のLazy Schemeとい うのがあるのですが、これで tarai を回して, time関数で時間を計ろうとすると、 tarai関数は実行されず、promiseオブジェクトが返ってきてしまいます。 > (time (tarai 200 100 0)) cpu time: 0 real time: 0 gc time: 0 #<promise:?> どこかにforceを書けばいいのかと思ったのですが、いろいろやってもうまく行 きません。 > (time (force (tarai 200 100 0))) cpu time: 0 real time: 0 gc time: 0 #<promise:?> どなたか見当のつく方、アドバイスをいただけないでしょうか?
594 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 02:12:54 ] forceしろ
595 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 08:50:34 ] timeがpromiseを返してるのでは?
596 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 12:06:33 ] DrSchemeを触らずに595を書いたけど 見当はずれだったみたい ごめんなさい とりあえず (force (delay (time (tarai 200 100 0)))) したら計算できた syntaxにおけるimplicit forcingがうまく働いてないのかも forceはprocedureだから引数がimplicit forceされてforceしようとした値がpromiseじゃなくなってるとか implicit delayとdelayが違う物みたいだし doc読んでないので見当違いかもしれないけど
597 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 12:08:30 ] あ、((lambda (x) x) (time (tarai 200 100 0)))でもいいみたい
598 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 12:11:48 ] >>596 > (force (delay (time (tarai 200 100 0)))) delayいらないんじゃね?
599 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 12:12:56 ] (time (tarai 200 100 0))が関数に渡されたときはちゃんと200が返るけど マクロを含めsyntaxに渡されたときは#<promise:?>が返る
600 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 12:14:05 ] >>598 (force (time (tarai 200 100 0)))だとforceに200が渡されてエラー forceは関数だからだと思われる 明示的にdelayしてないとimplicit forceされる
601 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 12:23:37 ] implicit delayされた物はimplicit forceされる explicit delayされた物はexplicit forceしなくてはいけない implicit delayされた物をexplicit forceすることはできない explicit delayされた物はimplicit forceされない implicit forceされるのは値を受け取る継続が関数の場合のみ timeはsyntaxであるから#<struct:promise>でなく#<promise:?>が返される ってことかな?
602 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 12:34:26 ] implicit promiseはimplicit forceされると最早implicit promiseでなくなる 他方、explicit promiseはexplicit forceされてもexplicit promiseのまま (define x (call/cc (lambda (return) (delay (return 'value))))) x -> #<struct:promise> (promise? x) -> #t (force x) (promise? x) -> #f x -> 'value こんな感じなのかな
603 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 12:42:06 ] > (time 1) cpu time: 0 real time: 0 gc time: 0 1 > (time (+ 1 1)) cpu time: 0 real time: 0 gc time: 0 #<struct:promise> だなあ。
604 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 13:16:33 ] v372@PPCmacだと ようこそ DrScheme, バージョン 372 [3m]. 言語: Lazy Scheme. > (time 1) cpu time: 0 real time: 1 gc time: 0 1 > (time (+ 1 1)) cpu time: 0 real time: 0 gc time: 0 #<promise:?> になりますね とにかく構文に渡されたimplicit promiseはimplicit forceされないので implicit forceされた物を構文に渡さないといけないみたい
605 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 13:24:37 ] いや違った 構文の値を受け取る継続がトップレベルまたは構文の場合は implicit forceされない…のかも
606 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 14:14:59 ] 単に値をpromiseで持ち回ってるのではなくて ちゃんと正規評価してると考えた方がいいのかも ifやcond遅延評価処理系では関数的な構文 トップレベルでは評価されない そういった意味では構文はquoteとdefineとset!とlambdaとその派生式のみになる timeやifやcondやandやorは関数的な構文なので評価されない これで辻褄が合うと思う
607 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 14:18:15 ] typo ifやcond*などの*遅延評価処理系では関数的な構文 つまり(quoteなどの関数では記述できない構文)以外のことね
608 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 14:19:34 ] (quoteなどの(関数では記述できない構文))以外
609 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 16:13:46 ] >>603 はv360
610 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 16:19:12 ] ようこそDrScheme, バージョン 360. 言語: Lazy Scheme. > (fact 10) 3628800 > (time (fact 10)) cpu time: 0 real time: 0 gc time: 0 #<struct:promise> > (force (time (fact 10))) cpu time: 0 real time: 0 gc time: 0 ※ force: expected argument of type <promise>; given 3628800 > (force (delay (time (fact 10)))) cpu time: 0 real time: 0 gc time: 0 ※ force: expected argument of type <promise>; given 3628800 > (+ 0 (time (fact 10))) cpu time: 0 real time: 0 gc time: 0 3628800 だな。このバージョンのトップレベルはなんかおかしいな。
611 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 16:40:16 ] ・自己評価データは評価される ・変数参照は評価される ・手続き呼出しは評価される ・マクロ使用は展開される ・defineは束縛した変数が参照されるまで評価されない ・quote、begin、lambda、quasiquote、delayは評価される ・構文定義構文は不明 ・これら以外は評価されない ・評価される式から参照される式は評価される という構文周り以外はオーソドックスな実装になってるみたい 末尾再帰がspace leakしないし
612 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 16:44:28 ] ・これら以外は(トップレベルでは)評価されない、に訂正 トップレベル以外で評価される文脈に於いては構文も評価される
613 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 16:47:00 ] defineはトップレベルでも評価されるが 束縛された式(正しくない表現だけど意図を察してください(^_^;))は 変数が参照されるまで評価されない、という表現に訂正