Lisp Scheme Part18 ..
[2ch|▼Menu]
665:デフォルトの名無しさん
07/12/06 15:15:39
do は counter-B の値を破壊的に書き換えてない。
新しい環境作って、そこで同じ名前に別の値を束縛してるだけ。
だから元の場所に戻ると、そこの環境にはそのときの値が残ってるから、その値が参照される。

set! は破壊的に書き換えるから、元の値が残ってない。

666:デフォルトの名無しさん
07/12/07 04:31:10
Clojure試してるんだけどClassCastExceptionばかりで使い物になんないよ……
どうなってんのこれ。

667:デフォルトの名無しさん
07/12/07 20:01:29
clusure じゃないの?って検索してみたら…

java スレ行け。

668:デフォルトの名無しさん
07/12/07 20:02:20
× clusure
○ closure

669:デフォルトの名無しさん
07/12/08 01:05:55
>>666 作ってるよーという話がでたばかりの言語に安定性を期待しすぎなんじゃないの?

670:デフォルトの名無しさん
07/12/08 02:36:47
Clojureは広い意味でのLISPっぽさがあっていいんじゃないの?

671:デフォルトの名無しさん
07/12/08 08:02:24
一般的なLispとの違いがまとめてあるけど、
URLリンク(clojure.sourceforge.net)
どう考えてもLispでしょ。

Haskell方面で良く使われているSTM、
それにreactive Agent使った並列Lispの一種で面白いと思う。
STMでいろいろ遊んでみたかったんで試してみます。>>666サンクス

>>667みたいな馬鹿はなんなんだろ。

672:デフォルトの名無しさん
07/12/08 09:36:17
java で書かれたなんらかの言語の実装系に問題があるなら
なんらかの言語は無関係と思うが?
ClassCastException って java の例外でそ?

673:デフォルトの名無しさん
07/12/08 09:39:16
661=671乙

javaで書かれた何かの言語の処理の実装系に問題があるなら
その何かの言語よりjavaに通じた人に質問する方が効果あると思うが?

ClassCastException は java の例外でしょ?

674:デフォルトの名無しさん
07/12/08 09:43:08
と考えたが、Cで書かれたschemeの処理系に問題があった場合、
C使いだけでなくschemerに聞くのも有りか…

javaグラマに偏見あるな俺は

675:671
07/12/08 10:12:13
>>673
>>664は俺なんだけど何で分かったの!びっくり!
と思ったら>>661 orz

>>666の間違いかよ!

676:673
07/12/08 10:52:39
>> 675

誤りについては御寛恕賜りたく、

677:デフォルトの名無しさん
07/12/08 12:54:42
>>674
あるみたいだね

678:デフォルトの名無しさん
07/12/08 13:17:21
最初はJDK1,7のクロージャの実装がまだバグが多くて愚痴った内容を誤爆していたのかと思った。
JVMの上で動くClojureというLISP処理系の話とは思わなかった。

679:デフォルトの名無しさん
07/12/08 13:53:24
>>671
>>>667みたいな馬鹿はなんなんだろ。

2ch だからといって安直に馬鹿とかアホとか書くのは止めた方が良いよ。

