Lisp Scheme Part18 ..
[2ch|▼Menu]
781:748
07/12/21 18:05:36
内容のある話じゃないのにドツボにはまっていく…

>>780
771さんが
>>(let ((x)) x) -> ERROR
>これはletの返り値じゃなくて、文法エラーだぜ。
と仰ったので
返り値じゃないことは分かっています、だから=>と->で書き分けました
と773で書いたのです

>>776
CLはたしかletがlambdaの糖衣構文じゃないから
((lambda (x) x))がエラーになる処理系でも
(let ((x)) x)がエラーになるとは限らない
他方、R5RSはletがlambdaの派生式だから
((lambda (x) x))がエラーになる場合は
(let ((x)) x)も当然エラーになる
と書きたかったのです

ところでR5RSの3.2においてport?という述語がありますが
port?という述語は標準手続きにありませんよね?
あと、promiseは典型的にはthunkで実現されてますけど
R5RSでは「一つの可能な実装」とされているにすぎませんので
標準手続きにおいてpromiseかどうかを判定する手段はありませんよね?

782:デフォルトの名無しさん
07/12/21 18:42:02
>>772
Gaucheで動くと思うけどなぁ?

(define (assoc key alist)
(and alist
(let loop ((ls alist))
(if (equal? key (caar ls))
(car ls)
(loop (cdr ls))))))
;-----------------------------------------------------------------
(define pref-alist
'(("山梨県" . "甲府市")
("神奈川県" . "横浜市")
("愛知県" . "名古屋市")
("茨城県" . "水戸市")))
;-----------------------------------------------------------------
(assoc "山梨県" pref-alist)

783:デフォルトの名無しさん
07/12/21 18:53:44
(assoc "山梨" pref-alist)
*** ERROR: pair required, but got ()

784:デフォルトの名無しさん
07/12/21 19:15:03
>>783
ファイルに>>782を書き込んで、そのファイルをeamcsとかMeadowでc-c c-l <<ファイル名>> したあとでやってみるといいYO!


785:デフォルトの名無しさん
07/12/21 19:16:29
>>783
山梨じゃなくて「山梨県」だYO!

786:デフォルトの名無しさん
07/12/21 19:17:29
gosh> (assoc "山梨県" pref-alist)
("山梨県" . "甲府市")
gosh>

787:デフォルトの名無しさん
07/12/21 19:25:50
783さんはマッチしないキーがある場合の判定が抜けていることを指摘しているのでは?

788:デフォルトの名無しさん
07/12/21 19:28:45
ところで最初の(and alistは何のため?

789:デフォルトの名無しさん
07/12/21 19:30:07
日本語がおかしかった
与えられたキーがマッチしなかった場合

790:デフォルトの名無しさん
07/12/21 21:15:06
>>787-789
漏れもandだけではnull?の代わりにならないような希ガス

791:デフォルトの名無しさん
07/12/21 23:36:44
再帰の方がきれいに書けちゃうんだな

792:デフォルトの名無しさん
07/12/22 00:39:53
>>779 Lisp で良ければ defsystem とか asdf とか?Scheme にも多分似たようなものがありそう。

793:デフォルトの名無しさん
07/12/22 01:33:19
>>763

(define (assoc key alist)
(and (pair? alist)
(let loop ((ls alist))
(if (equal? key (caar ls))
(car ls)
(loop (cdr ls))))))


794:デフォルトの名無しさん
07/12/22 01:38:15
>>793
>>788

795:デフォルトの名無しさん
07/12/22 02:28:53
>>794

andはリストを左から右へ評価して行って、偽が見つかると#fを返すから。

(cond ((null? alist) #f)
    ...)

と書くよりは短く書ける。
(pair? alist)が偽だったら即座に#fを返しそこで終了する。

796:デフォルトの名無しさん
07/12/22 03:00:08
>>793で(pair? alist)が評価されるのは最初の1回だけでしょ?
alistのcdrをとっていってcdr部が空リストになった場合=keyがなかった場合の判定が欠けてる
gosh> (assoc "山梨" pref-alist)
*** ERROR: pair required, but got ()


797:デフォルトの名無しさん
07/12/22 04:14:14
>> 781
なるほど
きみの言わんとする意味がだいたい見当がつきました
きみはこう言いたいのでしょう

Unspecific値はどこだ!

798:デフォルトの名無しさん
07/12/22 04:24:14
;andを使った場合

(define (assoc key alist)
 (let loop ((ls alist))
  (and (pair? ls)
     (if (equal? key (caar ls))
       (car ls)
       (loop (cdr ls))))))

;andを使わない場合

(define (assoc key alist)
 (let loop ((ls alist))
  (cond ((null? ls)
       #f)
      ((equal? key (caar ls))
       (car ls))
      (else
       (loop (cdr ls))))))

799:デフォルトの名無しさん
07/12/22 08:52:13
>>781
内容ないって事ないんだけどな。

エラー状態とトップレベルの関係、さらにunspecified値の扱いは、
メタ・サーキューラな意味において、schemeが昔から弱かった部分。
MLなんかはもっとカッチリしてる。
SchemeはR6RSで少し前進したけれど、
やっぱりR?RS的な非形式的な意味論なんだな。


800:デフォルトの名無しさん
07/12/22 12:52:47
>>797
Unspecific 値なんて存在しない!

801:デフォルトの名無しさん
07/12/22 13:23:04
Lifting して Unspecific 値を、メタに扱える言語ってあったよな。

802:デフォルトの名無しさん
07/12/22 14:23:23
>>765>>798で4つのassocが登場。
どれが一番早いんだろう?
教えて!判定方法を知ってるエロい人。

803:デフォルトの名無しさん
07/12/22 14:32:16
>>802
実測基本

804:デフォルトの名無しさん
07/12/22 16:15:18
>>802-803
メモリ使用量の少ないのはどれかも考えると面白いね。

805:デフォルトの名無しさん
07/12/22 16:17:31
>>803
ストップウォッチでは差が出ません。
どうやればいいでしょうか?
例えばGaucheではどうやるんでしょう?

806:デフォルトの名無しさん
07/12/22 16:24:28
差が出ないなら、差が出る程度まで繰り返せばいいじゃないの。

807:デフォルトの名無しさん
07/12/22 16:40:00
Gaucheにはtimeがあるみたい


808:デフォルトの名無しさん
07/12/22 16:54:23
プロファイラ的なものって何がある?

809:デフォルトの名無しさん
07/12/22 17:07:24
gosh> (time (assoc "山梨県" pref-alist))
;(time (assoc "山梨県" pref-alist))
; real 0.000
; user 0.000
; sys 0.000
("山梨県" . "甲府市")
gosh>

810:デフォルトの名無しさん
07/12/22 17:38:00
シーケンシャルに検索してんのに
1番目のデータを計ってどーすんのw

811:デフォルトの名無しさん
07/12/22 17:40:45
gosh> (time (assoc "茨城県" pref-alist))
;(time (assoc "茨城県" pref-alist))
; real 0.000
; user 0.000
; sys 0.000
("茨城県" . "水戸市")
gosh>

812:デフォルトの名無しさん
07/12/22 17:41:59
O(n)なんだからnの数を増やしてみなきゃ

813:デフォルトの名無しさん
07/12/22 22:12:16
1億個くらいは入れなきゃですよ

814:デフォルトの名無しさん
07/12/23 19:02:44
あれ?Kahua FreeBSDで動くようになった?

815:デフォルトの名無しさん
07/12/23 20:04:51
>>814
かなり前からなってるぞ。

816:デフォルトの名無しさん
07/12/24 18:53:25
;(define (assoc key alist)
;  (and (pair? alist)
;       (pair? (car alist))
;       (or (and (equal? key (caar alist))
;           (cdar alist))
;           (assoc key (cdr alist))))

817:デフォルトの名無しさん
07/12/24 18:56:45
インデント思いっきり間違えたorz
しかもずれてるしorz
(cdar alist)は(equal?と同格ね

818:デフォルトの名無しさん
07/12/25 02:11:31
さらにどこか間違ってると思ったら
(cdar alist)じゃなくて(car alist)だったorz
cdarだったら連想リストじゃなくてデータだけを返す上に
データが#fだった場合に次に進んでしまう

819:デフォルトの名無しさん
07/12/25 16:59:43
キタ━━\(^λ^)/━━!!

プログラミングGauche
・著者:川合史朗 監修
Kahuaプロジェクト 著
・定価:3360円(本体3200円+税)
・B5変 464頁
・ISBN 978-4-87311-348-7
・発売日:2008/02
URLリンク(ssl.ohmsha.co.jp)


820:デフォルトの名無しさん
07/12/25 21:01:42
2月かあ

821:デフォルトの名無しさん
07/12/25 23:22:54
Kahuaプロジェクトのメンバーがもしここを見てたら期待してるので頑張ってくださいね。
バグ取りと校正もしっかりお願いしますねw
必ず買いますYO!

822:デフォルトの名無しさん
07/12/25 23:34:01
その前に読んどきたい本があるからちょうどいいや

823:デフォルトの名無しさん
07/12/26 02:40:05
>>819
あれ? 延びたの?
オライリーからのメールだと一月予定だったんだが。


824:デフォルトの名無しさん
07/12/26 22:44:18
609で書いたzaurus-OpenBSDでGambit-Cのリーダがいかれてる理由が分かりました
エンディアンネスの誤認でした
最初に疑ったのがエンディアンネスの問題でしたが
リーダ以外に変な挙動をしなかったので見逃してました

OpenBSD4.2になってBoehm-GCの7.x系統が動くようになったので
Gaucheも7.x系統に移行した暁には動くようになりそうです
現在もgcディレクトリをいじったら
そこそこ動く実行ファイルはできるのですが
特定の場合にassertで落ちるので常用はできなそうです

あとLinuxの場合は特に問題にならないのですが
BSD系でscheme48から外部モジュールを読み込む場合
実行ファイルであるscheme48vmが-−export-dynamicでリンクされていないと
s48_で始まる関数が外部モジュールから利用できないようです
(Linuxは--export-dynamicがデフォルト?)

Gambit-Cもscheme48も(zaurus-OpenBSDも)
利用者があまりいないので有用な情報でもありませんが
一応報告しときます

825:デフォルトの名無しさん
07/12/27 01:31:26
GaucheはさっさとWindowsに完全対応しろよ。何やってんだ。

826:デフォルトの名無しさん
07/12/27 01:54:40
Windows(笑)

827:デフォルトの名無しさん
07/12/27 05:08:21
Windows使ってねーから個人的にはどうでもいいけど。
必要ならScheme Artsに仕事として依頼するのがはやくて確実じゃないか。


828:デフォルトの名無しさん
07/12/27 07:30:30
Gaucheは早く1.0出して欲しいなー


829:デフォルトの名無しさん
07/12/27 08:59:40
バージョン番号なんてどうでも良くない?

830:デフォルトの名無しさん
07/12/27 13:01:03
頭の尖った上司が気にするんですよお

831:デフォルトの名無しさん
07/12/27 15:57:04
「まだ0.*だからうるさく言うなよ」

832:デフォルトの名無しさん
07/12/27 19:34:48
非R6RSのschemeでファイルをランダムアクセスで読み込む場合は
処理系依存のfile-position相当の関数を呼ぶのと
遅延評価の無限ストリームを作るのと
どっちが一般的ですか?

R6RSになればset-port-position!が使えるみたいですけど

833:デフォルトの名無しさん
07/12/27 19:39:17
R6RSより、.NETに対応してほしい。

834:デフォルトの名無しさん
07/12/27 22:14:34
現在R6RSをサポートしてる処理系ってLarcenyだけですか?
大御所どころも軒並みR6RSを実装する予定もないみたいですし
どうなっちゃうんでしょうね

835:デフォルトの名無しさん
07/12/27 22:57:26
みんなこっそりやってるんですよ

836:デフォルトの名無しさん
07/12/28 01:48:42
URLリンク(www.cs.indiana.edu)
は、いまR6RSに9割準拠らしい。

837:デフォルトの名無しさん
07/12/30 12:42:16
ちゅーかみんな対応する気無いなら、策定すんなって感じだな。

838:デフォルトの名無しさん
07/12/30 13:44:48
向かい側ではC99とかね

839:デフォルトの名無しさん
07/12/30 23:32:51
>>837
R6RSの投票のとき処理系の作成者のほとんどが反対だったのに、数の暴力で押し切られたって事実を知ってる?

840:デフォルトの名無しさん
07/12/31 00:10:27
嫌なら処理系の作成者で別の標準を作ればよいのでは?

841:デフォルトの名無しさん
07/12/31 00:12:35
いまさら変な標準なんか作らなくていいから、.net frameworkに対応しろよ。

842:デフォルトの名無しさん
07/12/31 00:35:01
>>839
反対した人はどんな人が居るの?
shiro さんは反対に投票した様に記憶しているけど

843:デフォルトの名無しさん
07/12/31 01:05:09
>>840
「嫌なら対応しなけりゃいい」だろ。
で、実際にみんなそうやってる。めでたしめでたしだ。

844:デフォルトの名無しさん
07/12/31 01:15:07
>>842 調べてみた。

票:投票内容(○:賛成、×:反対、−:未投票)
実:R6RSを実装するかどうか(Marc Feeleyのアンケート)

                   票 実
Manuel Serrento (Bigloo)    − ×
Kent Dybvig (Chez Scheme)  ○ ○
Felix WinkelMann (Chiken)    × ×
Marc Feeley (Gambit)      × ×
Shiro Kawai (Gauche)      × ×
Ludovic Courtes (Guile)     − ×
Tim Hickey (JScheme)      − ×
Per Bothner (Kawa)       × ×
Will Clinger (Larceny)       × ○
Tom Lord (Pika Scheme)    ○ ×
Matthew Flatt (PLT Scheme)  ○ ○
Mike Sperber (Scheme 48)   ○ ○
Aubrey Jaffer (SCM)      × ×
Scott Miller (SISC)        − ×
Jeffrey Mark Siskind (Stalin)  × ×
Erick Gallesio (STklos)      − ×


845:844
07/12/31 01:21:15
ミスった。
Kawaの人、反対票じゃなくて未投票

846:デフォルトの名無しさん
07/12/31 01:26:24
>>844-845
大感謝!
一応 Gauche は R6RS も気にしつつ行くみたいですね

URLリンク(lists.sourceforge.jp)


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

5099日前に更新/189 KB
担当:undef