Lisp Scheme Part22 ..
[2ch|▼Menu]
596:デフォルトの名無しさん
08/06/15 02:13:54
いわゆるメソッドと違って、総称関数は特定のクラスの所有物じゃないからねえ。
とりあえず、その辺を管理する(指定する)仕掛けがいるわなあ。

597:デフォルトの名無しさん
08/06/15 02:14:38
真面目な長文かけるならこんなゴミ溜めじゃなくてWilikiにでもかきなよ


598:デフォルトの名無しさん
08/06/15 02:18:57
>>595
アクセスコントロールはないです。

599:デフォルトの名無しさん
08/06/15 03:10:07
整備兵 『80%?冗談じゃありません!現状でジオングの性能は100%出せます!!』
シャア  『脚は着いていない』
整備兵 『あんなの飾りです。偉い人にはそれが分からんのですよ!』

600:デフォルトの名無しさん
08/06/15 03:29:04
javaやC++と同じにしたいなら、同じ機構を用意すればいい。
wilikiの連中は、既存のシステムしか使わずに実行時に何かやろうとしてる。
おかしな事になるのは当然。こんなのと付き合う必要はない。
>>595を含め大抵の奴はCLOSモドキなんて望んでない。
javaやC++でコンパイル後に何の情報が残るか考えれば判るはず。
さあ、やるんだ。

601:デフォルトの名無しさん
08/06/15 03:35:07
>>599
元ネタってガンダムなの!?

602:デフォルトの名無しさん
08/06/15 03:47:35
>>600
こうして、アプリケーションと同じ数だけのフレームワークが発明されるのであった。w
(批判ではない。むしろこのあたりがLispの良さであろう。)

603:デフォルトの名無しさん
08/06/15 04:07:38
資産の積み重ねができないわけですね
これも数十年経ってもメジャーになれない理由の一つなのかな?

604:デフォルトの名無しさん
08/06/15 04:15:06
ANSIに規格がある言語はマイナーとは言えないだろう

605:デフォルトの名無しさん
08/06/15 05:03:15
>>595
CLOS系は「そういうもの(アクセス制御は気にしない)」だと思うのが吉。
文化の違い。
隠蔽したいなら、クロージャベースのオブジェクトシステムの方がいいんじゃないかな。


606:デフォルトの名無しさん
08/06/15 07:10:05
>>595
CLOSって、Java/C++系とは文化が違いすぎて、private/public/protectの区別がなくても
さほど問題がないよ。この辺は>>605さんの意見とかぶるね。

あの系統のオブジェクトシステムを作るなら、別に作成したほうがいいけど、できればCLOS
の方を利用するように頭の発想を切り替えたほうがいいよ。CLOSのほうが柔軟な制御が
できるのでね。

607:デフォルトの名無しさん
08/06/15 08:00:04
オブジェクトが必ずその名前のスロットを持っているとassertできる状況なら、
それを隠蔽する必要があるとは思えない。

608:デフォルトの名無しさん
08/06/15 08:16:27
CLOS使えだなんて口が裂けても言えん。

609:デフォルトの名無しさん
08/06/15 11:02:11
CLOSは、例えばアクセスコントロールを持つような
別の標準オブジェクトシステムのカーネルになるための
基本オブジェクトシステムとして考案されたが、
いつの間にか標準のオブジェクトシステムの座に着いている。

なんだ使ってみればCLOSのままでええやんってところか。

610:デフォルトの名無しさん
08/06/15 11:06:40
そこでFlavorsですよ。

611:デフォルトの名無しさん
08/06/15 11:27:16
>>609
この辺の事情はbit別冊のCLOS本に書いてある。
たしか井田さんがMLでの議論をまとめてる。

既存のCommonLoopsかFlovorsのどちらの流儀にするか揉めているところに、
汎用のカーネルを考案できないかとの提案があった。

612:デフォルトの名無しさん
08/06/15 11:30:26
>>597
そうですね。是非、そちらの方も活用させて頂きます。
scheme系は、まだ初めてから日が浅いこともあり、
気が引けてました。

>>600
私の不勉強で、どのようにJavaなどと同じ機構を実現するか分かりませんでした。
出直します。ただ、できるだけ独自の機構は避けたいと考えてました。

>>605-607
クロージャベースのオブジェクトシステムだと内部状態は隠蔽できますね。
ただ、CLOSとの相性・一貫性に不安があり、できればGaucheに標準的にある
オブジェクトシステムだけで解決しようと思ってました.
皆さんのおっしゃるように、発想を切り替えてみようと思います。

>>596-608
最後に。皆さん、レスありがとうございました。とても参考になりました。
CLOSと、Java/C++系とは異なる発想でプログラムを設計するという事ですね。
CLOSを実際にもっと使用して、その発想の違いを考えていきたいと思います。

613:デフォルトの名無しさん
08/06/15 11:47:01
人気の言語を作るには ---Being Popular---
URLリンク(practical-scheme.net)
を読んで妄想した事。
Lispにシステムハッキング機能を追加したら、インスタントLispマシンの出来上がり!!
Lisp Override your Operating System...

614:デフォルトの名無しさん
08/06/15 13:03:12
>>613
つmovitz

615:デフォルトの名無しさん
08/06/15 13:51:43
>>592-593
LanguageをSwindleに設定したらset-cdr!が使えました。

616:デフォルトの名無しさん
08/06/15 16:13:16
>>615
ver4.0ってR6RSに対応したんだっけ?

617:デフォルトの名無しさん
08/06/15 16:47:57
setq 説得

set-cdr! 説得だああああ!

618:デフォルトの名無しさん
08/06/15 16:54:30
お〜い、山田く〜ん
617の座布団全部とれ!

619:デフォルトの名無しさん
08/06/15 17:34:39
>>616
ほぼR6RSを満たすSchemeや、独自のPLT Schemeなど複数の言語が選べる。
そして、異なる言語で書かれたモジュールをインポートできる。

620:デフォルトの名無しさん
08/06/15 17:41:42
>>616
>ほぼR6RSを満たすSchemeや

まだR6RSに対応できてないの?言語選択はR5RSのままだし。

621:デフォルトの名無しさん
08/06/15 18:12:48
>>620
言語選択は一番上の ``Module'' を選ぶ。
ソース (DrSchemeのウィンドウの上半分) の最初の行に
#!r6rs
次の行に
(import (rnrs))
それ以降の行に定義を書いて
Runのボタンを押す。

622:デフォルトの名無しさん
08/06/15 19:12:34
r6rsモードだと#lang schemeの組み込み関数とかsrfiとか使えなくね?

623:デフォルトの名無しさん
08/06/15 19:48:02
R6RSになって「R5RS用のSRFI」は使えてるの?

624:デフォルトの名無しさん
08/06/15 19:59:04
Revised6 Report on the Algorithmic Language Scheme
URLリンク(www.r6rs.org)

Revised6 Report on the Algorithmic Language Scheme ― Standard Libraries
URLリンク(www.r6rs.org)

Revised6 Report on the Algorithmic Language Scheme ― Non-Normative Appendices
URLリンク(www.r6rs.org)

Revised6 Report on the Algorithmic Language Scheme ― Rationale
URLリンク(www.r6rs.org)

基本的には上2つがユーザーに重要な情報。
#次のテンプレに入れてください。

625:デフォルトの名無しさん
08/06/15 20:05:05
ちょっと聞きにくい質問なんですが、
R6RSってR5RSとかと比べてどうなんでしょうか。
まだ出たばかりで実装は少ないと思いますが、
今後、多くの処理系で実装が進むのか、
また、ユーザとしてもR6RSへの移行を意識しておくべきなのか、
そういったことです。
ちょっと漠然とした質問でうまくまとめられなくてすみません。

626:デフォルトの名無しさん
08/06/15 20:10:00
>>621
(import (rnrs))
↓↑
(import (rnrs (6)))

どっち?

627:デフォルトの名無しさん
08/06/15 20:14:27
>>621
補足
特殊トークン #!r6rs はソースがR6RS準拠であることを示す。コメント扱い。

628:デフォルトの名無しさん
08/06/15 20:19:16
(import (rms)) かとおもった。

629:デフォルトの名無しさん
08/06/15 20:25:35
slibはちゃんと使える?

630:デフォルトの名無しさん
08/06/15 20:44:36
>>625
R6RS決定時からPLT Scheme、Chez Scheme、Scheme48は近いうちにR6RSを採用すると言われていました。
今回、PLT Schemeが出してきたので、先行していたScheme48に続いて2つ目の実装かな。
Chez Scheme v7.4は部分的にR6RSのプリミティブが使えるようになってますが「will soon support R6RS standard.」となってるので、
次のアップデートで完全対応だと思います。

自分も含めたユーザーは実装が出揃って、ある程度比較記事などを見たうえで行動してもいいと思います。
今後、色々な問題点が表面化するでしょうから。
うまくいけばR6RS対応の色々な処理系に対するポータビリティは高くなる「ハズ」ですがw

