[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 2chのread.cgiへ]
Update time : 05/09 15:00 / Filesize : 210 KB / Number-of Response : 784
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

Lisp Scheme Part19



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

477 名前:デフォルトの名無しさん mailto:sage [2008/02/06(水) 23:02:29 ]
... まあええやん。次いこ。

478 名前:デフォルトの名無しさん mailto:sage [2008/02/07(木) 00:23:25 ]
>>474
絡む気は毛頭ないですが、
ざっと読むだけで必要、不必要が分かるってのは
言い過ぎな気がします

ざっと見た人が不必要だと思ったものでも、じっくり
読めばありな部分とかはないもんですかね?

基本的に安いものじゃないんで本はじっくり見る派です。

479 名前:デフォルトの名無しさん mailto:sage [2008/02/07(木) 02:41:50 ]
関数型言語マニアのための論文紹介3:FelleisenとSICPとHTDP
d.hatena.ne.jp/sumii/20060413/1144920144
SICP目次
d.hatena.ne.jp/win_fmv/20000101
HtDP目次
d.hatena.ne.jp/win_fmv/20000102

HtDPはSICPより易しいです。
でも「計算機プログラムの構造と解釈」を読み通す根性がないなら
英語アレルギーを乗り越えてHtDPを読むのはなおさら無理です。
素直に「計算機プログラムの構造と解釈」を買って熟読しましょう。

480 名前:デフォルトの名無しさん mailto:sage [2008/02/07(木) 05:48:04 ]
どこかのスレにあった紹介だと思うが、
よほどの超絶英語コンプレックスだったんだな、それ書いたやつ。

481 名前:デフォルトの名無しさん mailto:sage [2008/02/07(木) 07:51:12 ]
>>478
ママに読んでもらえバカ。

482 名前:デフォルトの名無しさん mailto:sage [2008/02/07(木) 08:00:49 ]
じゃあ僕はコンピューターおばあちゃんに読んでもらいます。

483 名前:デフォルトの名無しさん mailto:sage [2008/02/07(木) 12:51:51 ]
guileはutf-8で日本語は使えないのでしょうか?


484 名前:デフォルトの名無しさん mailto:sage [2008/02/07(木) 20:44:33 ]
>>483
> guileはutf-8で日本語は使えないのでしょうか?

guile> (let ((s "日本語表示テストです."))
(string? s))
#t
guile>


485 名前:デフォルトの名無しさん mailto:sage [2008/02/07(木) 20:51:57 ]
日本語が使えるが何を意味してるかによる



486 名前:デフォルトの名無しさん mailto:sage [2008/02/07(木) 21:12:09 ]
まあ、日本語なんてこっちじゃ乞食でも気違いでも使ってるからね

487 名前:デフォルトの名無しさん mailto:sage [2008/02/07(木) 22:59:39 ]
gosh> (define (日本語が使えますか?) #t)
日本語が使えますか?
gosh> (日本語が使えますか?)
#t


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自体を実装していないようです.






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<210KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef