Lisp Scheme Part22
..
655:デフォルトの名無しさん
08/06/17 01:55:27
>>654は>>653へ
656:デフォルトの名無しさん
08/06/17 03:20:29
>>636
でもこんなんなる
(car (scheme:list 1 2 3))
mcar: expects argument of type <mutable-pair>; given (1 2 3)
(scheme:car (list 1 2 3))
car: expects argument of type <pair>; given {1 2 3}
657:デフォルトの名無しさん
08/06/17 04:18:35
>>654
> なぜ馬鹿にされたのか、なぜ伝わらなかったのか
運悪くこのスレに馬鹿が集まっていたからですね。
658:デフォルトの名無しさん
08/06/17 11:12:40
運の悪い奴って何やっても駄目だよな〜
659:デフォルトの名無しさん
08/06/17 13:56:49
>>656
list と pair では型が違うと言ってるみたいだね。
660:デフォルトの名無しさん
08/06/17 14:12:29
(scheme:car ((scheme:list 1 2 3))
とか
(car (list 1 2 3))
なら動くんだろ?
661:デフォルトの名無しさん
08/06/17 15:33:58
ネタか・・・
662:639
08/06/17 17:55:27
具体的にはspvw_memfile.cの1196-1198行目(clisp-2.45の場合)に
READ(&old_fsubr_tab,sizeof(fsubr_tab));
READ(&old_pseudofun_tab,sizeof(pseudofun_tab));
READ(&symbol_tab,sizeof(symbol_tab));
というコードがあるのですが、
3つ目のREADマクロ中のread(2)が失敗し、
i386ならEFAULTが、armならEACCESがerrnoにセットされます。
ところが3つ目のREADマクロの前に
{
int i;
for ( i = 0 ; i < sizeof(symbol_tab) ; i += 4000 /* i386の場合。armの場合は3999 */ )
((char *) &symbol_tab)[ i ] = '!'; /* '!'という値には意味はありません */
}
というコードを挿入すればread(2)は失敗しません。
i386なら4001以上、armなら4000以上のiの増分ではread(2)が失敗します。
symbol_tabというのはマクロで、実体はsymbol_tab_dataを指していますが
old_fsubr_tabとold_pseudofun_tabはbssセクションに置かれているのに対し
symbol_tab_dataはdataセクションに置かれているという違いがあります。
663:デフォルトの名無しさん
08/06/17 18:07:22
>>657-658
運の悪い馬鹿は自己申告しなくて良し。
664:デフォルトの名無しさん
08/06/17 18:13:29
>>663
お前という馬鹿がここにいるのは>>657-658の運のせいではないですよ^^
665:デフォルトの名無しさん
08/06/17 18:23:09
>>664
常駐乙
666:デフォルトの名無しさん
08/06/17 18:46:40
運の悪い奴は何やっても駄目、という言葉を実感しつつあるw
667:デフォルトの名無しさん
08/06/17 19:11:46
適当な実感でものを判断する奴も全然駄目だけどねw
668:デフォルトの名無しさん
08/06/17 19:28:43
「情報があるなら教えて欲しい、それだけ」ならじっくり待ってろよ、まったく。
669:デフォルトの名無しさん
08/06/17 19:31:29
>>662
そこまで追ったのなら、馬鹿はほっといて、短い(CLISPに依存しない)再現プログラムを
作ってOpenBSDの人たちへ報告するのが良いと思う。
670:デフォルトの名無しさん
08/06/17 20:47:23
>>662
その情報、ちゃんとOpenBSDの中の人たちに連絡したら感謝されると思うよ。
671:デフォルトの名無しさん
08/06/17 23:31:58
>>656, >>660
ネタかと思ったけど、R6RSに慣れるまで大変ですねw
PLT Scheme 4.0 では、ペアはimmutable(変更不可)になりました。
mutable(変更可能)なペアは別のデータ型として提供されてるようです。
たぶん>>656, >>660で言ってることがそれだと思います。
手持ちのプログラムを食わせてみたら同様の文句を言われましたw
当面、372のままで行きます orz
672:デフォルトの名無しさん
08/06/17 23:40:50
ようわからんが、C→C++でconstの扱いが変わったような感じなのかな。
673:デフォルトの名無しさん
08/06/17 23:50:10
C++/CLIにポインタが2種類あるような感じだな
674:デフォルトの名無しさん
08/06/17 23:56:59
immutableなconsセルというと後藤英一氏のHLISPが元祖だろうな。
675:デフォルトの名無しさん
08/06/18 00:37:18
>>PLT Scheme 4.0 では、ペアはimmutable(変更不可)になりました。
これ、PLTのどっかに「どうなるかわかんないけど、取り合えずやってみるぽ」って感じの文章なかったっけ?
PLTさんお願いです、今回だけで止めてください m(_ _)m
676:デフォルトの名無しさん
08/06/18 01:47:56
immutableにして何か利点はあるんですかね?
GPU対応とかconcurrent対応ぐらいしか思いつかない。う〜む。
677:デフォルトの名無しさん
08/06/18 02:00:52
こうやって解決しないの?
(define cons mcons)
(define set-car! set-mcar!)
(define set-cdr! set-mcdr!)
678:デフォルトの名無しさん
08/06/18 02:15:13
Schemeはペアはimmutableでも良いんじゃないかなあ。
そんなに破壊的操作してるもんかね。
679:デフォルトの名無しさん
08/06/18 03:27:38
>>678
Streamを使えば破壊的操作を使うから多いと思う。
680:デフォルトの名無しさん
08/06/18 07:39:44
>> 677
(define cons mcons)
が
define-values: cannot change constant identifier: cons
な
エラーになります orz
681:デフォルトの名無しさん
08/06/18 08:02:56
>>680
マクロは?
682:デフォルトの名無しさん
08/06/18 08:21:59
DrSchemeはネタの巣窟ですね
MzSchemeなら問題ないです
683:デフォルトの名無しさん
08/06/18 10:03:53
>>675
これ?
URLリンク(blog.plt-scheme.org)
684:デフォルトの名無しさん
08/06/18 12:35:55
>>683
それだ!サンクス
で、結局やることになっちゃったんだな。4.0でこうなったってことは...
そりゃ自分で書いたコードなら直すのも簡単だけどね orz
685:デフォルトの名無しさん
08/06/18 14:26:10
set-car!: name is not defined, not a parameter, and not a primitive name
set-mcar!: name is not defined, not a parameter, and not a primitive name
使えない orz
686:デフォルトの名無しさん
08/06/18 15:29:02
>>681
これで一応動く(PrettyBigモードとか)。SICPの学習には不便しないだろう。
(ただしR6RSとは共存出来ない。)
(define-syntax cons
(syntax-rules ()
((_ a b) (mcons a b))))
(define-syntax set-car!
(syntax-rules ()
((_ a b) (set-mcar! a b))))
(define-syntax set-cdr!
(syntax-rules ()
((_ a b) (set-mcdr! a b))))
687:デフォルトの名無しさん
08/06/18 15:55:29
;こんな感じ。
;URLリンク(pre.plt-scheme.org)
(require scheme/mpair)
(define-syntax cons
(syntax-rules ()
((_ a b) (mcons a b))))
(define-syntax set-car!
(syntax-rules ()
((_ a b) (set-mcar! a b))))
(define-syntax set-cdr!
(syntax-rules ()
((_ a b) (set-mcdr! a b))))
(define-syntax list
(syntax-rules ()
((_ a ...) (mlist a ...))))
(define Qoo (list 3 4))
(set-car! Qoo '(5 6))
(set-cdr! Qoo '(7 8))
(display Qoo) ; => {(5 6) . (7 8)}
688:デフォルトの名無しさん
08/06/18 16:07:21
>>687
サンクス!
でも、こんどは
(map cons lst1 lst2)
が大破しました... "orz"
それなりの混乱が予想されるのにこうなったって事は何か良い見返りがあるはずだよね...
「隊長!comp.lang.schemeのアナウンスからPLT方面に潜入して偵察を試みてみます。自分が帰ってこないときは英語が解読できなくて玉砕したと思ってください orz」
689:デフォルトの名無しさん
08/06/18 16:10:45
(define Qoo (list ))
(mlist? Qoo) ; => #t
(display Qoo) ; => () なぜか{}にはならない。
690:デフォルトの名無しさん
08/06/18 16:13:11
>>688
URLリンク(pre.plt-scheme.org)
ココの関数はマクロで修正しないとダメポ。
mmapが orz
691:688
08/06/18 16:24:41
隊長!自分は現在683より報告のあったBLOGに到着しました。
驚くことにcomp.lang.schemeのアナウンスにはそれらしい情報は例のBLOGにしかありませんでした。
さらに驚くことにBLOGに対するコメントは好意的なものばかりのようです。
もしかして、自分はバカなのでしょうか "orz"
692:デフォルトの名無しさん
08/06/18 16:31:12
Schemeは「破壊的操作の時だけアホになります」って言ってるみたいだ…
cons
せぇっと!
car
りば〜すぅ!
せっとくだー!
eq?
みたいな。
693:デフォルトの名無しさん
08/06/18 16:33:42
(define-syntax map
(syntax-rules ()
((_ a b ...) (mmap a b ...))))
(map display (list 1 2 3 4 5)) ; => 12345{#<void> #<void> #<void> #<void> #<void>}
あれ?うまくいかない?
694:デフォルトの名無しさん
08/06/18 16:36:22
(define-syntax map
(syntax-rules ()
((_ a b ...) (mmap a b ...))))
(map (lambda (x)(* x x)) (list 1 2 3 4)) ; => {1 4 9 16}
大丈夫らしい。
695:デフォルトの名無しさん
08/06/18 16:39:33
正直、Schemeを名乗らないで別の名前を付けてくれと思った。
696:デフォルトの名無しさん
08/06/18 16:40:56
Scheme 2.0 って感じだなw
697:デフォルトの名無しさん
08/06/18 16:45:05
今後は従来のをScheme/NewJerseyとかダッサい呼び方するんだろうかw
698:デフォルトの名無しさん
08/06/18 16:49:23
隊長!
BLOGにはimmutableなpairでないと
(define l (list 1 2 3 4 5))
(map (lambda (x) (set-cdr! (cddr l) 5)) l)
が変になるって書いてあるから試してみました。
Gauche(R5RS)
(#<undef> #<undef> #<undef>)
たしかにちょっと変。
Petite Chez(R5RS)
(#<void> #<void> #<void> #<void> #<void>)
たしかにちょっと変。
Guile(R5RS)
(#<unspecified> #<unspecified> #<unspecified>)
たしかにちょっと変。
699:698
08/06/18 16:50:09
でもR6RSな処理系ではちゃんとエラーになっております。
Ikarus(R6RS)
Unhandled exception
Condition components:
1. &assertion
2. &who: map
3. &message: "list was altered"
Larceny(R6RS)
Error: car: 5 is not a pair.
Ypsilon(R6RS)
error in car: expected pair, but got 5
immutableなpairってやつはR6RSで必要になったから導入したわけじゃないのでしょうか?
自分はちょっと混乱しています "orz"
700:デフォルトの名無しさん
08/06/18 16:54:50
>>698
d。俺が馬鹿だったw
701:デフォルトの名無しさん
08/06/18 16:57:25
安全側に改良された感じだな。互換性無視については確信犯だろう。w
702:デフォルトの名無しさん
08/06/18 17:00:02
Immutive Schemeって評判いいの?
703:デフォルトの名無しさん
08/06/18 17:02:15
>>698>>699
それはmapの安全性の問題では?
704:デフォルトの名無しさん
08/06/18 17:05:25
>>698のGaucheは、
gosh> (map (lambda (x) x) '(1 2 3 . 5))
(1 2 3)
と整合。set-cdr!の結果が#<undef>
Guile 1.8.3は、
> standard input:1:1: In procedure map in expression (map (lambda # x) (quote #)):
> standard input:1:1: Wrong type argument in position 2: (1 2 3 . 5)
> ABORT: (wrong-type-arg)
でエラー。
705:デフォルトの名無しさん
08/06/18 17:10:32
immutable list相手なら、
(define (map f x)
(cond ((not (pair x)) (error "not pair"))
((null? x) ())
(#t (cons (f (car x)) (map f (cdr x))))))
の最初のチェックが不要になることが静的に分かるケースがあるわけですね。
706:デフォルトの名無しさん
08/06/18 17:13:16
(define-syntax car
(syntax-rules ()
((_ a) (mcar a))))
(define-syntax cdr
(syntax-rules ()
((_ a) (mcdr a))))
707:デフォルトの名無しさん
08/06/18 17:19:18
あまり抵抗せずに郷に入れば郷に従うのが良いのでは?
昔の教科書を一字一句変えずに動かしたいという理由が判らん。
708:デフォルトの名無しさん
08/06/18 17:40:54
(define-syntax pair?
(syntax-rules ()
((_ a ) (mpair? a ))))
709:デフォルトの名無しさん
08/06/18 17:48:02
お言葉ですが >>707 さん、自分がDrSchemeを使うのは「昔の教科書を一字一句変えずに動かしたい」からなのです><
バカと呼んでもらってかまいません...
やはりv372への「戦略的な撤退」でしょうか "orz"
710:デフォルトの名無しさん
08/06/18 17:58:15
目的に合った処理系を。
711:デフォルトの名無しさん
08/06/18 18:02:27
>>710
そうだよね。勉強が目的なのにそれ以外にエネルギー使うの無駄が多すぎる。
読み終わってから試行錯誤したほうがいいんじゃない?
712:デフォルトの名無しさん
08/06/18 18:31:53
R"5"RSの教科書的実装ならばScheme48がいいかも
近々R6RS準拠になる予定だし
713:デフォルトの名無しさん
08/06/18 18:32:07
immutableにした理由って、webアプリのインジェクション対策?
714:デフォルトの名無しさん
08/06/18 18:35:24
>>713
なわけないw
715:デフォルトの名無しさん
08/06/18 18:36:15
>>712
SICPはR5RSやR6RSってわけじゃないんだ。
DrScheme v372以前のPrettyBig modeが一番そのままで書けると思う。
他の処理系だとbegin使えとか言われる表記が満載>SICP
716:デフォルトの名無しさん
08/06/18 18:37:16
新しいDrSchemeってドキュメントにThreadの項目が増えたの?
717:デフォルトの名無しさん
08/06/18 18:38:07
>>710 >>711 >>712 >>715
みなさんご親切にありがとうございます m(_ _)m
どうやら「メジャーバージョンアップ!」しかも「R6RSに触れられる!」とあって舞い上がってしまったようです...
でも、今の自分はDrSchemeのマクロステッパーなしでは生きられません "orz"
耐え難きを耐え、しばらくの間4.0は封印しておきます><
718:デフォルトの名無しさん
08/06/18 18:38:18
SICPならMIT-Schemeを使うとか
最近のMITはMzSchemeらしいけど
719:デフォルトの名無しさん
08/06/18 18:42:44
>>718
つまりDrSchemeのMzSchemeモードと中身は同じ。
720:デフォルトの名無しさん
08/06/18 18:43:01
>>718
ありがとうございます。MIT-Scheme使ってみたいんですが...
以前試した時はバイナリーが動かなくて、ビルドもできなくてあきらめてました (orz)
カーネルも新しくなったからもう一回挑戦してみようかと思います><b
721:デフォルトの名無しさん
08/06/18 20:15:24
最近のMITのSchemeはPythonじゃないの?
722:デフォルトの名無しさん
08/06/18 20:46:58
最近のMITのSchemeがPythonだとは初耳だw
723:デフォルトの名無しさん
08/06/18 23:37:58
Scheme初心者の俺が通りますよ
質問なんだけど、トップレベルってなんか特別なの?
(define cc #f)
;A
(display (call/cc (lambda (c) (set! cc c) (cc 'hoge))))
(display 'fuga)
(cc 'moga)
;B
(begin
(display (call/cc (lambda (c) (set! cc c) (cc 'hoge))))
(display 'fuga)
(cc 'moga)
)
トップレベルでこーやったとき、Aが無限ループにならないのにBが無限ループになるのが理解できないの...
724:デフォルトの名無しさん
08/06/18 23:45:37
>>723
継続はトップレベルをまたげない処理系が多い。(実装依存)
そういう意味ではトップレベルは特別。
725:デフォルトの名無しさん
08/06/18 23:50:50
>>724
そーなのかーありがとー
実装依存か 処理系もかかないかんかったね がうちぇです もう一度いいます がうちぇです
726:デフォルトの名無しさん
08/06/18 23:51:51
あれてきたときにスルーするをCommon Lispでどうかくのか?
(progn
(loop for i in '(>>657 >>658 >>663 >>664 >>665 >>666 >>667 >>668) do
(unintern i))
(gc)
'Done)
727:デフォルトの名無しさん
08/06/19 00:13:30
>がうちぇ
セロ弾きの「ごーしゅ」じゃなかった?
728:デフォルトの名無しさん
08/06/19 00:19:17
ガウチェ(・∀・)
の方がなんとなく小気味良い気がして
729:デフォルトの名無しさん
08/06/19 00:19:59
がうちぇのがしっくりくるのは間違いない
730:デフォルトの名無しさん
08/06/19 00:25:26
がうちぇの方が美味しそう
731:デフォルトの名無しさん
08/06/19 00:28:04
ガウチェ(・∀・)
のほうがかわいいことは確か。
732:デフォルトの名無しさん
08/06/19 00:40:36
>>723-725
DScheme v372 では両方ともhogefugamogaが返ってきた。一応、報告のみ。
理由は説明できないw
733:デフォルトの名無しさん
08/06/19 00:50:00
>>724
R6RSでは明確に決まってなかったっけ?
734:723
08/06/19 02:12:50
>>732
両方無限ループならわかるけど無限ループらないのはわからないwwww
アリガト!
735:デフォルトの名無しさん
08/06/19 09:55:33
プログラムのトップレベルでの(begin <表現形式1> ...)は、beginのボディを形成する連続する式、定義、構文定義に等しい。(R5RS 5.1)
(display (call/cc (lambda (c) (set! cc c) (cc 'hoge))))
(display 'fuga)
(cc 'moga)
においてcall/ccが返し、ccに記憶される継続は
(lambda (x)
(print (display x))
(loop (print (eval (read) (interactive-environment)))))
と看做せるから無限ループに陥らない。
他方、
(let ()
(display (call/cc (lmabda (c) (set! cc c) (cc 'hoge))))
(display 'fuga)
(cc 'moga))
においてcall/ccが返し、ccに記憶される継続は
(lambda (x)
(display x)
(display 'fuga)
(cc 'moga))
と看做せるから無限ループに陥る。
(ccの末尾再帰呼出し)
beginをR5RS巻末のように合成構文として実装すると後者になるが
原始構文として規格通りに実装すると前者となる。
736:デフォルトの名無しさん
08/06/19 10:47:48
>>735
ありがとう。
つまりbegin構文を、Gaucheは合成構文として実装してるけど、
DrSchemeは原始構文として実装してるということみたいですね。
737:デフォルトの名無しさん
08/06/19 13:21:59
>>735-736
質問です。原始構文として実装してるということは、ifやletのような特殊形式ということなんでしょうか。
初心者なので特殊形式を知ったばかりですが、SICPにnew-ifという例があったのと似てると思いました。
738:デフォルトの名無しさん
08/06/19 14:26:32
>>735>>736
R5RSの「原始構文」って何よ?
739:デフォルトの名無しさん
08/06/19 14:37:01
Schemeのプリミティヴ構文はif、quote、lambda、define、set!であり、
letやcondなどは導出構文という事になってます。
(但しbeginやdefine-syntax、let-syntaxはマクロでは導出できない)
Common Lispでは特殊形式とマクロという区別がありましたが
Schemeでは両方構文として扱われます。
どうもbeginはトップレベルでは「beginがない式と同等に扱われる」のは表面上であり、継続は
(lambda (x)
(begin (display x)
(display 'fuga)
(cc 'moga)))) ;; beginは冗長
として扱う処理系が多いようですね。
原始構文という言葉はプリミティブ式のうち構文であるものを指すつもりで使いました。
740:723
08/06/19 22:01:45
>>735
ふおおなんか説明してくれてありがとうなんだけど何言ってるかわっかんねw
>beginのボディを形成する連続する式、定義、構文定義に等しい。
って、つまりbeginで囲ってないのと同じ意味になるぜよってこと?
741:デフォルトの名無しさん
08/06/19 22:09:48
>>740
つまりR5RSの定義ではbeginのトップレベルにおいてDrSchemeのような挙動が期待されてる。
Gaucheを含めた他の処理系の挙動はR5RSとしてはおかしい。R6RS対応だからというわけでもないし。
これは>>724で言ってた処理系の実装依存の問題というより、うまく実装できていない処理系が多いということだと思う。
742:デフォルトの名無しさん
08/06/19 22:15:45
それがR5RSの仕様に反する事をしないScheme48でも無限ループになるんですよ。
トップレベルのbeginはローカルスコープを作りませんよ〜くらいの意味にも取れますから
無限ループになってもR5RSに反するとは言い切れませんね。
R5RSは細かく呼んでいくと解釈の分かれる部分が多々ありますし。
743:デフォルトの名無しさん
08/06/19 22:17:17
typo
呼んでいく→読んでいく
744:デフォルトの名無しさん
08/06/19 22:20:12
Scheme48でも無限ループになるからR5RSではトップレベルのbeginで無限ループを作ることが仕様に盛り込まれてると?
Gaucheのバグだと思うなぁ
745:デフォルトの名無しさん
08/06/19 22:31:28
いや、R5RSを読む限りでは無限ループになるのもそうでないのも
どちらも規格に反しない、という事だと思います。
746:デフォルトの名無しさん
08/06/19 22:44:07
初心者の俺様からすれば無限ループになってくれたほうが理解しやすくて幸せだぞ
747:デフォルトの名無しさん
08/06/19 22:49:58
仕様というのは、それに従って作ればバグが無いものが作れるとは限らない。
だけど、バグが無いものを作るべきだと思うよ。
748:デフォルトの名無しさん
08/06/20 03:08:58
Schemeってどやってshort codingするの?
CならハッカーのたのしみやShort Coding等の本があるのに情報不足でしょ?
749:デフォルトの名無しさん
08/06/20 03:39:10
どうしてshort codingしたいの?
750:デフォルトの名無しさん
08/06/20 07:10:41
ChickenってWindowsBinaryのヤツ使えばexe吐けるの?
とりあえずインスコしてやってみてもうまく出来ないし公式サイトにもWindowsでexe作る方法書いてないっぽいし困ってしまったよ!
教えて!エロい人!
751:デフォルトの名無しさん
08/06/20 09:20:26
クイックソートをcps変換したときappendってタイプするのがめんどくなって
(define ++ append)
ってしたけどこれはshort codingに入りますか
752:デフォルトの名無しさん
08/06/20 09:38:42
大きなletrecの下で
753:デフォルトの名無しさん
08/06/20 11:40:49
exeなんて飾りです。エロい人にはそれがわからんのですよ。
mingwとmsysをまずインストールしましょう。
そしてchickenのwindows用binaryをCドライブ直下に解凍しましょう。
msys.batを起動しましょう。
export PATH=/c/chicken/bin:$PATHと打ち込んでPATHを設定しましょう。
作られる実行ファイルはlibchicken.dll等に依存するのでPATHを設定しないと起動しません。
vi foo.scmと打ち込んでSchemeソースを作成しましょう。
csc foo.scmと打ち込んでコンパイルしましょう。
./foo.exeと打ち込んで実行しましょう。
URLリンク(www.mingw.org)
URLリンク(nchc.dl.sourceforge.net)
URLリンク(nchc.dl.sourceforge.net)
754:デフォルトの名無しさん
08/06/20 12:43:26
>>739
> 原始構文という言葉はプリミティブ式のうち構文であるものを指すつもりで使いました。
かなり細部に渡る話をしているので、言葉は厳密に使った方がいいと思います。
特に今ではR6RSがあるので、何を指していっているのか分からなくなります。
R6RSには"primitive syntax"(9)というのがあって、
> Schemeのプリミティヴ構文はif、quote、lambda、define、set!であり、
とは違うものです。R5RSには"primitive syntax"という用語は出てきません。
またこれら(if, quote, ...)を使ったformは、R6RSの"primitive syntax"(9)の一部である
primitive expression types(9.1)にも含まれません。
R5RSでは含まれていた(4.1)のですけれど。
755:デフォルトの名無しさん
08/06/20 13:14:41
(原始式のうち構文キーワードで始まるリスト)と定義、ならよろしいか?
756:デフォルトの名無しさん
08/06/20 13:33:57
追加:R5RSにおける
757:デフォルトの名無しさん
08/06/20 13:34:34
R5RSでは内部表現を「リスト」と限定していません。
また意味論もリスト上で定義されていません。
758:デフォルトの名無しさん
08/06/20 13:37:42
そういう根源的なところで Scheme って本質的に Lisp ではないんだよな
(茶々すまん)
759:デフォルトの名無しさん
08/06/20 13:45:19
少なくとも形式的構文上はリストとして定義されてませんか?(R5RS 7.1)
意味論上はともかく。
760:デフォルトの名無しさん
08/06/20 13:51:32
解釈改憲より新しく書き直したほうが建設的だと思うけどな
実装を書き直す人は腐るほどいるが
761:デフォルトの名無しさん
08/06/20 14:02:24
>>759
仕様もR6RSでやったところ。
762:デフォルトの名無しさん
08/06/20 14:02:46
間違えた>>760へのレス
763:デフォルトの名無しさん
08/06/20 16:11:45
>>759
(f a b)が(f . (a b))と同じとは文法には書いてない。
印字表現が似ているだけなのでは?
そもそも「構文上リストとして定義」とはどういう意味なのでしょうか?
764:デフォルトの名無しさん
08/06/20 16:21:32
<lambda expression> --> (lambda <formals> <body>)
<quotation> --> '<datum> | (quote <datum>)
<assignment> --> (set! <variable> <expression>)
<conditional> --> (if <test> <consequent> <alternate>)
<definition> --> (define <variable> <expression>)
| (define (<variable> <def formals>) <body>)
| (begin <definition>*)
765:デフォルトの名無しさん
08/06/20 16:23:38
ただし意味論上の<list>と同一ではない
766:デフォルトの名無しさん
08/06/20 16:36:42
>>741
んなことない。トップレベルでの継続がどこまでの範囲を補足するかの
規定がR5RSには無いんだから、どっちの解釈もあり。
Gauche系の解釈でもトップレベルbeginをletに展開しているわけじゃない
(letに展開したらdefineがうまくいかない)。
コンパイルと実行の単位の問題で、継続の捕捉範囲が変わってるだけ。
767:デフォルトの名無しさん
08/06/20 16:59:38
生存期間が書かれてなければ、無限生存期間なのではないでしょうか。
コンスセルがそうであるように。
768:デフォルトの名無しさん
08/06/20 17:15:07
>>764
これは「構文上リストとして定義」ではないです。
これが「構文上リストとして定義」なら、
他の言語に良くある<式> --> ( <式> ) までそうなってしまいます。
そもそも「構文上リストとして定義」という概念はないと思います。
リストには、シグネチャや意味が付いてまわりますから。
769:デフォルトの名無しさん
08/06/20 17:18:32
>>723
> ;A
> (display (call/cc (lambda (c) (set! cc c) (cc 'hoge))))
> (display 'fuga)
> (cc 'moga)
(call/cc (lambda (c) (set! cc c) (cc 'hoge)))
(display 'fuga)
(cc 'moga)
だとどうでしょう?
770:デフォルトの名無しさん
08/06/20 17:28:28
<list> --> (<datum>*) | (<datum>+ . <datum>)
| <abbreviation>
<datum> --> <simple datum> | <compound datum>
<simple datum> --> <boolean> | <number>
| <character> | <string> | <symbol>
<symbol> --> <identifier>
<identifier> --> <initial> <subsequent>*
| <peculiar identifier>
<initial> --> <letter> | <special initial>
<letter> --> a | b | c | ... | z
<special initial> --> ! | $ | % | & | * | / | : | < | =
| > | ? | ^ | _ | ~
<subsequent> --> <initial> | <digit>
| <special subsequent>
<digit> --> 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
<special subsequent> --> + | - | . | @
<peculiar identifier> --> + | - | ...
と辿れば一応リスト。(構文キーワードも識別子だから)
他の言語に良くある<式> --> ( <式> ) はSchemeには存在しない。
うーん、苦しいw
771:デフォルトの名無しさん
08/06/20 18:39:07
aclって今でもアホみたいに高いの?
USでは$599 (アカデミックユーザ)からとはかかれてたが。
772:デフォルトの名無しさん
08/06/20 22:06:43
レス遅くてサーセン
>>753
指定されたパスが見つかりません。(←MSYS.bat上だと文字化けしてる
*** Shell command terminated with exit status 1: /chicken/bin/chicken test.scm -output-file test.c -quiet
って言われてしまうお…
やった
OS WinVista Ultimate
MinGW 5.1.4は元から入れてあった
MSYS 1.0.10インスコ(インスコ途中にMinGWの場所指定しろって言われたからした
PATHをchicken/binな場所に通した
msys.bat実行した csc test.scm とかしてみたら上記エラー
/(MSYSインスコ場所直下)にchickenフォルダ移してみたりとかもやってみたけどダメだったぜ…
よくわかんねーけど
URLリンク(alohakun.blog7.fc2.com)
とかみるとoファイルが吐かれるらしいけど、何もファイル吐かれてない… .cも吐かれてない
ボスケテ
773:デフォルトの名無しさん
08/06/20 23:06:26
>>772
パス指定がどっかで決め打ちになってる予感。
774:デフォルトの名無しさん
08/06/20 23:23:54
>>772
c:\chicken\bin>csc -dynamic test.scm
ってやってみるとgccがないって怒られるけど、.cファイルは作られる。
おそらくオプション指定の問題。
775:デフォルトの名無しさん
08/06/21 00:18:40
csiは起動しますか?
776:デフォルトの名無しさん
08/06/21 00:20:48
自分の環境でビルドすると.scmから.exeファイルが作られるだけで.cも.oも残りませんね
777:デフォルトの名無しさん
08/06/21 00:25:43
結局gccが必要なのか。
778:デフォルトの名無しさん
08/06/21 00:31:58
どうもいろいろ試してみた所772のエラーメッセージは
chickenディレクトリがc:\にない場合に出る模様。
c:\chickenになってますか?
779:デフォルトの名無しさん
08/06/21 09:50:28
>>774
コマンドプロンプトからそれやってみると同じエラーが出る罠
>>775
今やってみたらコマンドプロンプトだと出来るけどMSYSでやってみたら起動しなかった
エラーもなんも表示されない不思議な状態になった もちろん何か入力してもなんもなし
>>778
d:\Scheme\chicken\binに置いていてお PATHの設定でそっち指定してたけど
chickenをC直下において
>>753の通りにパス設定したらエラーが変わったお
'gcc' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。
*** Shell command terminated with exit status 1: gcc test.c -o test.o -c -fno-strict-aliasing -DHAVE_CHICKEN_CONFIG_H -Os -I /chicken/include
で、とりあえずcファイルはできた
で、エラーに従って
export PATH=/c/MinGW/bin:$PATH とかしてみたら
Info: resolvingうんたら〜ってメッセージが5個くらい出たけどtest.exeが出来ました!
ついでにobjdump -p test.exeしてみたら
DLL Name: libchicken.dll
DLL Name: KERNEL32.dll
DLL Name: msvcrt.dll
だってさ MinGW周りのDLLはいらないっぽいのが不思議だ…
というわけでした!みんなありがと!愛してるぜ!
780:デフォルトの名無しさん
08/06/21 15:25:18
>>779
MinGWって、C++のスレッド関係で独自ランタイム必要とするだけで、
CならMSのCランタイムだけで大丈夫じゃなかったっけ?
781:デフォルトの名無しさん
08/06/22 00:05:58
>>200番台でやってた継続の例をwikipediaでみつけた。
URLリンク(en.wikipedia.org)
>>268-271と似てる〜
782:デフォルトの名無しさん
08/06/22 02:46:40
>>767 は >>766 へのレス?
生存期間の話じゃないよ。継続の「底」をどこに取るかって話。
R5RSのトップレベルの実行はREPLの実行と区別されていない。全ての
トップレベルフォームが見えてる状態で一気に実行するところを
継続の起点と見るか、REPLにおいてトップレベルフォームひとつひとつ
を実行するところを継続の起点と見るか、って違い。
R6RSではREPLそのものが無くなって、トップレベルの意味は明確化された。
783:デフォルトの名無しさん
08/06/22 09:31:57
REPLって何?
784:デフォルトの名無しさん
08/06/22 09:39:13
Random Electrical Pulse Light
785:デフォルトの名無しさん
08/06/22 10:04:02
reed eeval print lup
786:デフォルトの名無しさん
08/06/22 10:08:03
呪文:よんでひょうかしていんさつしてくりかえす
787:デフォルトの名無しさん
08/06/22 11:12:56
ググれ
788:デフォルトの名無しさん
08/06/22 12:45:05
話は変わるけど、Gaucheboxに入ってるGaucheってmingwバイナリパッケージのより新しい?
pegとかも入ってるんだけど…。
789:デフォルトの名無しさん
08/06/22 15:26:09
; >>783
;The Read-Eval-Print Loop
(define (driver-loop)
(begin
(let ((input (read))) ; read
(let ((output (eval input))) ; eval
(display output))) ; print
(driver-loop))) ; loop
790:デフォルトの名無しさん
08/06/22 15:45:57
>>788
URLリンク(practical-scheme.net)
基本的にGaucheのCVS HEAD(今はSubversion trunk)をビルドするので、
その時点の最新版が入る。リリース版の0.8.13より新しい。
791:デフォルトの名無しさん
08/06/22 15:51:15
(define (eval x)
x)
(define (driver-loop)
(begin
(let ((input (read)))
(let ((output (eval input)))
(display output)(newline)))
(driver-loop)))
(driver-loop)
792:デフォルトの名無しさん
08/06/22 16:23:43
>>791
Lispではよくあることだが、式と値を混同しているね
793:デフォルトの名無しさん
08/06/22 21:53:32
>>792
それではevalのお手本をどうぞ。
794:デフォルトの名無しさん
08/06/22 22:01:24
>>791
> (define (eval x)
> x)
これマジレスなのw
795:デフォルトの名無しさん
08/06/22 22:08:34
S式を 評価するのに 値呼び
796:デフォルトの名無しさん
08/06/22 22:14:49
評価頼られてるのに、自分はとんずらして、他に丸投げかよ。
797:デフォルトの名無しさん
08/06/22 22:25:15
あと、継続渡しと称して (lambda (x) x) を渡すこともあるね
798:デフォルトの名無しさん
08/06/22 22:49:16
普通にこれで動く。
(define (driver-loop)
(begin
(let ((input (read)))
(let ((output (eval input)))
(display output)(newline)))
(driver-loop)))
(driver-loop)
でもevalのお手本、観てみたいな。
799:デフォルトの名無しさん
08/06/22 22:51:28
∩___∩ |
| ノ\ ヽ |
/ ●゛ ● | |
| ∪ ( _●_) ミ j
彡、 |∪| | J
/ ∩ノ ⊃ ヽ
( \ / _ノ | |
.\ “ /__| |
\ /___ /
800:デフォルトの名無しさん
08/06/22 22:59:06
批判してる奴ってなんでそんなにエバルんだろう?
801:デフォルトの名無しさん
08/06/22 23:04:05
>>797
それ
(define (eval x)
(lambda (x) x))
という意味?
(+ 2 2)
=>
#<procedure>
になると思うよ。ちょっとマズイ気がする。
802:デフォルトの名無しさん
08/06/22 23:32:42
修辞疑問のお手本ですか
803:デフォルトの名無しさん
08/06/23 01:01:45
Lisp Scheme FAQ
「修辞疑問文」
要点を強調するために発せられる修辞疑問文では、答は期待されていない。
多くの場合、答は疑問文自体に含まれるか明白だからである。
前提的疑問文は、答えうるものが何であれ、その人が断定しようと望んでいること以上の情報を含んでしまうだろうから、
ジョークとして用いられたり、相手を困らせるために用いられたりする場合がある。
例)
批判してる奴ってなんでそんなにエバルんだろう?
修辞疑問のお手本ですか
804:デフォルトの名無しさん
08/06/23 01:03:20
なるほど「修辞疑問のお手本ですか」は修辞疑問文の再帰的な定義になっているわけだ。w
805:デフォルトの名無しさん
08/06/23 06:53:39
つ「修辞疑問って答えを期待してないんじゃないんですか?」
806:デフォルトの名無しさん
08/06/23 06:57:39
>>803
この例の会話ヘンだよ。
>例)
>批判してる奴ってなんでそんなにエバルんだろう? <=答えを期待してない
>修辞疑問のお手本ですか <=なぜか答えてるw
807:デフォルトの名無しさん
08/06/23 13:54:34
期待してないものが思いがけず手に入ることだってあるんですよ
808:デフォルトの名無しさん
08/06/23 15:39:59
修辞疑問の意味もわかってないのに使うからだよw
みっともないなぁ。
809:デフォルトの名無しさん
08/06/23 17:57:26
これは勝利宣言っぽいな。或いは単に言葉が足りない。
810:デフォルトの名無しさん
08/06/23 20:23:03
>>790
WiLiKiはだいたい見てるつもりだったけど気づいてなかった。
peg使ってみたかったけどコンパイルめんどいからリリース待ちだったので、
不意に動くバイナリが手に入って嬉しい。
ところでGaucheはもう完全にSubversionに移行してんの?
811:デフォルトの名無しさん
08/06/23 20:44:01
言葉遊びなんかどうでもいいんだよ。
evalのお手本、誰か書いてよ。簡単そうに言ったんだら。
マジ、期待したのに。
812:デフォルトの名無しさん
08/06/23 21:30:25
evlis[m;a] = maplist[m; \[[j];eval[car[j];a]]]
813:デフォルトの名無しさん
08/06/23 21:31:12
evcon[c;a] = [null[c]->error[A3];
eval[caar[c];a]->eval[cadar[a];a];
T->evcon[cdr[c];a]]
814:デフォルトの名無しさん
08/06/23 21:32:21
apply[fn;args;a]=[
null[fn]->NIL;
atom[fn]->[get[fn;EXPR]->apply[expr;args;a];
815:デフォルトの名無しさん
08/06/23 21:34:46
M式とはまた古風だな
816:デフォルトの名無しさん
08/06/23 21:41:34
evalくらいでエバらないでよね!
817:デフォルトの名無しさん
08/06/23 21:45:59
LISP 1.5 の論文の丸写しだなw
818:デフォルトの名無しさん
08/06/23 21:55:40
SchemeはS式で意味論が定義されていないのでLispではない、という話があったけど
S式とM式を使うLispはLispではないの?
819:デフォルトの名無しさん
08/06/23 21:59:15
M式→S式は機械的に変換可能。単に表記の問題。
820:デフォルトの名無しさん
08/06/23 22:00:20
LISP 1.5 Programmer's manual の eval の定義は確か ] が一つ
足りないんだよね。丸写しするとアウトかな?
821:デフォルトの名無しさん
08/06/23 22:03:03
LISP 1.5 はM式で入力できるわけじゃないしね
822:デフォルトの名無しさん
08/06/23 22:08:30
>SchemeはS式で意味論が定義されていないのでLispではない、という話があったけど
すごい燃料を投下する奴もいたもんだ(w
どうなったのかな?
823:デフォルトの名無しさん
08/06/23 22:15:38
>>812-814
Schemeに翻訳キボンヌ
824:デフォルトの名無しさん
08/06/23 22:46:27
もったいぶった前口上はいいからw
825:デフォルトの名無しさん
08/06/24 07:52:08
>>822
古い話だよ。R6RSで解決。
826:822
08/06/24 08:00:17
>>825
サンクス!
やっぱりR6RS読んでみるか・・・
でもこれ、俺には大仕事なんだよな〜 orz
827:デフォルトの名無しさん
08/06/24 10:08:52
つ「はてなようせい 意味論」でググれ
828:デフォルトの名無しさん
08/06/24 12:00:23
>>818
「S式で」どころか「意味が定義されてない」Lispが多い。
だから「S式で意味が定義されてない」とLispでないなら、
多くのLispはLispではない。
829:デフォルトの名無しさん
08/06/24 12:06:20
形式的定義だけが定義じゃないけどな
830:デフォルトの名無しさん
08/06/24 16:23:55
自分の手でSchemeを使ってevalが書けないのが明白になりつつあるなw
831:デフォルトの名無しさん
08/06/24 17:39:15
Schemeを使ってevalを書くのは容易
だけどどの程度ホスト処理系の機能を使う事が要求されているんですか?
特別式は使っていいんですか?
(define (my-eval e env)
(cond ((self-evaluate? e) e)
((symbol? e)
(let ((x (assq e env)))
(if x
(car x)
'UNBOUND)))
((and (pair? e)
(eq? (car e) 'if)
(pair? (cdr e))
(pair? (cddr e))
(pair? (cdddr e))
(null? (cddddr e)))
(if (my-eval (cadr e) env)
(my-eval (caddr e) env)
(my-eval (cadddr e) env)))
... ))
みたいな程度でいいんですか?
832:デフォルトの名無しさん
08/06/24 17:39:50
typo
(car x) -> (cdr x)
833:デフォルトの名無しさん
08/06/24 18:56:51
>>831
もともと>>782の説明に使うevalが求められていたから、その違いを表面化させることが出来るならホスト処理系の機能を使う事が許されていると思う。
834:デフォルトの名無しさん
08/06/25 00:38:52
機種依存無しで違いを表面化させて再現するevalを書くの大変そうだ。
>>831
期待してるよ。
835:デフォルトの名無しさん
08/06/25 00:46:25
簡単だろ。
というかSICPの課題させようとしてるだろ?
大学の宿題か?
836:デフォルトの名無しさん
08/06/25 00:52:07
>>835
話しそらすの上手だね。
>>723から始まったbeginのトップレベルの継続の違いを再現してみせる2種類のevalが本題。
別に宿題とか云う次元の話じゃない。逃げたきゃ逃げれば?どうせ匿名だし。
837:デフォルトの名無しさん
08/06/25 00:54:57
どうせ匿名なんだから構わなきゃいいのにw
838:デフォルトの名無しさん
08/06/25 02:29:22
>>835はいい奴だと思う。
M式書き写してLISP 1.5のウンチクたれてる誰かさんより。
839:デフォルトの名無しさん
08/06/25 03:21:49
いい奴だが不要だ
840:デフォルトの名無しさん
08/06/25 04:35:41
>>836-837
結局、処理系のソースでも読んで君自身で作るしかないだろうな。
違いを再現するためにevalを作れという事は、
つまり「継続を含んだeval」が必要で、
そのevalと同位の継続もファーストクラスとして必要になる。
そうでないと組み込みbeginと構文唐beginの違いは多分理解できない。
ここの住人は冷めてるから、いくら喚き散らしても
そこまで面倒な事をこの流れでやるわけがない。
ちなみに継続はSICPの範囲外だ。
がんばれ。
841:デフォルトの名無しさん
08/06/25 05:53:13
しょうがねえなあ、ちょっと書いてやるから後は考えろ。
(define (eval exp env cont)
(cond ((number exp?) (cont exp))
((symbol? exp) (eval-var exp env cont))
// ry
(else (eval-list exp env (lambda (l) (apply (car l) (cdr l) cont))))))
842:デフォルトの名無しさん
08/06/25 06:04:33
on lispに
843:デフォルトの名無しさん
08/06/25 07:44:15
R5RSの解釈の問題なら、仕様書を読まずに解決することはあり得ないですね
844:デフォルトの名無しさん
08/06/25 08:41:26
(begin
(define cc #f)
(display (call/cc (lambda (c) (set! cc c) (cc 'hoge))))
(display 'fuga)
(cc 'moga))
が無限ループにならない実装はtop-levelのbeginだけ特別にスプライスして
(eval '(define cc #f) (interaction-environment))
(eval '(display (call/cc (lambda (c) (set! cc c) (cc 'hoge)))) (interaction-environment))
(eval '(display 'fuga) (interaction-environment))
(eval '(cc 'moga) (interaction-environment))
とやっているからで、これはevalの実装というよりマクロの展開方法の違いと言える。
ちなみにR5RSは一塊でevalしてもスプライスしてevalしてもどっちでもよかったと思うけど。
845:デフォルトの名無しさん
08/06/25 14:34:35
>とやっているからで、これはevalの実装というよりマクロの展開方法の違いと言える。
>ちなみにR5RSは一塊でevalしてもスプライスしてevalしてもどっちでもよかったと思うけど。
これDrSchemeとか他の処理系を確認して書いた?
846:デフォルトの名無しさん
08/06/25 14:38:39
>というかSICPの課題させようとしてるだろ?
>ちなみに継続はSICPの範囲外だ。
Seasoned Schemerには継続が出てくる。
847:デフォルトの名無しさん
08/06/25 15:09:03
R5RSの5.1節を
「beginで囲んでも囲まなくても意味が変わらない」
と解釈するならスプライスするべきです。
意味が変わるというなら、どう変わるのか明確にするべきです。
848:デフォルトの名無しさん
08/06/25 15:22:20
>>845
「処理系確認する」ってやり方で判定すると、
「どっちでもいい」個所がどんどん増えるだけだと思うが?
849:デフォルトの名無しさん
08/06/25 16:10:38
>>847
のように考えた人が作ったのでDrSchemeはあのように動作しているらしい。
それはここを見れば解るよ。
URLリンク(www.cs.brown.edu)
明確な根拠が書かれていれば嬉しかったのだが・・・残念
850:デフォルトの名無しさん
08/06/25 16:27:08
>>848
かなり上のほうでGaucheとDrSchemeを比較してたから。
確認して書いてるなら話がつながるだろ?
851:デフォルトの名無しさん
08/06/25 16:42:05
>>847
> R5RSの5.1節を
At the top level of a program (begin <form[1]> ...) is equivalent to
the sequence of expressions, definitions, and syntax definitions
that form the body of the begin.
852:デフォルトの名無しさん
08/06/25 17:27:47
>>851
>is equivalent to
この文をどう解釈するか。
ひとつめは
>「beginで囲んでも囲まなくても意味が変わらない」
という立場だ。
もうひとつは
>意味が変わるというなら、どう変わるのか明確にするべきです。
という立場だ。Gaucheの挙動はこっちだった。
ここまでの流れ:
Gaucheの挙動ってエラーじゃねえの?=>エラーじゃねえよ!=>ならeval書いて説明してみろよ=>evalなんて簡単。=>さっさと書け、ゴラァ!
=>ほら書いてやったぞ=>それじゃ意味が明確になってねえぞ、ゴラァ!(今このへん)
853:デフォルトの名無しさん
08/06/25 17:33:04
>>852
> ならeval書いて説明してみろよ
この馬鹿発言は無視すべき
854:デフォルトの名無しさん
08/06/25 18:39:07
eval書いて説明するような話じゃないよな
次ページ最新レス表示スレッドの検索類似スレ一覧話題のニュースおまかせリスト▼オプションを表示暇つぶし2ch
4738日前に更新/247 KB
担当:undef