631:デフォルトの名無しさん
08/06/15 21:19:15
>>628
Join us now and share the software;
You'll be free, hackers, you'll be free.
って超音痴で歌うのか!

632:デフォルトの名無しさん
08/06/15 21:20:10
Scheme48ってR6RSにもう対応してましたっけ?

633:デフォルトの名無しさん
08/06/15 21:22:20
Fmmm..... なぜあなたは超音痴だと確信したのですか?

634:デフォルトの名無しさん
08/06/15 21:32:05
>>633
一度聴いた事あるです orz


635:デフォルトの名無しさん
08/06/15 21:43:46
>>631
>Join us now and share the software;
>You'll be free, hackers, you'll be free.
これか…… URLリンク(jp.youtube.com)

636:デフォルトの名無しさん
08/06/15 22:09:42
>>622
(import
(rnrs)
(prefix (scheme base) scheme:))

637:デフォルトの名無しさん
08/06/16 19:19:10
Gauche-gl入りバージョンをリリースしました。(Gauchebox-0.8.13-box2.exe)
URLリンク(sourceforge.net)


638:デフォルトの名無しさん
08/06/16 19:20:02
ガウチェ(・∀・)

639:デフォルトの名無しさん
08/06/16 20:56:24
OpenBSDでClispをビルドすると
なぜか実行ファイル作成機能が壊れてしまうので
ソースを追ってみたのですが
とても不思議な現象に遭遇しました。
実行ファイルを指すファイルディスクリプタから
readで読み込む部分の前に
読み込み先メモリが一度は少なくとも4000バイト間隔で先頭から末尾までアクセスされてないと
EFAULTが起こります。
読み込み先メモリに4000バイト間隔で1バイトの読み込みOR書き込みを行ってから
readすれば正常に動作します。
なぜでしょう?
ちなみに4000バイト・EFAULTというのはi386プロセッサの場合で
armプロセッサの場合はそれぞれ3999バイト・EACCESになります。

640:デフォルトの名無しさん
08/06/16 22:57:20
>639
まぁとりあえずスレ鯛みておちつけ

641:デフォルトの名無しさん
08/06/16 23:13:55
CLispのビルドの問題なのでスレ違いじゃないと思ったのですが…

642:デフォルトの名無しさん
08/06/16 23:16:41
つか、もし本当なら OS のバグ(つまりスレチ)じゃね?

643:デフォルトの名無しさん
08/06/16 23:22:38
CLispならCommon Lispスレ行って聞いてみたらどう?
スレリンク(tech板)

644:デフォルトの名無しさん
08/06/16 23:29:25
別にすれ違いだとは思わないよ。ただし、それにコメントができる人はほとんどいなさそう。

645:デフォルトの名無しさん
08/06/16 23:36:41
>>644
>ただし、それにコメントができる人はほとんどいなさそう。
あら、そう。

646:デフォルトの名無しさん
08/06/16 23:39:10
>>644
氏ね

647:デフォルトの名無しさん
08/06/16 23:40:37
わかってるくせにwww

648:デフォルトの名無しさん
08/06/16 23:42:01
OpenBSDのスレで聞けや、クズ

649:デフォルトの名無しさん
08/06/16 23:44:43
いや、質問っていうよりは、報告したかったんじゃないのかなw

650:デフォルトの名無しさん
08/06/16 23:57:29
言葉の使い方もシランガキが集まってきたな。


651:デフォルトの名無しさん
08/06/16 23:58:43
>>639
>readで読み込む部分の前に
>読み込み先メモリが一度は少なくとも4000バイト間隔で先頭から末尾までアクセスされてないと
>EFAULTが起こります。

部分の前に
一度は少なくとも

はどういう意味でしょうか? 文章を読みこなせません。

652:デフォルトの名無しさん
08/06/17 00:18:00
仮割り当て状態のページに I/O するとエラーになるというんだろ。
本当なら OpenBSD のバグなので、そちら方面で報告すべし。

653:デフォルトの名無しさん
08/06/17 01:37:10
別にすれ違いだとは思わないよ。
第一、そんなことも知らないと見下されてるわけか。バカにされたもんだな。
そういうことを聞いてるんじゃないってことがなぜ伝わらないのか。
情報があるなら教えて欲しい、それだけだ。

654:デフォルトの名無しさん
08/06/17 01:54:56
>>65
最初の3行は不要
なぜ馬鹿にされたのか、なぜ伝わらなかったのかを考えたほうがいい

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)


次ページ
最新レス表示
スレッドの検索
類似スレ一覧
話題のニュース
おまかせリスト
▼オプションを表示
暇つぶし2ch

4740日前に更新/247 KB
担当:undef