680:デフォルトの名無しさん
07/12/08 14:20:34
ポメラニアンファック! ヽ(`Д´)ノ

681:デフォルトの名無しさん
07/12/09 04:58:51
>>679
書いた本人が安直な馬鹿だから、言ってもしょうがない。

682:デフォルトの名無しさん
07/12/09 19:56:01
>>666
ClassCastExceptionなんていうJavaの例外が出てる時点で、処理系の不具合だろうが。
不具合あるなら、ソース読むか、コミュニティに報告するかだろ。
それができないんだったら、安定版がリリースするまでおとなしく黙ってろ。

683:デフォルトの名無しさん
07/12/10 01:39:04
>不具合あるなら、ソース読むか、コミュニティに報告するか
あるいは愚痴を言う、だろ?

そのキツい態度はこのスレに取って良い未来を生み出さないと思うのだが。


684:デフォルトの名無しさん
07/12/10 04:00:09
>>683
その優しい態度も良い未来を生み出さないという意味では同じであろう。
つまり、好きにそれぞれの芸風でやってくれ。w

685:デフォルトの名無しさん
07/12/10 08:09:12
俺は優しくしているつもりはない。
ただフレームを生み出すよりは無視する方がまだマシだというお馴染みの主張をしたいだけで


686:デフォルトの名無しさん
07/12/11 10:12:56
R6RSなんかより、MS謹製のLisp#に期待だなぁ。
強力なIDEの付いたVisual Lisp# 2008出してくれないかな。。

687:デフォルトの名無しさん
07/12/11 10:22:16
俺は型付き Lisp が欲しいな。勿論型推論込みで。

688:デフォルトの名無しさん
07/12/11 12:00:24
インタープリタで型推論とか出来るんだろうか

689:デフォルトの名無しさん
07/12/11 12:44:23
hugsとかやってるじゃん

690:デフォルトの名無しさん
07/12/11 19:11:27
>>686
どんなMS独自仕様が拡張されているの?

691:デフォルトの名無しさん
07/12/11 21:02:04
OCamlなんかもインタプリタで型推論してますね

ところでScheme48でscmファイルからモジュールを,openする方法ってないんでしょうか?
モジュールを,openしたヒープイメージを,dumpか,buildする方法だとなんか大げさだし
標準入力で,openさせて-a batchする方法だと標準入力が塞がっちゃうし
(open structure-name)とかで,openできればいいんですけど…

692:デフォルトの名無しさん
07/12/11 21:59:56
>>690
.NET Framework をシームレスに呼べるようになってたりするのだろう。w
それはそれで便利かも。

693:デフォルトの名無しさん
07/12/11 22:16:56
F#ですか

694:デフォルトの名無しさん
07/12/11 22:33:57
MSによりLisp#が開発される暁には、.net frameworkを呼べるようになるだけではなく、
Java→C#で行われたような言語レベルでの大幅な強化・改善が行われるだろう。

695:デフォルトの名無しさん
07/12/11 22:38:10
丸括弧が無くなるんじゃねーの

696:デフォルトの名無しさん
07/12/12 00:55:36
あの会社としては、CLtLとかRxRSなんて気にしないで新標準を作っちゃうんだろうけど、
それでも依然として LISP ではあるところが LISP の包容力の大きさだ。w
まじでやってほしい気がしてきた。

697:デフォルトの名無しさん
07/12/12 10:45:55
lispであるための条件って
表現がS式であることしか無いような気がしてきた

698:デフォルトの名無しさん
07/12/12 16:29:24
M式の立場は?

699:デフォルトの名無しさん
07/12/12 17:06:11
SM式?

700:デフォルトの名無しさん
07/12/12 20:24:54
665で1文字読み込む実装は知らないなんて書きましたけど
無知すぎました
エンコーディングさえ設定すれば1文字読み込むことも出来る実装がちゃんとあるんですね

701:デフォルトの名無しさん
07/12/13 09:49:24
>>695
( ) の代わりに全部 { } で書くの?

702:デフォルトの名無しさん
07/12/13 17:35:11
>>700
>665で1文字読み込む実装は知らないなんて書きましたけど

665にはそんな記述見あたらないんだけど…
655の間違いだな

703:デフォルトの名無しさん
07/12/13 22:19:54
>>695
dylanのことかーっ

704:691
07/12/14 01:07:29
slib/scheme48.initに答えが書いてありますねorz
slibはscheme48を冷遇してるから期待してなかったんですが…

705:700
07/12/14 20:29:02
>>702
訂正どうもです

706:デフォルトの名無しさん
07/12/14 23:11:54
『Gaucheプログラミング』

Kahuaプロジェクト 著
川合 史朗 監修
ISBN978-4-87311-348-7
定価3,360円

707:デフォルトの名無しさん
07/12/14 23:50:51
>>706
発売日は決まったの?

708:デフォルトの名無しさん
07/12/15 07:58:50
>>706
「プログラミングGauche」じゃなかったっけ?


709:デフォルトの名無しさん
07/12/15 08:43:01
「プロGaucheグラミング」

710:デフォルトの名無しさん
07/12/15 08:46:56
「プGロaグuラcミhンeグ」

711:デフォルトの名無しさん
07/12/15 08:50:12
それが出たら終了だな

712:デフォルトの名無しさん
07/12/15 09:29:05
「プログラミング」

   ∩___∩
   | ノ       ヽ
  /  ●   ● | G、Gauche!
  |  ///( _●_)//ミ
 彡、  /⌒)(⌒ヽノ
  ./  /  / \ \
  l   ノ    `ー‐'


713:デフォルトの名無しさん
07/12/15 12:14:48
ガウチェ

714:デフォルトの名無しさん
07/12/15 17:26:12
assqとassocはeqとequalの違いがあると本に書いてありました。
でも、どんな場合に違いがでるのかわからないので説明があるどこかのURLを教えてください。
お願いします。

715:デフォルトの名無しさん
07/12/15 17:49:32
>>714
eqとequalの違いは判る人?
それすら判らない人?

716:デフォルトの名無しさん
07/12/15 17:50:56
>>714
URLリンク(www.google.co.jp)

717:デフォルトの名無しさん
07/12/15 18:35:24
>>714
"Comparator"の違い。

718:デフォルトの名無しさん
07/12/15 18:37:57
>>715
わかりません。

>>716
やってみましたが下記のような感じで書いてあり、いまいち初心者にはピンと来ないのです。

eq
二つのオブジェクト(実体)が同じものの時。
実体が同じということは、その内容が変われば、他方の内容もそれにつれて変わるような関係。
シンボルや、整数値の場合は、名前や値が同じだけで同じと判別する。
equal
中身が同じものを指しているなら真。

719:デフォルトの名無しさん
07/12/15 18:49:29
>>714
一致する場合はこう。

(assq 'a '((a b) (c d))) ; => (a b)
(assoc 'a '((a b) (c d))) ; => (a b)

違いは以下のような場合。実行してみるとこういう違いがある。

(assq '(4 5) '(((1 2) 3) ((4 5) 6))) ; => #f
(assoc '(4 5) '(((1 2) 3) ((4 5) 6))) ; => ((4 5) 6)

>>718の説明から理解するのは難しい。

720:デフォルトの名無しさん
07/12/15 18:50:39
>>718
Javaの == と equals との関係に似ている
eq はポインタ同値

721:デフォルトの名無しさん
07/12/15 18:59:02
>>718は変。
eq
< 二つの引数が同じオブジェクトなら真。
equal
< 二つの引数が別のオブジェクトでも中身が同じなら真。

722:デフォルトの名無しさん
07/12/15 19:09:49
>>718
うるさいことを言わなければ、は以下のような使い分けになる。

・シンボルであることが明らかな場合は eq を使うことができる。(eqのほうが速い)
・そうでないときは equal が安全。
・その中間として eql ってのがある。構造のあるもの(リスト・文字列・配列など)でないことが
判っていればこちらのほうが速い。
・数値同士だと判ってるなら =、文字列同士なら string= がたぶん速い。

なぜこんなことになってるか知りたければもっと勉強するべし。

723:デフォルトの名無しさん
07/12/15 19:10:00
>>719-721
ありがとうございます。すごくよくわかりました。
(assq '(4 5) '(((1 2) 3) ((4 5) 6))) ; => #f
(assoc '(4 5) '(((1 2) 3) ((4 5) 6))) ; => ((4 5) 6)
の場合には(4 5)が別々のオブジェクトをさすポインタだからeqでは偽になるんですね。
でもequalだとオブジェクトが同じだから真になるんですね。

724:デフォルトの名無しさん
07/12/15 19:19:45
>>718
assqの実装は大体こんな感じになっている。

(defun assq (key alist)
(cond
((null alist) nil)
((eq key (car (car alist))) (car alist))
(t (assq key (cdr alist)))))

assocならこう

(defun assoc (key alist)
(cond
((null alist) nil)
((equal key (car (car alist))) (car alist))
(t (assq key (cdr alist)))))

>>724が言うようにeqlや=やstring=を使えば用途に応じて高速なものが使える。

725:デフォルトの名無しさん
07/12/15 19:25:35
>>723
> でもequalだとオブジェクトが同じだから真になるんですね。
< でもequalだとオブジェクトの中身が同じだから真になるんですね。


726:デフォルトの名無しさん
07/12/15 19:34:35
>>722>>724>>725
ありがとうございます。

>>722
むずかしいけど、>>724の解説をみて、使うと便利だということは理解できました (^ ^;

>>724
そういうプログラムなんですね。eqとequalの使われてるところとか参考になりました。

>>725
ありがとうございます。そういうことを書いたつもりでした。でもプログラミングのことを正確に話し言葉にするのって難しいです。

727:デフォルトの名無しさん
07/12/15 20:32:28
例えばここにSBCLのeq, eql, equalのソースがある
URLリンク(sbcl.cvs.sourceforge.net)
> 196 ;;;; equality predicates
eqの実質的な定義はちょっと見つけられなかったけど...

728:デフォルトの名無しさん
07/12/15 20:36:48
>>424
最後の行が間違えてるね。assq=>assoc

(defun assoc (key alist)
(cond
((null alist) nil)
((equal key (car (car alist))) (car alist))
(t (assoc key (cdr alist)))))

729:デフォルトの名無しさん
07/12/15 21:54:45
(defun sqrt (x)
(defun good-enough? (guess)
(< (abs (- (square guess) x)) 0.001))
(defun improve (guess)
(average guess (/ x guess)))
(defun sqrt-iter (guess)
(if (good-enough? guess)
guess
(sqrt-iter (improve guess))))
(sqrt-iter 1.0))

(defun average (a b) (/ (+ a b) 2))

(defun square (x) (* x x))

(sqrt 2)
1.414216

730:デフォルトの名無しさん
07/12/15 22:14:28
随分と荒い収束判定だな

731:デフォルトの名無しさん
07/12/15 22:27:49
>>730
どこを修正すると改善されるか?という問題かな?

732:デフォルトの名無しさん
07/12/15 22:35:11
無理せず Scheme 使えば…… define と defun は違うよ。とオモタ

733:デフォルトの名無しさん
07/12/16 00:54:38
>>732
Schemeを使わなくてもCLにはlabelsがあるよ。とオモタ

734:デフォルトの名無しさん
07/12/16 01:38:25
>>727
「実質的な」ってどういう意味?

735:デフォルトの名無しさん
07/12/16 12:26:37
自問自答w

翻訳系eq実装の事ね。
src/compiler/x86/pred.lisp

eqlは、
src/compiler/x86/arith.lisp
src/compiler/x86/float.lisp
src/compiler/src/trans.lisp
あたり。



736:デフォルトの名無しさん
07/12/17 02:31:46
jmuk(笑) Haskell(笑)

737:デフォルトの名無しさん
07/12/17 23:35:02
今日の発見

(atom '(1 2 3)) ; => nil
(atom (quote ())) ;=> t

空リストがアトムだと知らなかった。 orz

738:デフォルトの名無しさん
07/12/17 23:39:40
(listp '())
t

リストでもある

739:デフォルトの名無しさん
07/12/17 23:58:26
(defun . (atom . ((x . nil) . ((not . ((consp . (x . nil))))))))

740:デフォルトの名無しさん
07/12/18 01:01:57
CLなら()はquoteしなくてもいいんじゃなかったっけ?
Schemeならquoteがいるけど
Guileは()も#(...)も自己評価的でRnRSとはだいぶ違う(Schemeの中ではCL寄り?)
R5RSに準拠してくれたら乗り換えてもいいかなと思うんだけど

741:デフォルトの名無しさん
07/12/18 02:14:52
>>737
nilって知ってる?

742:デフォルトの名無しさん
07/12/18 08:44:38
(atomp '下條) => t

743:デフォルトの名無しさん
07/12/18 12:32:51
(atomp '鉄腕) => t

744:デフォルトの名無しさん
07/12/18 16:01:08
(atomp 'フランツ) => t
あれ?

745:デフォルトの名無しさん
07/12/18 18:48:24
てか、atomp でいいの?

746:デフォルトの名無しさん
07/12/18 20:13:30
>>738
listpとか

(null ())
t

とかも教科書では出てくるけどatomはあまり使わないかな。記号処理では使うけど。



747:デフォルトの名無しさん
07/12/18 20:46:24
>>745

ホントは良くない。

748:デフォルトの名無しさん
07/12/19 14:15:26
Common Lisp:
(let ((x)) x) => NIL
Scheme:
(let ((x)) x) -> ERROR
Unspecific値が返るかと密かに期待したんですけど
CLと違ってSchemeではletはlambdaの派生式だから当然と言えば当然ですね
Unspecific値を手軽に得るには(if #f #f)しかないのかな?

749:デフォルトの名無しさん
07/12/20 00:22:39
>>728
Scheme版ならこんな感じ。

(define assoc
(lambda (key alist)
(cond ((null alist) nil)
((equal key (car (car alist))) (car alist))
(else (assoc key (cdr alist))))))

lambdaとelseを使ってみた。

750:デフォルトの名無しさん
07/12/20 00:26:32
SchemeかLispで書いてあるアルゴリズムの教科書を教えてください。

751:デフォルトの名無しさん
07/12/20 01:28:38
>>748
Schemeの文法良く調べろよ。

752:デフォルトの名無しさん
07/12/20 04:05:38
(define assoc
 (lambda (key alist)
  (cond ((null? alist)
       #f)
      ((equal? key (caar alist)))
       (car alist))
      (else
       (assoc key (cdr alist))))))

753:デフォルトの名無しさん
07/12/20 17:54:21
>>752
乙!
null?だよね。間違ってたw
あとcaarの方が簡潔だね。

754:デフォルトの名無しさん
07/12/20 17:55:22
>>751
文法はアルゴリズムじゃないぜw

755:デフォルトの名無しさん
07/12/20 17:57:38
>>754
アルゴリズムの話なんてしてないだろw

756:デフォルトの名無しさん
07/12/20 18:00:54
>>750
釣りかもしれないけどSICPとかどうよ?

757:デフォルトの名無しさん
07/12/20 18:03:46
>>755
はぁ?

>750 名前:デフォルトの名無しさん 投稿日:2007/12/20(木) 00:26:32
>SchemeかLispで書いてあるアルゴリズムの教科書を教えてください。
>
>
>751 名前:デフォルトの名無しさん 投稿日:2007/12/20(木) 01:28:38
>>>748
>Schemeの文法良く調べろよ。
>
>754 名前:デフォルトの名無しさん 投稿日:2007/12/20(木) 17:55:22
>>>751
>文法はアルゴリズムじゃないぜw
>
>
>755 名前:デフォルトの名無しさん 投稿日:2007/12/20(木) 17:57:38
>>>754
>アルゴリズムの話なんてしてないだろw

アルゴリズムの話じゃなきゃなんなの?

758:デフォルトの名無しさん
07/12/20 18:30:18
これは新手の荒しか?







759:デフォルトの名無しさん
07/12/20 18:34:33
     /\⌒ヽペタン
   /  /⌒)ノ ペタン
  ∧_∧ \ (( ∧_∧
 (; ´Д`))' ))(・∀・ ;)
 /  ⌒ノ ( ⌒ヽ⊂⌒ヽ
.(O   ノ ) ̄ ̄ ̄()__   )
 )_)_) (;;;;;;;;;;;;;;;;;;;)(_(

アンカーをもう一度見直すんだ

760:デフォルトの名無しさん
07/12/20 18:58:27
>>759
わはー、おっちょこちょいはワシだけじゃなかったらすぃ


761:デフォルトの名無しさん
07/12/20 18:58:29
>>754 が勘違いしたってことでいいのか?


762:デフォルトの名無しさん
07/12/20 20:15:05
Lisp/Schemeでセジウィックみたいなアルゴリズムの本って思いつかないな?
SICPは良い本だけど辞書的ではないしなぁ。

763:デフォルトの名無しさん
07/12/20 21:05:07
>>752

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


764:デフォルトの名無しさん
07/12/20 21:10:53
関数型という範疇であればアルゴリズムの本はあるよ。MLだけど。

Purely Functional Data Structures

Algorithms: A Functional Programming Approach

765:デフォルトの名無しさん
07/12/20 22:08:20
>>749さんのは動かなかったので修正しておきました。
(define assoc
(lambda (key alist)
(cond
((null? alist) #f)
((equal? key (car (car alist))) (car alist))
(else (assoc key (cdr alist))))))

>>752さんのも動かなかったので修正しておきました。
(define assoc
(lambda (key alist)
(cond
((null? alist) #f)
((equal? key (caar alist)) (car alist))
(else (assoc key (cdr alist))))))

>>763さんのは動きました。loopの使い方がイイ感じですね。

766:デフォルトの名無しさん
07/12/20 23:38:07
Lispで

(setq pref-alist
'(("山梨県" . "甲府市")
("神奈川県" . "横浜市")
("愛知県" . "名古屋市")
("茨城県" . "水戸市")))

とやっているのをschemeではどのように書けばよいのでしょうか?お願いします。

767:デフォルトの名無しさん
07/12/20 23:40:38
トップレベルなら setq を define にするだけだべ

768:デフォルトの名無しさん
07/12/21 00:06:44
>>767
gaucheでそうやってみると

gosh> *** READ-ERROR: Read error at "c:/meadow/test-assoc.scm":line 43: EOF encountered in a string literal: "壤壤壤「壤ィ"
Stack Trace:

となるので間違っているのかと思いまして。日本語が上手く通っていないだけなんですね。ちょっとがっかりですが納得できました。有り難うございます。

769:デフォルトの名無しさん
07/12/21 00:15:17
英語で

(define pref-alist
'(("yamanashi" . "kofu")
("kanagawa" . "yokohama")
("aichi" . "nagoya")
("ibaraki" . "mito")))

と書いて、
>

c-c c-l ファイル名
したあと

>gosh> (assoc "ibaraki" pref-alist)
("ibaraki" . "mito")

と出来ました。お騒がせしました。utf-8が上手く行ってないようです。

770:デフォルトの名無しさん
07/12/21 00:24:35
c-x return f utf-8 return
してからセーブしたら解決しました。
Gaucheの仕様がコンソール上ではsjisでOKなのに、ファイルだとutf-8しか受け付けないというのがわかっていなかったのが原因でした。

771:デフォルトの名無しさん
07/12/21 00:46:35
>>748
> (let ((x)) x) -> ERROR

これはletの返り値じゃなくて、文法エラーだぜ。
初期値省略は許されてない!


772:デフォルトの名無しさん
07/12/21 01:09:49
>>765
> >>763さんのは動きました。
動かないと思うんですが


773:748
07/12/21 06:38:07
=>が返り値
->が結果のつもりで書き分けたんですが…


774:デフォルトの名無しさん
07/12/21 07:23:25
URLリンク(page13.auctions.yahoo.co.jp)
>希望落札価格:10,000 円

(; ・`д・´) な、なんだってー!! (`・д´・ ;)

775:デフォルトの名無しさん
07/12/21 08:08:30
amazonのマーケットプレイスでの「入門Scheme」が\12,000だからなぁ。

776:デフォルトの名無しさん
07/12/21 09:07:32
>>773
> ->が結果のつもりで書き分けたんですが…
>>748では
> (let ((x)) x) -> ERROR
> Unspecific値が返るかと密かに期待したんですけど
って自分で言ってんじゃん。

> CLと違ってSchemeではletはlambdaの派生式だから当然と言えば当然ですね

とか何の関係ないし。初期化しないとUnspecific値が得られると思ったんでしょ。

777:デフォルトの名無しさん
07/12/21 09:12:24
>>774
この人かな
URLリンク(www.geocities.jp)

778:748
07/12/21 09:57:25
いやだから
期待したのは(let ((x)) x) => #<unspecific>
結果は(let ((x)) x) -> ERROR
そもそも私の使ってる実装にERROR値はないんです

ダミーの引数を受け取る名前付きletを書いてて
初期値を最初'()にしてたんですけど
'()よりも#<unspecific>のほうがいいかなと思って
深く考えずに実引数を省略してみたんです
その時はletがlambdaの派生式だってことを忘れてて
じゃあletがlambdaのマクロじゃないCLがどうなのかなと思って調べただけなんです

779:デフォルトの名無しさん
07/12/21 15:25:21
Makefileの文法が気に入らないので、
S式で書けるイカスmakeの代替プログラムがないかと思ってるんですが、
みなさんごぞんじないですか?

780:デフォルトの名無しさん
07/12/21 17:00:41
>>778
> そもそも私の使ってる実装にERROR値はないんです

仕様的に、エラーは値じゃなくて、
エラー状態にあることが、「通知(signaled)される」か、
通知が明記されてない場合は、推奨されないが無視していいんですよ。

エラーが無視された時に式の値が未規定(unspecified)である実装はありうるけど、
それは「エラー値」じゃないし、#<unspecific>とも限らないのです。
なんらかのオブジェクトである必要はあります。

通知される場合には、値を返さず、
トップレベルに復帰する実装が多いと思います。

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

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