08/02/03 17:51:47
>>>444
全く問題ないよ。
Schemerになりなさい。
447:デフォルトの名無しさん
08/02/03 17:57:42
>>444
読めるよ。全10章中、Yコンビネータが出てくるのは第9章だけ。
これを理解するのに "To Mock A Mockingbird" が巻末で推奨されている。
"Litle Schemer" は習うより慣れろの精神で書かれているので読みやすい。
448:デフォルトの名無しさん
08/02/03 18:02:35
Yコンビネータなんて見りゃどういう事か直感で判るだろ
449:デフォルトの名無しさん
08/02/03 18:03:57
Arcはハッシュが標準装備か。連想リストを使わないでこれもいいかも。
arc> (= var (table))
#hash()
arc> var
#hash()
arc> (= (var 'x) 'x1)
x1
arc> (= (var 'y) 'y1)
y1
arc> var
#hash((y . y1) (x . x1))
arc> (var 'x)
x1
arc>
450:デフォルトの名無しさん
08/02/03 18:11:41
この辺りはCommonLisp風なんだね。
arc> (cdr '())
nil
arc> (car '())
nil
arc> (is '() nil)
t
arc>
451:デフォルトの名無しさん
08/02/03 18:14:59
こんなのもあるんだ~。
arc> (type "a")
string
arc> (type 1)
int
arc> (type 0.1)
num
arc> (type 'a)
sym
arc> (type '(a))
cons
arc> (type 1+1i)
num
arc>
452:デフォルトの名無しさん
08/02/03 18:19:04
>>445
>>446
>>447
>>448
アドバイスありがとうございます。
C++ばかりやっていて数学的基礎もあまりなく
どうかと思ってたのですが、まずはSchemerシリーズ
3冊を一読してから考えます。
453:デフォルトの名無しさん
08/02/04 00:54:10
一言語を学び始めるのに入門書を3冊読む?気軽にやれよ
454:デフォルトの名無しさん
08/02/04 04:14:49
The Little ~
URLリンク(www.crockford.com)
455:デフォルトの名無しさん
08/02/04 12:54:21
Arcのリストと文字列って?
arc> (subst 'a '(b) '(a b c))
"aac"
arc> (subst "a" "b" "abc")
"aac"
arc>
456:デフォルトの名無しさん
08/02/04 13:26:47
【普通のやつらの】 Arc Language 0 【上を行け】
スレリンク(tech板)
ついカッとして立ててみた。悪気はなかった。たとえスレが寂れても
後悔するつもりはない。
457:デフォルトの名無しさん
08/02/05 15:07:50
正直サブタイトルは要らなかったと思う
458:デフォルトの名無しさん
08/02/05 15:15:24
荒し呼んでるようなもんだもんなw
459:デフォルトの名無しさん
08/02/05 16:24:01
ま、スレが盛り上がるのを期待してるよ。おれたちの期待の
斜め上を行ってくれ。w
460:デフォルトの名無しさん
08/02/05 18:29:14
アルファブロガー隔離スレだろ
461:デフォルトの名無しさん
08/02/05 18:55:28
たとえ荒氏でも廃れるよりはマシということかw
Arc自体、ちゃんとしたモノになるまでまだ何年かは時間が掛かるだろう。
462:デフォルトの名無しさん
08/02/05 19:06:57
現役処理系で動く3-Lispの系統の実装ってありますか?
3-Schemeとか、3-Arcでもいいです。
; Smithの元の実装はMacLISPでした。
463:デフォルトの名無しさん
08/02/05 19:12:07
HtDP (How to Design Programs) って読んだ人いる?
URLリンク(www.htdp.org)
これどんなもんなんかな?
464:デフォルトの名無しさん
08/02/05 21:45:46
>>463
お前が読めばいいだろ。
465:デフォルトの名無しさん
08/02/06 09:32:49
>>464
そんないじわるな事言わないで><
466:デフォルトの名無しさん
08/02/06 10:17:02
何かと思ったら全部オンラインで読めるじゃん
読むぐらい自分でしろよ
467:デフォルトの名無しさん
08/02/06 10:20:38
つーか読みもしないで損得勘定してるのが気に入らんな。
消え失せろ。
468:デフォルトの名無しさん
08/02/06 12:18:18
>>467
偉そうな事言わないで><
ネットで吠える事しかできない低能くん。
469:デフォルトの名無しさん
08/02/06 12:30:13
自爆かよ
470:デフォルトの名無しさん
08/02/06 15:22:53
>< ←これがきもい
471:デフォルトの名無しさん
08/02/06 15:34:42
468 デフォルトの名無しさん [sage] Date:2008/02/06(水) 12:18:18 ID: Be:
>>468
偉そうな事言わないで><
ネットで吠える事しかできない低能くん。
472:デフォルトの名無しさん
08/02/06 19:30:38
>>463
以前ざっと読んだよ。
いきあたりばったりでしかプログラム書いたことのない無能向け教科書。
473:デフォルトの名無しさん
08/02/06 20:25:59
>472
つまりごく当たり前の事しか書いてないと言いたいわけか。
474:デフォルトの名無しさん
08/02/06 21:07:29
>>473
思考の段取りもつけられないようなバカも
少なからず存在しているのが世の中なわけで。
プログラミング上の概念については何がとりあげられているかは
目次見ればわかる。あとはデザイン・レシピの部分を拾って
ざっと流せば自分にとって読む必要のあるなしは判断できるだろう。
475:デフォルトの名無しさん
08/02/06 22:03:52
>>474
> 思考の段取りもつけられないようなバカも
> 少なからず存在しているのが世の中なわけで。
ちゃいます!!!
"少なからず"ではなく, 彼らの方が多数なんです, 現場に行けば...
476:デフォルトの名無しさん
08/02/06 22:31:14
現場に恵まれていませんね
477:デフォルトの名無しさん
08/02/06 23:02:29
... まあええやん。次いこ。
478:デフォルトの名無しさん
08/02/07 00:23:25
>>474
絡む気は毛頭ないですが、
ざっと読むだけで必要、不必要が分かるってのは
言い過ぎな気がします
ざっと見た人が不必要だと思ったものでも、じっくり
読めばありな部分とかはないもんですかね?
基本的に安いものじゃないんで本はじっくり見る派です。
479:デフォルトの名無しさん
08/02/07 02:41:50
関数型言語マニアのための論文紹介3:FelleisenとSICPとHTDP
URLリンク(d.hatena.ne.jp)
SICP目次
URLリンク(d.hatena.ne.jp)
HtDP目次
URLリンク(d.hatena.ne.jp)
HtDPはSICPより易しいです。
でも「計算機プログラムの構造と解釈」を読み通す根性がないなら
英語アレルギーを乗り越えてHtDPを読むのはなおさら無理です。
素直に「計算機プログラムの構造と解釈」を買って熟読しましょう。
480:デフォルトの名無しさん
08/02/07 05:48:04
どこかのスレにあった紹介だと思うが、
よほどの超絶英語コンプレックスだったんだな、それ書いたやつ。
481:デフォルトの名無しさん
08/02/07 07:51:12
>>478
ママに読んでもらえバカ。
482:デフォルトの名無しさん
08/02/07 08:00:49
じゃあ僕はコンピューターおばあちゃんに読んでもらいます。
483:デフォルトの名無しさん
08/02/07 12:51:51
guileはutf-8で日本語は使えないのでしょうか?
484:デフォルトの名無しさん
08/02/07 20:44:33
>>483
> guileはutf-8で日本語は使えないのでしょうか?
guile> (let ((s "日本語表示テストです."))
(string? s))
#t
guile>
485:デフォルトの名無しさん
08/02/07 20:51:57
日本語が使えるが何を意味してるかによる
486:デフォルトの名無しさん
08/02/07 21:12:09
まあ、日本語なんてこっちじゃ乞食でも気違いでも使ってるからね
487:デフォルトの名無しさん
08/02/07 22:59:39
gosh> (define (日本語が使えますか?) #t)
日本語が使えますか?
gosh> (日本語が使えますか?)
#t
488:デフォルトの名無しさん
08/02/07 23:27:38
日本語schemeキタコレ
489:デフォルトの名無しさん
08/02/08 00:20:27
全角カッコのあつかいはどうなるのでしょうか
490:デフォルトの名無しさん
08/02/08 01:27:27
全角なんてありませんよw
491:デフォルトの名無しさん
08/02/08 01:34:32
lispとかschemeとかやってるとチョコレートもらえないって
先輩が言ったんですけど、ほんまですか?
492:デフォルトの名無しさん
08/02/08 01:36:14
あ、それは本当です。でも人に喋っちゃ駄目だよ。
493:デフォルトの名無しさん
08/02/08 01:38:25
いつもの倍でお得になります。
494:デフォルトの名無しさん
08/02/08 01:47:57
チョコレートもらえないからlispとかschemeとかやって
せつないきもちをまぎらわすんだよ
495:デフォルトの名無しさん
08/02/08 06:09:52
チョコレートなんてLispで書けばいいだろ。
496:デフォルトの名無しさん
08/02/08 08:51:30
((lambda (choco) (choco choco)) (lambda (choco) (choco choco)))
497:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/02/08 15:26:02
>>497
guileではcharacterは8bitだったはず
(integer->char 256)はエラー
バイナリデータと文字が混在するファイルを扱う場合は
こっちのほうが割り切って使えるからいい
499:デフォルトの名無しさん
08/02/08 16:31:45
ちょうどいいからお前らにUTF-8の文字数を数える
プログラムでも書いてもらおうかな。
【問題】上のGuileのような文字列のバイト列を
UTF-8とみなし、その文字数を返す関数を書け。
500:デフォルトの名無しさん
08/02/08 16:44:49
宿題スレでLispの質問しちゃいけないわけじゃないでしょ?
501:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/02/08 17:19:21
続きが書き込めない
503:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/02/09 21:41:09
Windows Vistaなんだけど、
SBCL1.0.13よりLarcenyのほうが圧倒的に速いんだけど
こんなものなの?
506:デフォルトの名無しさん
08/02/09 21:52:43
コンパイルした?
507:デフォルトの名無しさん
08/02/09 22:12:21
>>462
3-Schemeと言っていい、Brownと後継Bloodはみつからず、
その代わり米澤研のRScheme, Blackが見つかりました。
RSchemeは論文に全コードが、Blackは米澤研のWebサーバ:/pub/black
508:デフォルトの名無しさん
08/02/09 23:38:58
ウィンドウスxpで使えて最初から
hspみたいなライブラリがついてる実装って無い?
509:デフォルトの名無しさん
08/02/10 01:03:55
>>505
測定したプログラムや測定方法を書いてくれたら追試してくれる人が居るかもよ
510:デフォルトの名無しさん
08/02/10 01:06:52
Larcenyのほうが設計が10年以上新しいんだし、そんなもんじゃね。
>>508はPLT Schemeとかどうよ。
511:デフォルトの名無しさん
08/02/10 03:04:12
scsh という Scheme シェルを入れてみた。未だ起動もしてないけど。
URLリンク(www.scsh.net)
それだけ。
512:デフォルトの名無しさん
08/02/10 08:43:08
>>508
つ URLリンク(community.schemewiki.org)
つ URLリンク(community.schemewiki.org)
513:デフォルトの名無しさん
08/02/10 11:47:46
>>510
見てみます
ありがとうございました
514:デフォルトの名無しさん
08/02/10 22:14:31
>>505
Larceny めちゃくちゃ速いんで驚いたよ。
主要開発メンバーってLight Ship MacScheme 作ってた人でしょ。
この処理系、かなり期待。
515:デフォルトの名無しさん
08/02/10 22:31:00
いやだからコンパイラで比べてるのかインタプリタで比べてるのかくらい晒してくれよ
516:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/02/10 23:00:19
現在のLisp処理系のコンパイラってどんな仕組みになってんの?
Lisp1.5の時代はLAPを使ってたけど、今はVMなんかね?
Arcのコード読みでああいう簡単なのはおおよそわかったけど、
本格的なのってどういう仕組みをとってるんだろう。
518:デフォルトの名無しさん
08/02/10 23:05:01
ネイティブ吐くのもいるし、
独自じゃなくて、JVMをターゲットにするのもある。
519:デフォルトの名無しさん
08/02/10 23:58:11
最近ではC言語のソースを吐くってのは流行らんのかね?
あれ、良いと思うんだけどな。
520:デフォルトの名無しさん
08/02/11 00:03:19
C言語のソースを吐かれても人間が可読でなければ意味がない。
521:デフォルトの名無しさん
08/02/11 00:04:18
yaccとかlexの立場がないな
522:デフォルトの名無しさん
08/02/11 00:04:51
いや、新しいCPUの最適化とかをC言語コンパイラに任す事ができるw。
523:デフォルトの名無しさん
08/02/11 00:30:25
SBCLのManualページを見たけどよくわからない
・・・俺が馬鹿なのは知ってるから。
SBCLのコンパイルから実行までの手順をご教授願いたい。
正直言って
初めてLISPをインストールして
「どんなのかなあ?使ってみようかなあ」と思っても
CやJAVAのように簡単に入口の手順が調べられないんですよ。
「そんな厨はLISP使うな!」は無しでお願いします。
524:デフォルトの名無しさん
08/02/11 00:44:41
「SBCLをコンパイルする」のか「SBCLでコンパイルする」のかで、話が変わると思うよ
525:デフォルトの名無しさん
08/02/11 00:47:36
>523
で、プラットフォームは何?
Mac,Linux,Windows?
初めてでWindows上ならxyzzy上のLispなんかの方が手近だと思うが。
Meadowだ、slimeだ、Emacsだとかは面倒くさいでしょ?
526:デフォルトの名無しさん
08/02/11 01:01:22
xyzzyは独自仕様だからお勧めしにくいな。俺のお薦めはCLISP。
527:デフォルトの名無しさん
08/02/11 01:08:39
1. LispWorks Personal Edition をダウンロードする
2. インストールする
3. New File でファイルを編集
4. コンパイルボタンを押す
5. REPL から呼び出す
528:デフォルトの名無しさん
08/02/11 01:09:31
って言うか、何のために「SBCLのコンパイルから実行」したいの?
それによっても答えが変わると思う
529:デフォルトの名無しさん
08/02/11 01:13:14
i386とpowerpc以外のCPU
LinuxとFreeBSDとMacOSX以外のUnixLikeOSで動かせて
Gauche並の軽さ&速さとは言わないけど
Pythonくらいの軽さ&速さはあるCL処理系ってありますか?
SchemeでもGaucheより速い処理系も軽い処理系もあるけど
速さと軽さのバランスが一番いいのはやはりGauche
コンパイルすればCLのがチョッ速だと思うけど重い処理系が多いように思えます
530:デフォルトの名無しさん
08/02/11 01:16:48
>CやJAVAのように簡単に入口の手順が調べられない
と書いてあるから、SBCL 自体のコンパイルをしたい訳ではないと予想。
cc や javac を使う様な感じで、コンパイル済みファイル(fasl?)を作成して
それをロード→実行する方法を聞いているんじゃないかしら。
すまんが俺は最近 SBCL を触っていないので、やり方が分からん。
531:デフォルトの名無しさん
08/02/11 01:18:32
>>529
CLISP
532:デフォルトの名無しさん
08/02/11 01:22:00
わざわざ答えて頂いたのに申し訳ないのですが
CLISPの最近のverはi386-OpenBSDでも動かないのです
(ビルドは出来るけどsaveinitmem:executable Tとか動かない)
それにちょっと遅すぎます
ECLのほうが速いくらいです
533:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/02/11 01:23:53
そんな無理して CL 使わんでも…。
今度は CLISP より ○○ のほうが優れているように思えます!! とか言いそうだな…。
無理せず Gauche 使えばいいじゃん。
535:デフォルトの名無しさん
08/02/11 01:25:40
>>532
そういう事は先に書かないと駄目だよ
ECL はネイティブコンパイルするから CLISP よりも速くて当然なんじゃないの?
536:デフォルトの名無しさん
08/02/11 01:27:38
ECLは速さはまあ及第点なのですが
重すぎるのが難点
KCLファミリーでありながらCLtl2な所とか
長所もいろいろあるのですが
(*package*がCOMMON-LISP-USERだからCLtl2とみなしてもいいんですよね?)
537:デフォルトの名無しさん
08/02/11 01:29:18
Larceny が勝利!!よって Scheme >>> CL !!! とかやりだしそうだな…。
まぁ、10年以上後発なんだし結果は見えているような。
538:デフォルトの名無しさん
08/02/11 01:31:25
元気な奴だな。マニュアルも読まれずに評価されるCLコンパイラがちょっとだけ気の毒
539:529=532=536
08/02/11 01:43:40
普段はSchemerですが
CLにも敬意を表してちゃんと使えるようになりたいと考えております
多分に主観的ですが
エレガントさはSchemeに分が
それ以外の大部分はCLに分があると思っています
LuaみたいにAnsiCさえあれば動くぜ!みたいな処理系がCLにもSchemeにもほしいものです
540:デフォルトの名無しさん
08/02/11 02:09:14
>>539
GC等のことを考えると速度的なペナルティ無しに完全にANSI-Cの範囲で記述するのは難しい
んじゃないかな。遅い処理系なら作れると思うけど、速くするには何かズルしないと。w
541:デフォルトの名無しさん
08/02/11 02:09:25
(define (valentine choco)
(if (zero? choco)
(display "お前は既に死んでいる")
(display "カエルchokochoko3chokochoko/n合わせてchokochoko6chokochoko")))
542:デフォルトの名無しさん
08/02/11 02:11:41
>>533
(load "tak.fasl")
543:デフォルトの名無しさん
08/02/11 02:37:04
Gaucheの本ってまだぁ?チンチン
544:デフォルトの名無しさん
08/02/11 04:26:33
Common Lispに敬意を払いたいといいつつ
takを選んでしかも最適化宣言無し…意図が無いとしたら天才かもしれん。
haskell使えば?
545:デフォルトの名無しさん
08/02/11 04:46:57
tak の人とは別人じゃないかな?
俺も Schemer が余興でやるなら CL より Haskell が良いと思う
546:デフォルトの名無しさん
08/02/11 17:38:54
URLリンク(lispuser.net)
これを参考にしてSchemeでScheme処理系を書いている。
↑これはわかりやすくて短くていいわ。
それと「Schemeによる記号処理入門」森北出版
547:デフォルトの名無しさん
08/02/11 18:03:40
そこのサイトって誰が書いてるのかわからんし。
結局LISPユーザー向けじゃなくてACLユーザー向けのサイトじゃん。
読んでいて ム カ つ く んですよね。
548:デフォルトの名無しさん
08/02/11 18:06:07
そこはCで書いてくれ
549:デフォルトの名無しさん
08/02/11 18:06:35
またバストダンジョンか
550:546
08/02/11 19:40:01
>>547
そこってなんかヤバイんかい?
しっかりしたまともな内容だと思うけど...
551:デフォルトの名無しさん
08/02/11 19:47:46
>>550
ごめんかんちがいかも。
でもなんか気色悪いわ。
552:デフォルトの名無しさん
08/02/11 19:49:08
>>547 は別のサイトと勘違いしてるっぽい感じがするけど
553:デフォルトの名無しさん
08/02/11 19:52:38
>>547
俺には一部のACL向けの記事があるだけのように思うが。
ちゅうか中の人はCLISPの開発者なんだし、誤解のような気もするけど。
554:547
08/02/11 20:55:01
>>553
そうなんだ?完全に勘違いですね。ごめんなさい>>All
555:デフォルトの名無しさん
08/02/11 21:08:43
日本語で PLT Scheme を説明してるサイトってどっかにありませんかね?
556:デフォルトの名無しさん
08/02/11 21:46:32
>>>555
Shiroさんとこのwilikiにある↓をいつも参考にしてるよ。
URLリンク(practical-scheme.net)
557:デフォルトの名無しさん
08/02/11 21:48:00
あ、まちがえた。MzじゃなくてDRの方だよね。
558:デフォルトの名無しさん
08/02/11 23:00:04
Drに入ってる言語のオプションがよくわからないんです><
559:555
08/02/11 23:13:00
>>557
PLT Scheme で GUI を作りたいと考えています。
560:デフォルトの名無しさん
08/02/11 23:27:19
>>559
Drは使ったことがないのでよくわからないけど
MrEDと連携してグラフィクスなんかできたんじゃ
なかったっけ。
561:デフォルトの名無しさん
08/02/12 19:14:40
HaskellにはLispのような優秀なマクロがないので埋め込み言語を実装しにくいって本当かね?
562:デフォルトの名無しさん
08/02/12 19:45:30
マクロよりS式の方が大きいでしょ。
S式はDSLのプロトタイプに最適だもん。
Lisp1.5の時代から、俺eval、俺apply作れたんだから。
563:デフォルトの名無しさん
08/02/12 19:47:36
一方、しっかりした仕様のある言語なら、
pugsの例を見るまでもなくHaskellも結構いける。
宣言型のコード書きやすいから。
Prologはどっか行っちゃった。
564:デフォルトの名無しさん
08/02/14 08:57:01
第2回gauche.nightチケット売り切れました。
本当にありがとうございました。
565:デフォルトの名無しさん
08/02/14 12:31:55
どういたしまして
566:デフォルトの名無しさん
08/02/15 00:50:36
>>564
本も売り切れるといいね。
567:デフォルトの名無しさん
08/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
08/02/15 01:32:22
もしそうだとすると,その束縛関係が参照されるのは,
syntax定義の時点でしょうか,それとも
syntax呼び出しの時点でしょうか.
569:567
08/02/15 01:57:21
>>568 の質問の形を変えます.
syntax定義時と呼び出し時とで異なる値に束縛されたsymbolは
どちらの値に置き換えられて評価されるのでしょうか.
単純なscopeの優先度からすると,syntax呼び出し時の値が使われそうですが,
closureやsyntaxが制作者の意図通り動くことを保証するためには
syntax定義時の値が使われるべきなのではないかと思うのです.
closureだとclosure定義時の環境が参照されると理解しています.
570:デフォルトの名無しさん
08/02/15 02:48:34
そこまで確信してるなら「scm ではないある処理系」の製作者に直接言えば?
571:デフォルトの名無しさん
08/02/15 08:29:51
どちらが正しいかを決めるルールが存在するとは限らない。
572:567
08/02/15 08:52:11
混乱していましたが一晩寝たら少し整理できたように思います.
本の説明とscmの実装が正しいとして,束縛関係の優先順位が
1.syntax定義時
2.syntax呼び出し時
であれば納得できそうです.
573:デフォルトの名無しさん
08/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
08/02/15 13:04:47
>>573
要を得ない質問の意図をくみ取ってくださり
的確なご解説をいただきましてありがとうございます.
>>573を読み返して考えてみます.
575:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/02/15 14:10:53
R5RS保健的マクロの束縛識別子は処理系によって解釈が分かれてるから使わない方が吉かも。
束縛識別子とは(let ((x 10)) ...)とか(define x 100)に於けるxのことで
変数捕獲を防ぐ為にリネームされるハズなんだけど
リネームしてくれないscm系
必要最小限にリネームするGauche系
必ずリネームするScheme48系があって
それぞれ挙動が違う。
577:567
08/02/15 14:16:58
>>573
ありがとうございます.ようやく理解できました.
マクロ使用における束縛関係の優先順位も,使用時の束縛関係が
定義時の束縛関係に優先するとしたほうが自然であると納得できました.
私の混乱の原因のひとつに,マクロのtemplate上のsymbol「=>」と,
マクロを適用するユーザコード上のsymbol「=>」とを混同していたことが
ありました.これらを明確に区別すべきでした.
なお,>>567に書きました非scmの処理系はbigloo(ver.3.0c)です.
また,guileはdefine-syntaxやsyntax-rules自体を実装していないようです.
578:デフォルトの名無しさん
08/02/15 14:18:31
guileは(use-syntax (ice-9 syncase))をすると
syntax-caseとsyntax-rulesが使えるようになります
579:デフォルトの名無しさん
08/02/15 14:22:37
束縛識別子でもlet系の場合はどの処理系もリネームしてくれるんだった。
defineは使わない方が吉、の間違い。
scm系はリネームせずにdefineします。
Gaucheは(多分)set!として働く場合はリネームしませんがそれ以外はリネームします。
Scheme48系は常にリネームします。
なのでマクロテンプレート以外から参照できません。
580:デフォルトの名無しさん
08/02/15 14:28:19
ああさらに間違い。
Gaucheはトップレベルdefineはリネームせず、内部defineのみリネームするようです。
581:デフォルトの名無しさん
08/02/15 14:36:22
また少しだけ衛生的マクロが嫌いになりました
582:567
08/02/15 14:36:34
>>575 - >>580
みなさま情報ありがとうございます
>>578 の方法でguileでも>>567のコードを正しく評価できました
583:デフォルトの名無しさん
08/02/15 14:38:29
>>577
マクロテンプレート(例えば(let ((temp test)) (if temp (result temp))))中の(この例では現れていませんが)=>は
マクロ定義された場所で可視だった束縛を参照します。
マクロパターン(例えば(Cond (test => result)))中の=>は
マクロ使用式(Cond (#t => 'ok))中の識別子=>とのマッチングに使われます。
マクロ使用式の=>とマクロ定義の=>がともに未束縛であるか
或いは同じ束縛(例えばトップレベル変数)を持つ場合にのみマッチする訳です。
584:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/02/15 15:00:33
最初の単語から間違えたorz
パターン(foo X Y)の間違い
586:デフォルトの名無しさん
08/02/15 15:36:36
リテラル識別子ってsyntax-rulesのところで束縛されているように見えるけど
本当に束縛してしまうと絶対にマッチしないパターンになるのか
紛らわしいな
587:デフォルトの名無しさん
08/02/15 15:54:38
なんか長々と分かりにくい書き方だったな
リテラル識別子はパターン部分で特別扱いするだけ
でもリテラルといいながら変数と看做したときの束縛までマッチングに利用するのは少し変な気がする。
パターン変数:任意の式にマッチする。テンプレート中ではマッチした式として挿入される。
リテラル識別子:同じ束縛を持つ同じ識別子とだけマッチする。テンプレート中ではパターン変数以外の識別子と同じ扱い。
パターン変数以外の識別子:テンプレート中の変数参照はマクロ定義された位置での束縛の参照が挿入される。
テンプレート中の束縛コンストラクタで新たに束縛される場合はその参照と共に改名される。
これの方がいいかな
588:デフォルトの名無しさん
08/02/15 16:01:42
URLリンク(www.r6rs.org)
>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:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/02/15 16:56:06
typo
同一されている->同一視されている
591:デフォルトの名無しさん
08/02/15 18:14:38
Gauche0.8.13がリリースされてたのか!
気付かなかった
592:デフォルトの名無しさん
08/02/15 18:15:03
Schemeのconsを少し勉強していたら以前さっぱりだったC++の
再帰のメタプログラムがわかるようになってきた。
両方勉強しようと思う。
593:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/02/16 02:12:54
forceしろ
595:デフォルトの名無しさん
08/02/16 08:50:34
timeがpromiseを返してるのでは?
596:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/02/16 12:08:30
あ、((lambda (x) x) (time (tarai 200 100 0)))でもいいみたい
598:デフォルトの名無しさん
08/02/16 12:11:48
>>596
> (force (delay (time (tarai 200 100 0))))
delayいらないんじゃね?
599:デフォルトの名無しさん
08/02/16 12:12:56
(time (tarai 200 100 0))が関数に渡されたときはちゃんと200が返るけど
マクロを含めsyntaxに渡されたときは#<promise:?>が返る
600:デフォルトの名無しさん
08/02/16 12:14:05
>>598
(force (time (tarai 200 100 0)))だとforceに200が渡されてエラー
forceは関数だからだと思われる
明示的にdelayしてないとimplicit forceされる
601:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/02/16 13:24:37
いや違った
構文の値を受け取る継続がトップレベルまたは構文の場合は
implicit forceされない…のかも
606:デフォルトの名無しさん
08/02/16 14:14:59
単に値をpromiseで持ち回ってるのではなくて
ちゃんと正規評価してると考えた方がいいのかも
ifやcond遅延評価処理系では関数的な構文
トップレベルでは評価されない
そういった意味では構文はquoteとdefineとset!とlambdaとその派生式のみになる
timeやifやcondやandやorは関数的な構文なので評価されない
これで辻褄が合うと思う
607:デフォルトの名無しさん
08/02/16 14:18:15
typo
ifやcond*などの*遅延評価処理系では関数的な構文
つまり(quoteなどの関数では記述できない構文)以外のことね
608:デフォルトの名無しさん
08/02/16 14:19:34
(quoteなどの(関数では記述できない構文))以外
609:デフォルトの名無しさん
08/02/16 16:13:46
>>603はv360
610:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/02/16 16:40:16
・自己評価データは評価される
・変数参照は評価される
・手続き呼出しは評価される
・マクロ使用は展開される
・defineは束縛した変数が参照されるまで評価されない
・quote、begin、lambda、quasiquote、delayは評価される
・構文定義構文は不明
・これら以外は評価されない
・評価される式から参照される式は評価される
という構文周り以外はオーソドックスな実装になってるみたい
末尾再帰がspace leakしないし
612:デフォルトの名無しさん
08/02/16 16:44:28
・これら以外は(トップレベルでは)評価されない、に訂正
トップレベル以外で評価される文脈に於いては構文も評価される
613:デフォルトの名無しさん
08/02/16 16:47:00
defineはトップレベルでも評価されるが
束縛された式(正しくない表現だけど意図を察してください(^_^;))は
変数が参照されるまで評価されない、という表現に訂正
614:デフォルトの名無しさん
08/02/16 16:54:10
v360とv372は評価されなかった構文の値の表記が異なるだけで
挙動自体は同じみたいですね
とにかくifもcondもandもorも正格評価の為に構文とされちゃった物は
関数でラッピングしちゃえばいい
(define lazy-if
(lambda (pred then-clause else-clause)
(if pred then-clause else-clause)))
みたいに
615:デフォルトの名無しさん
08/02/16 16:57:50
と思ったら
> (force (delay (time (fact 10))))
cpu time: 0 real time: 0 gc time: 0
※ force: expected argument of type <promise>; given 3628800
ここが違いますね
v372だと時間が計測されて3628800が返ります
616:デフォルトの名無しさん
08/02/16 17:05:28
time構文はトップレベルでも式が自己評価データの場合は評価されるんだ
でも式が変数参照だと?じゃないpromiseを返す
単にバグバグなだけかも…
617:デフォルトの名無しさん
08/02/16 17:12:19
自己評価データでなくリテラルの場合だった
618:567
08/02/16 18:03:55
DrSchemeの話題で盛り上がっているところ申し訳ありません.
macro 展開の際に,あらかじめ symbol の束縛関係が参照されると理解しました.
この点についてもう少し具体的に質問させてください (>>589の記述に関係しているのかもしれません).
内部で set! を呼ぶだけの macro Set1 を書いてみました.
;; マクロ定義
(define-syntax Set1 (syntax-rules () ((_ macroSymA macroSymB) (set! macroSymA macroSymB))))
;; 前準備
(define variable 200)
(define newValue 900)
variable ;;==> 200
;; マクロ呼び出し
(Set1 variable newValue)
;; 結果
variable ;;==> 900
もしも処理系が macro 適用時に「手続き set! は第1引数として symbol を取る」という事実を知らないで
無条件に macro に渡された引数の束縛関係を解決 (symbol を束縛値に置換) してしまうのであれば,
(newValue を束縛値 900 に置換するのと同様に) variable も束縛値 200 に置換してしまってから
macro 展開が行われるので,評価対象が (set! 200 900) となってエラーになってしまうはずです.
実際にはそうならないのは,処理系が macro 適用時に
(set! macroSymA macroSymB) が特殊な手続き set! の呼び出しであることを認識して,
(第2引数の newValue のほうは通常どおり束縛値 900 で置換してよいのだが)
第1引数である variable については束縛値で置換することを敢えて行わず,
symbol 「variable」 のまま macro 展開しているからである,と理解してよいでしょうか.
619:デフォルトの名無しさん
08/02/16 18:36:03
束縛関係の解決と評価(この場合は変数参照)は違います。
束縛関係の解決とは
C言語風に言えば「変数名がどのアドレスを指すかを確定する事」であり
実際にそのアドレスから値を読み込む事ではありません。
マクロ置換に於いては
syntax-rulesの第一引数のリストに列挙されている識別子のみ
アドレスも使ったマッチングが行われます。
syntax-rules ()のように識別子が無い場合はアドレスはマッチングに利用されません。
アドレスはマッチング、すなわちどの置換パターンを利用するかを決定するのにのみ利用されるだけです。
そして置換された後の式によって変数が参照されるかどうか決まります。
この場合は置換後の式が(set! variable newValue)なのでvariableは評価されません。
set!の第2引数は評価されるのでnewValueが変数参照されて900となります。
しかし置換後の式が例えば(+ variable newValue)ならば手続き呼出しですので
+が変数参照されて#<procedure +>に
variableが変数参照されて200に
newValueが変数参照されて900に評価されてから
手続きが呼び出されます。
620:デフォルトの名無しさん
08/02/16 18:44:05
(A B C)のリストが評価される場合(A B Cは識別子)
Aが構文に束縛されているかどうかを調べ
・構文に束縛されている場合
・primitive構文に束縛されているなら、その評価規則に従って評価します。
・マクロに束縛されているならパターンマッチを行い、テンプレートに従って置換した後、その式を評価します
・場所に束縛されているなら
・手続き呼出しを行います。AとBとCはすべて評価されますが、順番は決まっていません。
AやBやCが評価されるときに初めて変数参照として値が読み出されます
621:デフォルトの名無しさん
08/02/16 18:52:27
マクロ置換された式がリストならまた620の用に評価されます。
primitive構文はdefine、if、quote、lambda、set!のみで
他の構文は全てマクロです。(R5RSの場合。処理系独自のprimitive構文もあり得る。)
622:デフォルトの名無しさん
08/02/16 18:56:49
(A B C)という手続き呼出しの場合
AとBとCが評価される順番は決まっていませんが
手続きが呼び出される前には評価されます。
つまりAとBとCが評価された後にAが束縛されていた場所の値を手続きとして呼び出します。
もしAの場所の値が手続きでなければエラーとなります。
623:デフォルトの名無しさん
08/02/16 19:07:03
マクロのパターンマッチングは式の形(とリテラル識別子の場合は束縛されている場所)によってのみ行われます
なので例えば
(define x '(1 2))
(define-syntax foo
(syntax-rules ()
((foo (x y)) (list y x))
((foo z) (list z))))
(foo x)
-> '((1 2))
となります。
つまり(foo (x y))にではなく(foo z)にマッチした訳です。
(foo x) --(置換)-> (list x) --(部分式の評価)-> (#<procedure list> (1 2))
-> '((1 2))
というわけです。
624:デフォルトの名無しさん
08/02/16 19:35:58
リテラル識別子とのマッチングは
正しくはアドレスではなく束縛によって行われますので
構文に束縛されているリテラル識別子は
同じマクロ変換子に束縛されている識別子にマッチします。
構文に束縛されている識別子は
場所には束縛されていませんので
アドレスという概念は当てはまりません。
ローカルな変数束縛によって構文束縛が隠蔽される事も
ローカルな構文束縛によって変数束縛が隠蔽される事もあります。
なので束縛の種類とその束縛されているモノと字の綴りが同じ識別子のみが
リテラル識別子にマッチするという方が正しいでしょう。
625:デフォルトの名無しさん
08/02/16 19:48:28
4s/マクロ変換子/構文/
626:567
08/02/16 21:05:57
>>619 - >>625
早速のご返答ありがとうございます.
いま R5RS も見ながら考えさせていただいていますが,もう少し時間をいただきます.
問題の本質とは少しずれますが,私が混乱していた原因の一つに,syntax-rules の
第1引数である literals に含まれている literal-identifier についての誤解があったようです.
「literal」という名前から,字面の一致だけを見るものだと思いこんでいましたが
正しくは,R5RS や >>573 さんはじめ上の書き込みにもさんざんあるように,
literal-identifierは
>>583:
>ともに未束縛であるか
>或いは同じ束縛(例えばトップレベル変数)を持つ場合にのみマッチする
ということなんですね.思いこみで記述が頭に入っていませんでした.
なお,577:で
5s/template上のsymbol/pattern上のsymbol/
でした.
627:593
08/02/18 00:57:16
皆さん、ありがとうございます。遅くなってすみません。
途中から議論が分からなくなってしまったのですが、>>596さんのコードを実
行したところ、tarai は実行されますが、表示される時間は 0 です。
> (force (delay (time (tarai 800 400 0))))
cpu time: 0 real time: 0 gc time: 0
800
すみませんが、これはどうにかならないでしょうか?
628:593
08/02/18 00:59:59
あ、バージョンは最新の 372 です。
629:デフォルトの名無しさん
08/02/18 01:01:00
promise作って終りかw
630:デフォルトの名無しさん
08/02/18 10:52:21
ちゃんと800が返されてるから
正しいのでは?
タライ回し関数は遅延評価で計算すると
正格評価にくらべて格段に速い
631:630
08/02/18 11:04:00
timeで計測できないくらいの短時間で計算できてるって意味です
632:593
08/02/18 13:59:55
いや、もっと時間はかかってます。
(force (delay (time (tarai 1000 500 0)))) を実行してみてください。
これで0秒なのは、おかしいでしょう?
633:593
08/02/18 14:02:07
と言うか、先に0秒という計測結果が表示されてから、10秒ほどして 1000 と
いう計算結果が表示されるのです。もしもっと早いマシンをお使いなら、引数
を適宜増やしてお確かめください。
634:デフォルトの名無しさん
08/02/18 14:48:40
確かに
time構文はLazy Schemeでは使い物にならないと考えた方がいいかも
635:デフォルトの名無しさん
08/02/18 15:18:20
たらいまわしべんちでtime構文が使えないなら、Lazyである意義などない!
636:デフォルトの名無しさん
08/02/18 16:00:56
こんなんで我慢してちょ
(define (bench exp)
__(let* ((start (current-milliseconds))
_________(value exp)
_________(end (current-milliseconds)))
____(display start)
____(newline)
____(display value)
____(newline)
____(display end)
____(newline)
____(display (- end start))))
ミリ秒でしか測れないし
余計な出力もあるのがダサいけど
637:593
08/02/18 17:06:55
>>636
ありがとうございます。ちゃんと動きました。
ありがたいことに、自分にも隅々までよく分かるコードです。
しかし、遅延評価であるがゆえに、逆に副作用だらけになってしまったのが、
少し泣けます。
638:デフォルトの名無しさん
08/02/20 00:54:51
正規表現ってRnRSにもSRFIにも入ってないの?
639:デフォルトの名無しさん
08/02/20 01:05:04
つ URLリンク(community.schemewiki.org)
640:デフォルトの名無しさん
08/02/20 12:33:26
実装はいくらでもあるが、標準仕様がないのはなぜかと問いたい
共通語がないと不便じゃないか
641:デフォルトの名無しさん
08/02/20 12:45:47
R6RSでUnicode化も決まったので、"Beyond R6RS"に入ってます。
URLリンク(schemers.org)
642:デフォルトの名無しさん
08/02/20 14:19:47
正規表現は構造を文字列で表現するとこがLISPっぽくない。
まあ普及しちゃったからしょうがないけど、必要悪だろ。
643:デフォルトの名無しさん
08/02/20 15:01:38
LISPから必要悪を取ったらλしか残らない
644:デフォルトの名無しさん
08/02/20 15:40:04
すみません、MzSchemeやGaucheで、実行中のスタックの遷移を表示するにはど
うしたらよいでしょうか?
URLリンク(www1.ocn.ne.jp)
↑のページで紹介されている、ChezSchemeの trace関数のようなものです。
645:デフォルトの名無しさん
08/02/20 15:50:08
DrSchemeでプロセス間通信とかできますか?
Schemeにはそもそもプロセスという概念が無い?
今はただ関数定義程度の練習レベルです。
646:デフォルトの名無しさん
08/02/20 15:51:20
つまり、Schemeで出来ること、あるいはSchemeの用途
がイマイチ分かってないということです。
647:デフォルトの名無しさん
08/02/20 18:32:37
gccでプロセス間通信とかできますか?
Cにはそもそもプロセスという概念が無い?
今はただ関数定義程度の練習レベルです。
つまり、Cで出来ること、あるいはCの用途
がイマイチ分かってないということです。
648:デフォルトの名無しさん
08/02/20 18:39:45
>>647
そうか。意味不明だったか。確かに。
どういう分野に活かしていくのが普通なんでしょうか?
例えば、CやC++ならネットワークプログラミングとかOSとか
デバイスドライバとか作成しますが、Schemeのアプリケーション
とはどういったものになりますか?コンパイラ作成用途とかになる
んですかね?
649:デフォルトの名無しさん
08/02/20 20:07:12
そういうのはライブラリに拠るんだから一概にどうとは言えないよ。
まあ記号処理には強いだろうね。
650:デフォルトの名無しさん
08/02/20 20:11:01
>>649
記号処理ですか。未知の分野なのでもう少し精進して
調べて見ます。
651:デフォルトの名無しさん
08/02/20 20:42:31
>>644
MzScheme だとライブラリを使えばtrace、untraceもOK。
> (require (lib "trace.ss"))
>
652:デフォルトの名無しさん
08/02/20 20:51:09
>>645
Petite Chez Scheme だとprocessを使って
他のプロセスにデータを送れたよ。
fprintを使うんだったかな。
>>650
数式処理には向いていると思う。
他にもいろいろと応用はあるんじゃないかな。
653:644
08/02/20 21:35:05
>>651
MzScheme, DrSchemeでうまく行きました。
ありがとうございました。
Gauche はこんな感じのようです。
・トレース - 結城浩のSICP日記 - sicp
URLリンク(sicp.g.hatena.ne.jp)
654:デフォルトの名無しさん
08/02/20 21:41:28
>>650
使用言語の選択を誤っていると思う
あなたの場合Lispを選択する意味はないのではないか
一般に手に入る資料が豊富な分C/C++でやるのがよい
655:デフォルトの名無しさん
08/02/20 21:44:42
>>654
C/C++は習得済みで業務で使用してます。
Schemeでプロダクトコード書くわけではないので。
656:デフォルトの名無しさん
08/02/20 21:58:03
lispやってる奴がもれなく超人に見える
だからやりたい
とか言う程の物さ
657:デフォルトの名無しさん
08/02/20 22:16:40
>>655
言語の話とライブラリの話がごっちゃになってないかな。
言語の特徴としては、再帰的な処理の記述とか、
メタなプログラミングが楽とか色々あるけど。
そういうことが知りたいんじゃないんだろうし。
Schemeのアプリケーションって言われても、
ウェブアプリケーションサーバ書いてる人もいれば、
.NET向けのアプリケーションを書くために処理系を実装してたり、
日常的に使うスクリプトをSchemeで書いてる人もいたりして様々。
658:デフォルトの名無しさん
08/02/20 22:22:45
>>657
>再帰的な処理の記述とか、 メタなプログラミング
ここが勉強したいと思ったきっかけです。
>Schemeのアプリケーションって言われても、
>ウェブアプリケーションサーバ書いてる人もいれば、
>.NET向けのアプリケーションを書くために処理系を実装してたり、
>日常的に使うスクリプトをSchemeで書いてる人もいたりして様々。
色々できるんですね。ありがとうございます。
659:デフォルトの名無しさん
08/02/20 22:30:23
>>658
URLリンク(practical-scheme.net)
にある文章をいくつか読んでみたらどうだろう。ここのスレの人とかが、
何故敢えてLispやSchemeを使うのか、理解する助けになると思う。
660:デフォルトの名無しさん
08/02/20 22:32:48
たぶん、プロセス間通信みたいな処理が好きな人は
SchemeよりEmacs Lispの方が楽しめると思う。
CL使わないとLispらしさのかけらもないコードになっちゃうけど。
661:デフォルトの名無しさん
08/02/20 22:52:37
>>657
>言語の特徴としては、再帰的な処理の記述とか、
>メタなプログラミングが楽とか色々あるけど。
>そういうことが知りたいんじゃないんだろうし。
とオレも思ったのだが
>>658
>>再帰的な処理の記述とか、 メタなプログラミング
>ここが勉強したいと思ったきっかけです。
という意外な応答
真意がつかめない
662:デフォルトの名無しさん
08/02/20 22:58:39
便乗質問で恐縮です
Larcenyでtraceは使えるんですが、再帰関数をtraceしても
再帰的にtraceしてくれません
何かうまい使い方があるのでしょうか?
663:デフォルトの名無しさん
08/02/21 00:40:01
>>659
読んで見ます。
>>661
C++でテンプレート使ってライブラリ書きたいんですが
再帰とメタファンクションを使わなければいけないんですよ。
で、そもそも再帰とベースとする言語として関数型言語
を覗いたわけです。
664:デフォルトの名無しさん
08/02/21 07:29:08
>>662
そうなんだよね、traceがちょっと他と違っている。
libにtrace.schがあるんでこれをハックしてみるとか。
665:デフォルトの名無しさん
08/02/21 12:55:30
guile + swig でc++のメタ制御してみて便利さを体験してみたら?
Gimpのスクリプトで遊んでみるのもいいかも
666:デフォルトの名無しさん
08/02/21 14:52:33
gauche本の発売日が1ヶ月伸びてますが、
やっぱりあれだけ赤が入ると無理だったのでしょうか。
667:デフォルトの名無しさん
08/02/21 16:23:22
Gauche本てどんな読者が対象なんだろう。
668:デフォルトの名無しさん
08/02/21 17:23:12
このスレの住人
669:デフォルトの名無しさん
08/02/21 17:24:08
まぁ、まんざらでもないよなw
670:デフォルトの名無しさん
08/02/21 17:49:47
The Little Schemer読んでる俺も対象に入れてくれお
671:デフォルトの名無しさん
08/02/21 18:54:27
>>670
ナカーマ
象さん分かりやすいが、文法のリファレンスも欲しい今日この頃。
お勧めありますか?
672:デフォルトの名無しさん
08/02/21 19:05:40
つR5RS
自分はA5用紙に印刷して綴じて常に携帯してる
ついでに電子辞書にもtxtファイルで入れてる
673:デフォルトの名無しさん
08/02/21 20:28:28
carとcdrは何と読めばいいんでしょうか?
カーとクダーでいいですか?
674:デフォルトの名無しさん
08/02/21 20:29:03
>>672
thx 日本語訳あったんで落とした。
675:デフォルトの名無しさん
08/02/21 21:29:24
>>673
おk
676:デフォルトの名無しさん
08/02/21 22:12:42
>>671 ( ^ω^)λ(^ω^ )ナカーマ
漏れはネットのあちこち入門サイトにお世話になってるお
677:デフォルトの名無しさん
08/02/21 22:23:57
再(再(再(再帰)帰)帰)帰
678:デフォルトの名無しさん
08/02/21 22:56:02
C/C++で仕事するのが面白くなくて辛いです。
Scheme勉強するのは楽しいです。
仕事の時間は無駄な時間に感じます。
679:デフォルトの名無しさん
08/02/21 23:04:03
仕事というのはそういうものですよ
680:デフォルトの名無しさん
08/02/21 23:17:53
確かに、金をもらわなきゃ誰もやらないようなことだからこそ、
金をもらえるんだものね。
金なしでやる人が大勢いるようなことなら、誰も金を出すわけない。
681:デフォルトの名無しさん
08/02/21 23:25:36
家に帰ってSchemeにポートするつもりで作れYO!
ようやって作ったScheme版で独立すれば?という夢ぐらいは持ちたいものだw
682:デフォルトの名無しさん
08/02/21 23:27:08
だれかR6RSの日本語訳早く作れよ
683:デフォルトの名無しさん
08/02/22 00:15:56
R6RSの解説を読んだら、Schemeの欠陥が色々書いてあった
CLは細かいところまでよくできてるっぽいし
見かけによらないものだなーと
684:デフォルトの名無しさん
08/02/22 00:50:01
>>677
先頭の再と末尾の帰が!
685:デフォルトの名無しさん
08/02/22 00:52:27
>>683
>CLは細かいところまでよくできてるっぽい
と思えない俺は異常かおrz
686:デフォルトの名無しさん
08/02/22 01:13:30
(再(再(再(再帰)帰)帰)帰)
687:デフォルトの名無しさん
08/02/22 01:13:33
Common Lisp規格まとめ役のスティール親分が、
Schemeみたいにsymbol-valueとsymbol-functionを統合しとけば良かったなあ
けど互換性を重視したから難しかったんだよ
そう言っておられたぞ。
688:デフォルトの名無しさん
08/02/22 01:35:56
Gauche-libsvmのリンク先に飛べない
Gauche c-wrapperはswigみたいなもの?
なんでswigにしなかったの?
689:デフォルトの名無しさん
08/02/22 05:46:08
>>687
へー、初耳だ。
どこで言ってたの?
690:デフォルトの名無しさん
08/02/22 09:35:15
>>686
それでよし
691:デフォルトの名無しさん
08/02/22 09:37:24
>>687
>symbol-valueとsymbol-function
CL最醜の汚点だと思う
692:デフォルトの名無しさん
08/02/22 11:14:06
>>689
bitの井田さんのインタビューかな?
693:デフォルトの名無しさん
08/02/22 12:06:12
>>691
ちなみに、funcallを書くのは面倒だけど
フォームの頭に構文の名前 (funcallやlambdaやifやマクロの名前) を必ず書きましょう
と考えると汚くはない
funcallが汚いんじゃなくて、funcallを省略できる設計が汚い
694:デフォルトの名無しさん
08/02/22 12:10:21
funcallはあまり気にならないな。むしろ判りやすい。
SPECIAL変数付近の扱いはちょっと汚いかなと思う。
695:デフォルトの名無しさん
08/02/22 12:54:19
個人的にはCLで名前空間が単一/一様でないのは気にかかるところだ
関数とその他の値とを区別無くfirst class objectとして扱うコードを
書きたいときに柔軟性を制約する一因とはならないのだろうか?
696:デフォルトの名無しさん
08/02/22 12:58:11
>>693
その話は関連する話ではあるけど、
symbolがsymbol-valueとsymbol-functionの二つ持つという話そのものから、
ちょっと離れていっていると思います。
一つしかない場合もその種の議論は成立するのですから。
>>694
スペシャル変数は、スレッドローカルな変数とか、
elispみたいなバッファーローカルな変数と同様の「パターン」で、
ある種のライブラリ、応用にはとても自然なeval拡張だと思う。
別の機構も考えられるけども、とてもLisp的だと思う。
(拡張というのはレキシカルスコープなevalに対して)
697:デフォルトの名無しさん
08/02/22 13:01:00
>>695
そういう「特殊な」ことをやる場所ではfuncallを使う。
そういうとこへ関数を渡すときは #' を付けてましょう。
というのが CL 的発想だと思う。大きなプログラムの中での可読性を
考えれば、そんなに悪くないと思う。
純潔なSchemerには我慢できないだろうけど。w
698:デフォルトの名無しさん
08/02/22 13:29:54
>>695
> 関数とその他の値とを区別無くfirst class objectとして扱うコードを
CLが違うのはシンボルにセルが2つあるのと関数を適用するときの特別扱いであって、
「区別無くfirst class objectとして扱う」こと自体は普通に書けるじゃん。
699:デフォルトの名無しさん
08/02/22 13:40:16
座席が区別されてるだけで乗客は区別されない
700:デフォルトの名無しさん
08/02/22 13:43:02
>>696
>一つしかない場合もその種の議論は成立する
そうです
Schemeでも関数なのかマクロなのか判断できなくて困ることがある
CLを汚いと言えるほどSchemeは綺麗じゃない
変数と関数じゃなくて
コンパイル時と実行時とで名前空間を分ければいいのかな?
701:デフォルトの名無しさん
08/02/22 13:44:44
俺は人間が汚れてるから、ちょっと汚い言語のほうが好きだな
702:695
08/02/22 13:51:18
>>697>>698>>699
なるほど
703:デフォルトの名無しさん
08/02/23 12:21:19
>>688
>Gauche c-wrapperはswigみたいなもの?
そう、ヘッダファイルからスタブを自動生成して関数やデータやマクロなんかをGaucheで使えるようにするもの。
>なんでswigにしなかったの?
最初swigを見たとき、バインディングの作り方がよく分からなかったから。
あと、コンパイルとかInterfaceファイルを作るのが面倒そうだったから。
704:デフォルトの名無しさん
08/02/23 17:07:34
The Reasoned Schemer
この本はどのような人を対象としてるか読んだ人分かりますか?
なんかProlog的なコーディングをSchemeでもできるという紹介
文でしたが、これはScheme的ではない異色の内容なんですかね?
705:デフォルトの名無しさん
08/02/23 17:21:57
とてもScheme的な応用の本。
言語プリミティブ的なものが応用対象だから。
706:デフォルトの名無しさん
08/02/24 17:18:06
LispとPrologとは両輪だという話を読んだ覚えがある。
On LispでもPrologやってるし。
707:デフォルトの名無しさん
08/02/24 17:20:49
両輪というより、レイヤーが違う感じかな
708:デフォルトの名無しさん
08/02/24 17:30:57
Lisp/Schemeにはないが、
ML/Haskellはパターンマッチ渡しがあるから、
論理型言語とは「項書換えシステム」で統一的な見方ができる。
The Reasoned Schemerはその点でも面白い。S式は面白い。
709:デフォルトの名無しさん
08/02/24 17:50:24
買ってみようかな
710:デフォルトの名無しさん
08/02/24 17:58:54
The Little Schemerで教えてください。 P.121です。
1> (apples peaches pumpkin pie) はrelではない。なぜならペアのリストではないから。
2> ((apples peaches) (pumpkin pie) (apples peaches)) はrelではない。ペアのセットではないから。
3> ((apples peaches) (pumpkin pie)) はrelですか? yes
4> ((4 3) (4 2) (7 6) (6 2) (3 4)) はrelですか? yes
どういうことなのかさっぱりわかりません。
711:デフォルトの名無しさん
08/02/24 18:02:25
>>710
まだそこまで読んでない。
712:デフォルトの名無しさん
08/02/24 18:09:41
「セット」は重複要素を許しません。それで後は分かりませんか?
;; カッコに全角を使うのは辞めてください。釣りかと思います。
713:デフォルトの名無しさん
08/02/24 18:15:06
>>712
サンクス!そういうことか!
ていうか、章の始めで教わってんじゃん・・・1日悩んじまったorz
全角ゴメン。気をつけます!
てかP.121じゃなくてP.119だし・・・
714:デフォルトの名無しさん
08/02/25 19:07:24
javascriptがlispに匹敵する表現力があるって聞いたのだけど本当?
715:デフォルトの名無しさん
08/02/25 19:39:24
brainfuckですらLispに匹敵する表現力がありますけど?
716:デフォルトの名無しさん
08/02/25 19:40:14
>>714
ecmaスレで聞けよw
717:デフォルトの名無しさん
08/02/25 20:31:44
アセンブラ表現力最強ですけどっ!!
718:デフォルトの名無しさん
08/02/25 20:35:09
表現力最強じゃなくて記述力最強だ
まあいいや
719:デフォルトの名無しさん
08/02/25 20:37:18
どちらにしても曖昧だな。強弱比較できるような概念でもあるまい。
720:デフォルトの名無しさん
08/02/25 21:01:45
スペックじゃんけんがしたいならHaskellを選べばいいと思うよ。
721:デフォルトの名無しさん
08/02/25 21:11:19
brainfuckにすら負けてる正規表現やcppの立場って・・・
722:デフォルトの名無しさん
08/02/25 21:19:45
そのためのPEGとtemplateだろ?
723:デフォルトの名無しさん
08/02/26 00:19:15
初心者は抽象化が苦手だ、とMatzが言ってた
チューリング完全性だけが重要なら、抽象化はどうでもいいはずだが、現実は違う
724:デフォルトの名無しさん
08/02/26 00:48:20
>>714
JavascriptのクラスシステムはJavascriptで書かれてます。
次のバージョンからは組み込みになりますが。
prototype base object systemあたりでググってください。
725:デフォルトの名無しさん
08/02/26 13:22:52
Little schemer P122 P123 に出てきた
Go and get one!
Or better yet, make your own.
は
”先へ進んで、完璧を目指せ!
もっといいのは、自分の力でやることだ。”
という意味であってる?
726:デフォルトの名無しさん
08/02/26 22:17:26
>>725
邦訳の「Scheme手習い」元吉文男、横山晶一訳
たぶん、7章の最後の文だと思うんだけど。
「自分で行って手に入れよ。
さもなくば、独自のものを作れ」
となっている。
727:デフォルトの名無しさん
08/02/26 22:34:52
俺はなんかそんな堅苦しいメッセージじゃなくて、
「ここで一休み、お菓子取ってきなよ♪
でなきゃ、自分で作ってみてはどうかな?」
という意味に取ったけど。
728:デフォルトの名無しさん
08/02/26 22:38:29
>>726
全然違ってた。。
邦訳なんかあったんだ
まあ内容には関係ないからいいか
>>727
お菓子はないだろw
729:デフォルトの名無しさん
08/02/26 22:41:23
>>728
いや、まじめに。だってクッキーの作り方書いてあるじゃん。
730:デフォルトの名無しさん
08/02/26 22:50:15
>>726
その訳でクッキーのレシピはどうなってるの?
731:デフォルトの名無しさん
08/02/26 22:53:27
>>729
ああ、あの囲みのコード?
おれはてっきりあれを自分で完成させろということかと思った。
アメリカンジョーク?
732:デフォルトの名無しさん
08/02/26 22:55:26
>>731
あのコードをみて Make your own cokkies.ということかと・・・・
てか、度々「一休みしてお菓子食べなよ!マスタード忘れないようにNE!」
みたいなメッセージが出てきてるじゃん?
733:デフォルトの名無しさん
08/02/26 22:58:15
>>730
クッキーのレシピがlambda式風に書かれている。
戒律風に訳されているので、この部分も戒律風にわざと訳したのかもね。
734:デフォルトの名無しさん
08/02/26 23:00:22
(define クッキー
(lambda ()
(焼く
(quote (180 度))
(quote (12 分))
735:デフォルトの名無しさん
08/02/26 23:02:47
>>733
そんな風になってるのか。
736:デフォルトの名無しさん
08/02/26 23:02:51
アメリカンジョークというより、ウィットという感じかな。
737:デフォルトの名無しさん
08/02/26 23:03:45
もうフリードマンさんの本全部読んでみたくなってきたw
738:デフォルトの名無しさん
08/02/27 01:17:17
>>725
後半は、
「まだまだいいのがあると思うなら、自分で作ることだね」
739:デフォルトの名無しさん
08/02/27 01:45:50
URLリンク(www.ccs.neu.edu)
> A Food Preparation Place
740:デフォルトの名無しさん
08/02/28 10:57:55
Little Schemer
Seasoned Schemer
Reasoned Schemer
があるんだけど、Little Schemerだけ紙質が悪いんだが
何で?わら半紙みたいでツルツルしてない。
741:デフォルトの名無しさん
08/02/28 11:25:16
>>738
それが一番しっくりくるかな
742:デフォルトの名無しさん
08/02/28 13:49:27
>>740
学生用のテキストは安いのを作ることがある。
743:デフォルトの名無しさん
08/02/28 14:04:29
>>742
ツルツル版もあるの?
744:デフォルトの名無しさん
08/02/28 14:05:50
ハッ!ハッ!ハッ!ハッ!
はげまるくーん
745:デフォルトの名無しさん
08/02/28 14:16:05
醤油こぼしたらオシマイだよ。
746:デフォルトの名無しさん
08/02/28 14:17:46
Schemeすげー、関数を渡せるなんて。C#のdelegateの構文に似たような
ものがあったな。
747:デフォルトの名無しさん
08/02/28 20:41:32
関数ぐらいCでも渡せるだろう
748:デフォルトの名無しさん
08/02/28 23:13:03
クロージャにしても継続にしても
Cでスタックを使うところにヒープを使えば自然と思いつきそうなものだが
Schemeみたいな高級言語で教えるのとどっちが分かりやすいのかね
749:デフォルトの名無しさん
08/02/28 23:15:36
>>747
ポインタはね。関数は無理なのよ。しかも定義を呼び出し関数内に書ける
のがいい。C++のBOOST_FOREACHに似てる感覚。
750:デフォルトの名無しさん
08/02/28 23:56:38
JavaScriptでも出来るぞw
751:デフォルトの名無しさん
08/02/29 00:05:37
高級言語ならそれぐらい出来て当然
752:デフォルトの名無しさん
08/02/29 00:22:34
高級言語w
753:デフォルトの名無しさん
08/02/29 03:20:15
wが意味するところがよくわからないんだが、
巷ではJavaScriptって、高級低級で二分するなら低級のほうに入るのか?
754:デフォルトの名無しさん
08/02/29 03:29:40
それはないw
755:デフォルトの名無しさん
08/02/29 03:39:48
javascriptは超高級だと思うぞ
高級・低級の分かれめってなんだか知らない(たぶん、時代によって変わる)けど、
lambdaが使える言語はみな高級だと思う。
あと、低級っていっても馬鹿にしてるわけじゃないことをお忘れ無く。
756:デフォルトの名無しさん
08/02/29 03:54:56
プログラミング初心者が集まる言語のスレなら
「ひょっとしてこの人、高級の意味を誤解してるのかな」
という想像が最初に来るところだけど、Lispスレだからな。一応「その心は?」と聞きたくなる。
757:デフォルトの名無しさん
08/02/29 04:36:48
まあ高次とか低レイヤーとか書いたほうが語弊は少なさそうだな
意味わかりにくくなるけど
758:デフォルトの名無しさん
08/02/29 09:18:13
機械語に対してほとんど全てのプログラミング言語は高級言語だけどね。
今低級・高級を再定義するなら、機械が直接対応しない概念(クロージャとか)を
扱えるものが高級言語、でどうだろう。
シンタクスによる区別だったのをセマンティクスによる区別で再定義というか。
759:デフォルトの名無しさん
08/02/29 09:35:06
実際のところ、CやC++のコンパイラは関数型言語で記述されてますか?
760:デフォルトの名無しさん
08/02/29 09:43:06
されてません
761:デフォルトの名無しさん
08/02/29 10:07:48
環境にアクセスできるクロージャへのポインタを渡すのはCでは無理だな
762:デフォルトの名無しさん
08/02/29 12:28:20
boost.lambda
ならあるぞ
763:デフォルトの名無しさん
08/02/29 12:40:47
c-wrapperのデモビデオがみれなくなってる
std::vectorとかポインターをcに渡すことはできるの?
764:デフォルトの名無しさん
08/02/29 12:48:11
>>760
何で記述されてますか?
765:デフォルトの名無しさん
08/02/29 12:50:28
「Cは昔、関数型言語って呼ばれてました。
値を返さない手続きがない(void以前)ので」ってオチ禁止
766:デフォルトの名無しさん
08/02/29 14:44:35
CコンパイラはCで書かれてることが多いんじゃないかな?
あまり関係ないけど
GCCはLispライクな中間コードにコンパイルしてから
CPUコードを出力するって聞いたことがあるけど
767:デフォルトの名無しさん
08/02/29 15:31:53
Little Schemerだけど Chapter 8から難しくなってきた。
--------------------------------------------------------
The Tenth Commandment
Build functions to collect more than one value at a time.
”一度に複数の値を集めるための関数を作れ!”
--------------------------------------------------------
これが言わんとする深い意味はなんですか?
直前のmultiremberEco関数の例で確かに二つのリストに振り分けてるのは
理解できるんだけど。(tunaに一致するもののリストと一致しないもののリスト)
条件に応じて、その条件を満足する値(アトムなど)あるいは満足しない値を集めろ!
って意味なのかな?
768:デフォルトの名無しさん
08/02/29 21:33:46
>>763
>c-wrapperのデモビデオがみれなくなってる
今確認してみましたが、こちらからは見れました(ホームページのやつですよね)。
>std::vectorとかポインターをcに渡すことはできるの?
ポインターの受け渡しはできますが、今のところ c-wrapper は C++ には
対応していないので、残念ながら std::vector は無理です。
769:デフォルトの名無しさん
08/02/29 22:25:51
>>767
俺もそこらへん読んでる。急に難しくなってきたね。
説明できないのでもうちょっとよく読んでみる…
770:デフォルトの名無しさん
08/03/01 00:44:35
> multiremberEco
multirember&co関数かと。
771:デフォルトの名無しさん
08/03/01 01:04:22
little schemer - multirember&co - reprise for dec 2006
URLリンク(groups.google.co.jp)
772:デフォルトの名無しさん
08/03/01 02:16:04
>>767
「at a time」でやることによって、
純関数型に特徴的なプログラミングスタイルが登場します。
昔birdが書いたコンパイラの純関数型ワン・パス・パーザや,
DanvyのTABA(There and Back Again)パターンや、
purely functional algorithmに出てくるようなコードなどでも
この章で使うようなテクニックが使われてます。
Little Schemeは非常に簡単な例でやっているので、
何が何だか分からない奇妙なパズルをやらされている気分になるかもしれませんが、
無意味なことはほとんどないので、著者を信じて頑張ってください。
まあバリバリ手続き型で書きたい人には苦行すぎる面もありますが。
773:デフォルトの名無しさん
08/03/01 12:01:59
>>770
&か。何の文字かわからなかった。
>>772
実用的なコードの源泉かあ。
今は習うより慣れろのレベルだけど、Schemerシリーズは全部やる。
単純な例でも脳の体操にもなるし。
774:デフォルトの名無しさん
08/03/01 21:26:31
URLリンク(www.amazon.com)
The Scheme Programming Language, 3rd Edition
これは評価が高いですが、やはり良書ですか?
CのK&R相当らしく、数日でたくさん学ぶ人もいるらしいですが
どうなんでしょう。
775:デフォルトの名無しさん
08/03/01 21:42:06
>>774
Second Edition と村上さんの邦訳をもっているけど、
3rdはかなり改訂されてるんかい?
776:デフォルトの名無しさん
08/03/01 21:49:40
URLリンク(www.scheme.com)
777:デフォルトの名無しさん
08/03/01 21:55:25
>>776
おお、公開されてるんだ。Dybvigさん、太っ腹。
778:デフォルトの名無しさん
08/03/01 21:59:06
Schemers.Incの「The Schemer's Guide」が好きだったなぁ。
初心者向けの良い本だと思う。
779:デフォルトの名無しさん
08/03/02 00:08:16
Little Schemer P146
にある以下のプログラムなんですが、
(define evens-only*&co
(lambda (l col)
(cond
((null? l) (col (quote ()) 1 0))
((atom? (car l))
(cond
((even? (car l)) (evens-only*&co (cdr l)
(lambda (newl P S)
(col (cons (car l) newl) (* (car l) P) S))))
(else (evens-only*&co (cdr l)
(lambda (newl P S)
(col newl P (+ (car l) S)))))))
(else
(evens-only*&co (car l) ; ここから以下がよく理解できない
(lambda (al ap as)
(evens-only*&co (cdr l)
(lambda (dl dp ds)
(col (cons al dl) (* ap dp) (+ as ds))))))))))
特に (col (cons al dl) (* ap dp) (+ as ds)) とする意味が分かりません。
こういうものはどういう思考で捉えていけば良いのでしょうか?
具体値で考えると確かに正しいことは分かるのですが、それを一般式で
表すのが難しくて思いつきません。
780:779
08/03/02 00:31:17
具体値を入れて考えたメモを見ていたら何となく見てきました。
(evens-only*&co (car l) ; ここから以下がよく理解できない
(lambda (al ap as)
(evens-only*&co (cdr l)
(lambda (dl dp ds)
(col (cons al dl) (* ap dp) (+ as ds))))))))))
(car l) と (cdr l) について再帰してそれぞれの結果を得る。
まず、(cdr l) に対して結果を得る。つまり、dl dp ds が具体値に
決まる。その後、その結果に対して、(car l) に対する再帰の結果
である al ap as を得て、(cdr l) に対する結果とマージする。
よく分からなかったのはlambda関数のパラメータでした。
自分としてのキーポイントは、
①lambda関数のパラメータが具体値に求まる。
②lambda関数のパラメータが具体値に求まる順番はネストの深い
ものから始まる。
という風に考えるとよいかなと思いました。
781:779
08/03/02 00:36:37
表現がおかしかったです。
(evens-only*&co (cdr l)
(lambda (dl dp ds)
(col (cons al dl) (* ap dp) (+ as ds)))
要は、まず上の部分の (cdr l) の再帰が先に終了し、そのパラメータであるdl dp ds
が具体値に求まる。その後で、具体値に求まったdl dp dsとともに
(evens-only*&co (car l) (lambda (al ap as) ・・・の (car l) の部分の再帰が行われる。
782:779
08/03/02 00:42:43
やはりパラメータが具体値に求まるというのはおかしいですね。
パラメータは変数なので。。
ただ具体的な値で追っていくと、例えば
(col (cons al (2 4)) (* ap 8) (+ as 4)))
みたいな感じで、dl dp ds 部分が決まっていくようです。
パラメータが具体値に求まるというのは、その程度の意味です。
783:デフォルトの名無しさん
08/03/02 01:58:27
>>779-782
; direct style
(define (fact n)
(if (= n 0) 1
(* n (fact (- n 1)))))
; accumulator style
(define (fact n) (factacc n 1))
(define (factacc n acc)
(if (= n 0) acc
(factacc (- n 1) (* n acc))))
; continuation passing style
(define (fact n) (factacc n (lambda () 1)))
(define (factacc n cc)
(if (= n 0) (cc)
(factacc (- n 1) (lambda () (* n (cc))))))
accumulator styleは演算子が可換、
あるいは逆から数え上げることが可能(e.g. (from n) ←→(to n))でないと困る。
例えばリストに対する演算の場合。consは可換でない。