CommonLisp Scheme Pa ..
596:デフォルトの名無しさん
04/10/04 00:01:51
URLリンク(www.google.co.jp)
URLリンク(www.google.co.jp)
597:デフォルトの名無しさん
04/10/04 00:06:59
URLリンク(www.google.co.jp)
URLリンク(www.google.co.jp)
598:デフォルトの名無しさん
04/10/04 00:09:11
>>596
その検索結果には明らかに>>593のガイルが含まれているよ
599:デフォルトの名無しさん
04/10/04 00:10:37
lisp ガイル 7件
lisp guile ガイル 3件
guile ガイル 303件
ノイズばっかだな
600:デフォルトの名無しさん
04/10/04 00:18:45
>>598
綴として読むのだからどのガイルでも良いと思う。
601:デフォルトの名無しさん
04/10/04 00:19:39
lispじゃ引っかかんないんじゃない?
scheme
602:デフォルトの名無しさん
04/10/04 00:22:03
gaucheよりguileの方がいいところって何?
603:デフォルトの名無しさん
04/10/04 00:22:52
gacuhe-gl のマンデルブロートのサンプルを実行したいんですけど
load するだけじゃだめですよね
実行して画面にだしたいんですけどどうやったらよいのでしょう?
604:デフォルトの名無しさん
04/10/04 00:22:56
URLリンク(www.google.com)
URLリンク(www.google.com)
605:デフォルトの名無しさん
04/10/04 00:23:08
>>602
GNUのお墨つき。
606:デフォルトの名無しさん
04/10/04 00:23:55
そこで Pika Scheme ですよ
607:デフォルトの名無しさん
04/10/04 00:58:37
>>585の凄まじい釣りっぷりで誰も>>584に答えていないので、
debianでapt-cache search schemeしてみた。
その中でscheme実行環境っぽいのを適当に
bigloo - A practical Scheme compiler
chicken - Simple Scheme-to-C compiler
drscheme - Scheme Programming Environment
elk - the Elk Scheme interpreter
escm - Embedded Scheme Processor
guile-1.6 - The GNU extension language and Scheme interpreter
mit-scheme - The MIT/GNU Scheme development environment
mzscheme - Rice University PLT Scheme Interpreter
oaklisp - An object-oriented dialect of Scheme.
rscheme - Threaded, persistent, OO, scheme interpreter and compiler
scm - A Scheme language interpreter.
scsh - A `scheme' interpreter designed for writing system programs
stalin - An extremely aggressive Scheme compiler
stklos - An efficient Scheme System providing a powerful Object System
gauche - A Scheme implementation designed for script writing.
沢山あるようなないような…
スクリプトならgauche,それ以外ならmzscheme,mit-scheme,scm,gaucheあたりが無難?
608:デフォルトの名無しさん
04/10/04 01:09:19
gimpとか
609:デフォルトの名無しさん
04/10/04 01:13:37
その中だとbiglooがよさそう
610:デフォルトの名無しさん
04/10/04 02:04:45
guileはGNU/LINUXならほぼ最初から入っているので、悪い選択じゃない。
611:デフォルトの名無しさん
04/10/04 02:08:11
>>610
貴様はguile使ったことあるのか?
guile常用してるやついるの?
何に使うのか知らんが。
612:デフォルトの名無しさん
04/10/04 02:27:24
scheme処理系一覧っぽいのが出てきたところでふと思い出したのですが、
リアルタイムで経緯をご存知の方がいたらYale Tがどんな末路を辿ったのか教えて
いただきたく。全然話題にも上らないんでマイナーな本なんだろうと思うけど
Slade先生のObject-Oriented Common LispでLisp使い始めたのでちと興味あり。
613:デフォルトの名無しさん
04/10/04 07:46:46
>>581
> CLOSで引数を2つ取るメソッドを定義した場合、
> それ以降は引数の数が異なる同名のメソッドの定義(オーバーロード)
> って不可能なのでしょうか?
ラムダリスト(引数リスト)が合同(congruent)のメソッドは一つのGeneric function
に共存できると規定されています。
required argumentの数が違う2つのラムダリストは合同とは言えません。
find-method, remove-method を駆使して、メソッドをgeneric functionからすべて削除
した後で、異なるラムダリストを持つgeneric functionを定義することは可能です。
(defmethod foo (a b &optional c))
としておくのはダメなの?
614:デフォルトの名無しさん
04/10/04 08:30:22
既に知ってるかもしれんが、T についての文書ってこれくらいしか知らんなあ。
Olin Shivers: History of T
URLリンク(store.yahoo.com)
615:デフォルトの名無しさん
04/10/04 23:28:40
>>307
UnCommon Web は継続渡しスタイルで書けてなかなかおもしろい。
616:デフォルトの名無しさん
04/10/05 09:34:36
Schemeで次のようなリストを生成したいのですが、
どういう手続きになるのでしょうか。
(define l '("a" "b" ("c" "c1" "c2")))
(define (foo l)
(?))
=> (list ("a" "b" "c" "c1")("a" "b" "c" "c2"))
617:デフォルトの名無しさん
04/10/05 09:53:24
>>616
(define l '("a" "b" ("c" "c1" "c2")))
(define (foo boo) `(list ,boo))
(foo l)
=> (list ("a" "b" ("c" "c1" "c2")))
618:デフォルトの名無しさん
04/10/05 12:32:40
>>616の質問も、>>617の回答も、まったく意味がわからんのは俺だけ?
619:デフォルトの名無しさん
04/10/05 13:07:29
俺も分からん.
620:デフォルトの名無しさん
04/10/05 13:39:12
>> 618,619
すいません。質問がまちがってました。やりたいことは、S式で表現
したディレクトリ構造から文字列を生成する、です。
(define l '("a" "b" ("c" "c1" "c2")))
(define (foo l)
(?))
=> ("a/" "a/b" "a/c/" "a/c/c1" "a/c/c2")
621:デフォルトの名無しさん
04/10/05 13:43:39
>>620
リストはディレクトリ。そのリストの先頭がディレクトリ名。
リスト内の2番目以降がファイル名。としています。
(define l '("etc" "hosts" ("apache" "httpd.conf" "httpd.conf.bak")))
622:(define (´∀`) 'マターリ)
04/10/05 14:09:14
(define (foo l)
(let loop ((dir "") (l l))
(if (list? l) (map (lambda (l) (loop (string-append dir (car l)) l)) (cdr l))
(string-append dir l))))
今思いついたのはこんなの。
623:(define (´∀`) 'マターリ)
04/10/05 14:20:57
(define (foo l)
(let loop ((dir "") (l l))
(if (list? l) (let ((dir (string-append dir (car l) "/")))
(cons dir (apply append (map (lambda (l) (loop dir l)) (cdr l)))))
(list (string-append dir l)))))
624:デフォルトの名無しさん
04/10/05 14:34:04
こんなもんか。(elisp)
(defun foo (tree prefix)
(cond ((null tree) nil)
((atom tree) (list (concat prefix tree)))
(t (let ((new-prefix (concat prefix (car tree) "/")))
(apply #'append
(list new-prefix)
(mapcar #'(lambda (file) (foo file new-prefix))
(cdr tree)))))))
と書いたところで、623 と被ってるじゃん。
625:デフォルトの名無しさん
04/10/05 14:50:25
>> 622 623
Gaucheを使ってます。このコードは何で動くのでしょうか。
>> 624
elispで動きました。gaucheのコードではどうなるのでしょうか。
626:デフォルトの名無しさん
04/10/05 15:14:42
>>625
やれやれ... それは君への宿題とするので来週までに解いてきたまえ。
それと、メール欄に sage と書きたまえ。
627:デフォルトの名無しさん
04/10/05 15:20:19
なんとかできました。(なんでsageって必要なんですか?2chよく知らないんです)
(define (foo tree prefix)
(cond ((not(pair? tree)) (list (string-append prefix (x->string tree))))
(else (let ((new-prefix (string-append prefix (car tree) "/")))
(apply append
(list new-prefix)
(map (lambda (file) (foo file new-prefix))
(cdr tree)))))))
628:(define (´∀`) 'マターリ)
04/10/05 16:52:09
(define (foo l)
(define (f x) (string-append (car l) "/" x))
(define (g x)
(if (list? x) (foo (cons (f (car x)) (cdr x)))
(list (f x))))
(cons (f "") (apply append (map g (cdr l)))))
>>625
全角スペースを取ればSCMで動いたよ。
622は失敗作。
629:デフォルトの名無しさん
04/10/05 22:06:35
>>614
Tについてのドキュメントって異様に少ないですよね。普通に失敗したプロジェクトだったの
でしょうか。
>>615
継続スタイルはUCWのウリみたいですが、フレームワークの他の部分はどんな感じですか?
副作用バリバリの手続きでHTML生成する設計になってたりしたらイヤかも。
beseのMLに開発者がポストしてましたが、パフォーマンスが気になるくらい遅いですか?
もう少し詳細な使用感を語っていただけるとうれしいです。参考にするので。
630:デフォルトの名無しさん
04/10/05 22:52:06
Tは失敗というか、誰もメンテしなかった・できなかった結果のような
386以降で書かれてたなら誰もが欲しかっただろうし
631:デフォルトの名無しさん
04/10/05 23:01:51
SICP を見ながら書いてみました。どうっすか?
(define (foo l)
(define (foo-iter result dir file)
(if (eq? file '())
result
(if (pair? (car file))
(let ((next-dir (string-append dir (caar file) "/")))
(foo-iter (append result (list next-dir))
next-dir
(cdar file)))
(foo-iter (append result (list (string-append dir (car file))))
dir
(cdr file)))))
(let ((dir (string-append (car l) "/")))
(foo-iter (list dir) dir (cdr l))))
632:631
04/10/05 23:11:19
間違ってた... かなり無理があるけど、これで当っているかな?
(define (foo l)
(define (foo-iter result dir file)
(if (eq? file '())
result
(if (pair? (car file))
(let ((next-dir (string-append dir (caar file) "/")))
(foo-iter
(foo-iter (append result (list next-dir))
next-dir
(cdar file))
dir
(cdr file)))
(foo-iter (append result (list (string-append dir (car file))))
dir
(cdr file)))))
(let ((dir (string-append (car l) "/")))
(foo-iter (list dir) dir (cdr l))))
633:デフォルトの名無しさん
04/10/05 23:12:35
(let ((next-dir (string-append dir (caar file) "/")))
(foo-iter (append result (list next-dir))
next-dir
(cdar file)))
(car file)の処理はこれでいいんだろうけど(cdr file)の分の処理がない。
634:デフォルトの名無しさん
04/10/05 23:17:32
(if (pair? (car file))の内側に(foo-iterがあるけど
(foo-iterの内側に(if (pair? (car file))を持っていったほうが
すっきりすると思う。
635:631
04/10/05 23:34:12
>> 633
まったく、おっしゃる通りでした。
>> 634
...暫く考える...
なるほど。なんとなくイメージできました。勉強になります。
他の人のと見比べるとやっぱり、map とかも勉強しないとだめですね。
636:デフォルトの名無しさん
04/10/06 00:45:10
>>631
SICPの何ページですか。俺の勉強したいので。
637:デフォルトの名無しさん
04/10/06 01:08:52
letrec fib=fn(n)return n<2?n:fib(n-1)+fib(n-2);
fib(30);
let fib2;
fib2=fn(n)return n<2?n:fib2(n-1)+fib2(n-2);
fib2(30);
let fib3=fn(f,n)return n<2?n:f(f,n-1)+f(f,n-2);
fib3(fib3,30);
638:631
04/10/06 01:26:58
>>636
そのものズバリ、というのはないのです。スマソ。
まだ LISP お勉強中なので教科書を見ながらでないと書けないと
いうことでして。
全体の構造は P.19 の脚注にある factorial から fact-iter を
呼び出し、fact-iter の末尾再帰でループ、というのを真似ています。
foo の内部で関数 foo-iter を定義し、foo-iter の末尾再帰で
各ディレクトリエントリ毎に反復になっています。
fact-iter での product が foo-iter での result に対応します。
ややこしいのはディレクトリエントリ毎の処理(下の foo-entry)で、
エントリがファイルの場合はそのファイル名を result リストに加える
だけなのですが、エントリがディレクトリの場合は result リストに
当該ディレクトリ以下の全てのファイル名を foo-iter で得て
result リストに加える必要があります。
(define (foo l)
(define (foo-entry result dir entry)
(if (pair? entry)
(let ((next-dir (string-append dir (car entry) "/")))
(foo-iter (list next-dir) next-dir (cdr entry)))
(list (string-append dir entry))))
(define (foo-iter result dir files)
(if (eq? files '())
result
(foo-iter
(append result (foo-entry result dir (car files)))
dir (cdr files))))
;; foo 本体
(let ((dir (string-append (car l) "/")))
(foo-iter (list dir) dir (cdr l))))
639:デフォルトの名無しさん
04/10/06 01:59:12
foo-entryにresultはいらんな。
640:デフォルトの名無しさん
04/10/06 02:05:50
foo 本体は(foo-entry 'hoge "" l)でいいな。
641:デフォルトの名無しさん
04/10/06 14:10:36
>>638
結局 (append result (foo-entry result dir (car files))) で
ディレクトリの深さ分スタック使うのだから
普通に再帰で書いたのに比べて何もメリットがなくない?
--
(define (foo l)
(if (string? l)
(list l)
(map (lambda (x) (string-append (car l) "/" x))
(cons "" (apply append (map foo (cdr l)))))))
642:デフォルトの名無しさん
04/10/06 14:14:09
スペースの変換を忘れてたorz
(define (foo l)
(if (string? l)
(list l)
(map (lambda (x) (string-append (car l) "/" x))
(cons "" (apply append (map foo (cdr l)))))))
643:631
04/10/06 23:21:02
>>639 >>640
確かにそうですね。
>>641
メリットは特にないですね。
高階関数に馴染みがなくてあれ以外の実装を
思いつかなかったというのが真相だったりします。
やろうと思えば引数を増やして全て末尾再帰にできるかも
しれませんが、やたら読みにくいソースになるでしょうね。
644:デフォルトの名無しさん
04/10/07 23:52:58
埋め込み言語の例というのが見てみたいんだけど,
onlisp 以外にもなにかありませんか?
645:デフォルトの名無しさん
04/10/08 00:21:31
>>644 これとか?
URLリンク(www.shiro.dreamhost.com)
これはちょっと埋め込みとはちがうけど、S 式で HTML を書くというアプローチ
URLリンク(cl-www.msi.co.jp)
URLリンク(cl-www.msi.co.jp)
646:645
04/10/08 00:28:51
あ、ちがった、埋め込み言語ってそういう意味じゃないのね。
たとえば Lisp/Scheme で書かれた LR パーザジェネレータとか。
腐るほどありそうだな。今、さっと見つかったのはこんなの。
URLリンク(www.informatik.uni-freiburg.de)
647:644
04/10/08 01:00:10
>>646
ども.
たしかに数はたくさんありそうなんですけど,うまく見つけられなくて.
ここのリンク先のはソースもあるんで,
schemeは使ったこと無いけど,本とにらめっこしながら読んでみます.
他にもいい例があればお願いします.
648:デフォルトの名無しさん
04/10/08 01:13:04
LISPはちょっとかじった程度でよくわかってないのですが
質問させてください
たとえば、Cでネットワークゲームを作るときに
なんか処理したかったら、適当なデータ構造に
情報を埋め込んで送信して、受信側でデータを解釈→処理
とかなりますよね
LISPのevalとかを使うと、プログラム本体がデータ構造もかねるから
動作させたい処理のS式をそのままリテラルとして送信して
eval させて動作させてしまう、とか出来るんでしょうかね?
649:デフォルトの名無しさん
04/10/08 01:54:37
Lisp に限らず、eval のある言語ならだいたいできるんじゃないのかな。
650:デフォルトの名無しさん
04/10/08 02:08:45
eval is evil.
651:デフォルトの名無しさん
04/10/08 07:33:19
でもそういう設計はよくないけどな。
ネットワーク越し(じゃなくても)で通信するときに相手から送られてくるものを
信用するというのは危険すぎる、ということを歴史は教えている。
652:デフォルトの名無しさん
04/10/08 08:02:59
>>651
アプレットやSOAPと基本は同じでしょ?
用はセキュリティーの確保の仕方の問題だと思われ。
653:デフォルトの名無しさん
04/10/08 09:32:56
>>648
evalも結局のところは、「受信側でデータを解釈→処理」してるだけ
なんだけどね。「解釈→処理」の処理系が最初から用意されていると
いうだけで。
汎用性が高い、本体と同じ言語で書ける、といった側面はそのまま
メリットにもデメリットにもなるし。
654:デフォルトの名無しさん
04/10/08 10:17:45
scheme の eval みたいに環境を指定できれば比較的手軽にセキュリティー確保できるね
655:デフォルトの名無しさん
04/10/08 11:19:34
shiro さんの2004.10.07の文章で、
URLリンク(www.shiro.dreamhost.com)
以前から Lisper としての適性に関係があるとして、時々話題になっている、
アスペルガー症候群・高機能自閉症の、簡易テストが紹介されている。
「平均は16.4ポイントで、 32ポイント以上のうち8割はautism related disorder
だそうだ。私(shiroさん)は31ポイントだった」そうです。
URLリンク(www.wired.com)
自分でやってみたところ、慎重に回答したのに38ポイントだった。
しかし自分はヘタレ Schemer。ぜんぜんLisp能力に比例して無いじゃん…。
656:デフォルトの名無しさん
04/10/08 12:14:36
このテスト、人間関係が苦手である、うまく行っていないという項目が多いな。
だから、
・ Lisper として能力が高い
→・他言語のプログラマとしても成功する
→・周囲から尊敬を集める
→・人間関係が良くなる
→・このテストのスコアが下がる
Lisper としての能力と、このテストのスコアには、こういう負の相関が
働いている気がするのだが。
657:デフォルトの名無しさん
04/10/08 12:48:17
心理テストに気休め以上の意味があるとは思わん。
658:デフォルトの名無しさん
04/10/08 17:18:30
>>655
辞書引きながらやってみた。 24ポイント。
微妙に低くてチョトくやしい (w
659:655
04/10/08 18:40:48
念のために言うけど、このテストはまったく当てにならないと思うよ。
『on Lisp』をいつまでも読み進められない私がそれは保証できる。
だけどなんとなく、ほかの人の点数も知りたいのう。
冷やかしでトライしてくれた人、他にもいたら書き込んでください。
おながいします。
660:デフォルトの名無しさん
04/10/08 19:26:09
34。Lisp は好きだけど能力があるのかどうか……
661:デフォルトの名無しさん
04/10/08 19:27:47
emacs で動く scheme 実行環境はありますか?
662:デフォルトの名無しさん
04/10/08 19:51:11
>>659
自閉症スペクトラムのテストとしてはそこそこいい出来だと思うが。
親戚男性自閉症率高の趣味の Schemer で、40点。非人間的なものへ
のこだわりと認識能力で点数が出て、直接 Lisp と関係があるわけ
じゃないから。
>>661
M-x run-scheme では不満?
663:655
04/10/08 20:08:14
>>662
自閉症スペクトラムについては、まあ同意です。
自閉症には私も興味を持って、いろいろ調べてみたことがあります。
「当てにならない」と書いたのは、Lisper としての能力と、このテストの関連。
>>661
思い切って guile-emacs を導入するのはどうだろう?
使ったことはないけれど。
664:デフォルトの名無しさん
04/10/08 20:08:44
>>656
・ Lisper として能力が高い
→・でも別にプログラマとしては成功しない
→・周囲からも尊敬は集めない
→・人間関係も良くならない
→・このテストのスコアが上がる
Lisper としての能力と、このテストのスコアには、こういう正の相関が(以下略)
665:デフォルトの名無しさん
04/10/08 20:41:18
感O しないで AC になれなかったので,
せめて lisp で AC に近づこうとしています.
これが妥当な lisp の用途ということでよろしいでしょうか?
666:655
04/10/08 21:32:01
それにしても、当然のように「自閉症スペクトラム」という言葉を使う人も、
やはりこのスレにはいましたか。ポイントも私より上だし。
>>664
私はプログラマとして才能がなかったんで、Lisp を覚えて「普通の奴らに差をつけ」
ようとしたんだけど、Lisper としても才能がなかった。
しかも副作用として、それまでは面白かった Java がつまらなくなってしまった。
自分はダメだったけど、Lisperとして成功できる人なら、他の言語でも成功するのかと
思っていたのに、まさか逆だというのですか?!
>>665
私は感電と Lisp の経験者だけど、現状は前述のとおり。
でもいいのだ。Lisp は面白いから。
きっと Lisp は、ただ面白いためにあるのだ。
才能はさておき、こういうことに興味を持つことには、自閉症傾向は関係が
あるような気がしなくもない。
667:デフォルトの名無しさん
04/10/08 21:59:47
ACよりもSEXPになりたい。
668:デフォルトの名無しさん
04/10/08 22:13:30
この自閉症どもが
669:デフォルトの名無しさん
04/10/08 23:13:31
>>667
sexp が t になるには 8 歳までに (ry
670:デフォルトの名無しさん
04/10/08 23:36:39
∩
( ゚∀゚)彡 sexp!sexp!
⊂彡
671:デフォルトの名無しさん
04/10/09 00:47:43
Lispの才能と体重は正比例の関係があるらしいよ
672:デフォルトの名無しさん
04/10/09 00:51:02
>>671
デブヲタ発見。
673:デフォルトの名無しさん
04/10/09 01:16:40
sexpと体重は正比例の関係があるらしいよ
674:デフォルトの名無しさん
04/10/09 09:57:46
「on Lisp」の日本語版があるって聞いたんだがその本の日本語名ってなに?
'on' も 'Lisp'も一般的すぎて検索してもよくわからない・・・
本じゃなくてどこかのWebページなのか?
675:デフォルトの名無しさん
04/10/09 10:00:05
>>674
>>544
676:デフォルトの名無しさん
04/10/09 10:00:29
>>674
>>544
677:674
04/10/09 10:14:44
おお、サンクス!!
スレの真ん中あたりにあったのか・・・
#こう書くべきかな? (thanx 675 676)
678:デフォルトの名無しさん
04/10/09 11:11:51
>>671
なんとなく,才能は体重の逆数にあるような.
0 Kgで発散しますが,CLHS には inf が無いのでちょっと分かりません.
679:デフォルトの名無しさん
04/10/09 11:55:07
Gauche(ver 0.8.1)でGauche-gtk(ver 0.4.1)
やってるんですけど、
(gdk-font-load)が未定義の値って言われちゃいます。
なんで?
680:デフォルトの名無しさん
04/10/09 11:55:38
まだ4kgもないうちの甥っ子は天性のlisperなのかしら
681:デフォルトの名無しさん
04/10/09 13:47:02
大人になると、才能は錆付くんだよ。
682:デフォルトの名無しさん
04/10/09 17:12:00
SRFI40: A Library of Streamsを読んでて違和感を感じたので、それを文に
してみた。schemeのプロミスの話。感想きかせて。
members3.jcom.home.ne.jp/t-yam/promiseless.html
683:デフォルトの名無しさん
04/10/09 17:25:23
ブラクラ?
684:デフォルトの名無しさん
04/10/09 17:26:36
>>682 いいんじゃない? そもそもR5RSはdelayが特定の「プロミス型」を
返すことを要求していないから、そこで必要な時に必要なだけforceされる
処理系も許されてるんじゃないかな。(delayの返す値は「プロミスである」
とされているだけで、それが具体的に何なのかは未定義。さらに、
「プロミスとそれがforceされた値とを区別することは規格内ではできない」
とされているから、プロミスなんてユーザには見えない、っていう処理系
もありと。)
個人的にはimplicit forceしてくれた方がずっとプログラマに易しいと
思う。R5RSでそうなっていないのは、色々な遅延評価メカニズムを実装する
ベースとしての処理系実装も許しているからなんじゃないかな。色々
試してみたいときにはforceされるタイミングを制御したいことも
あるんじゃない?
685:デフォルトの名無しさん
04/10/09 17:31:52
具体的なコードを挙げると説得力が増すぞ。
686:デフォルトの名無しさん
04/10/09 17:42:30
delay/forceが無駄な仕様にみえて仕方がない。
Schemeの思想と背反する様な。
実際使う事あるの?
687:デフォルトの名無しさん
04/10/09 17:46:52
くまああああああ
688:682
04/10/09 17:47:40
レスありがとう。
>>684
R5RSの注意すべき点は、プロミス型があるかどうかではなくてプロミスが
オブジェクトであること(R5RS 4.2.5)だと思う。それが根本的な問題かと。
> forceされるタイミングを制御したいことも
ありそうだよね、これ。ただ、必要になったときに強制されるのだ、という
方が純粋なcall-by-needに近いようにも思う。
>>685
リンクたどればあるよ。
689:デフォルトの名無しさん
04/10/09 18:13:49
>>674
"On Lisp"とかぐーぐるさまに教えると次の検索で少しは幸せになれるんではなかろうか。
690:682
04/10/09 18:25:58
再レス。
>>684
> プロミスなんてユーザには見えない、っていう処理系もありと
あなたの言ってることがわかったw
R5RSのforceの解説の最後の方にそう書いてあるのね。完全に見落としてた。
thx
691:デフォルトの名無しさん
04/10/09 19:11:42
forceはpromiseにしか適用できない(かもしれない)のに、
promiseであるかどうか判別する手段が無い(かもしれない)。
つまり完全に評価順序が分かっててpromiseと値を混在させないように
プログラムが書けるときしか使えない。
でも遅延評価ではあらかじめ評価順序を知るのは一般にはとても難しい。
実用性が全然ないような。(>>616をさえ遅延評価で書くのに挫折…)
692:デフォルトの名無しさん
04/10/09 19:29:32
>>691
forceは何にでも適用できるよ。それは保証されてる。
promiseであるかどうか判別する手段はないかもしれない。
693:デフォルトの名無しさん
04/10/09 20:04:18
>>692
どこに書いてある?
例えば
MIT Scheme
1 ]=> (force 1)
;The object 1, passed as an argument to force, is not a promise.
;To continue, call RESTART with an option number:
; (RESTART 1) => Return to read-eval-print level 1.
2 error>
694:692
04/10/09 20:48:54
あ、わりい。漏れの勘違い。
'may' だから、適用できるかどうかわからんのね。
なんだ、ますます使い勝手が悪いなあ。
695:デフォルトの名無しさん
04/10/10 02:59:20
>>691
関数的なもの、つまり副作用が無いものであれば評価順序に意味は無いはず。
そういうものと組み合わせてこそ promise の真価は発揮される。
一度評価したら二度目以降の force は必ず同じ値になるというのもそう。
とはいいつつも delay/force を使ったことないや。
696:デフォルトの名無しさん
04/10/10 17:26:47
>>695
> 関数的なもの、つまり副作用が無いものであれば評価順序に意味は無いはず。
間違い。それなら遅延評価なんて要らない。
そもそも副作用の話はしていない。>>691で言っているのは、
「評価順序が完全にわかってない場合、一度forceしてしまったものに
もう一度forceしてしまうことがあり、それがエラーになる(実装依存で)」
ということ。
697:デフォルトの名無しさん
04/10/10 17:46:22
何度 force しようが promise は promise のままでは?
force した結果の値を他で保持しておく必要無いんだし
698:デフォルトの名無しさん
04/10/10 18:25:57
691は「渡された値がpromiseかどうかわからないから念のためforceしとけ」
ってことができない、って言いたかったんじゃない?
>>695 正規順序と適用順序について調べるとよろし。
699:デフォルトの名無しさん
04/10/10 20:19:31
>>697
forceした結果を他の関数に渡さないと計算は進まないし、
delayし忘れると計算してしまう。
なにか自分でプログラミングしたら難しさがわかると思うけど。
自分が遅延評価のプログラムだと思うものをgoshで組んだ後
MIT Schemeにかけてそのまま動いたら、結構すごいことだと思うよ。
700:デフォルトの名無しさん
04/10/10 20:42:36
>>698
そうです。
全部promiseにしてしまえばいいのだろうけれど、
それには一から遅延評価の処理系を作るか、
それなりのライブラリを作った上で注意深くforce/delayを
利用しつつ目的のプログラムを作るか、
ということになって、どっちもかなりのオーバーヘッド。
すぐには計算して欲しくない所にだけ適当にdelayいれておいて後で
なんとかするというわけにはいかない。
701:デフォルトの名無しさん
04/10/10 21:07:36
>>655
微妙に訳が違ってないか?
Eighty percent of those diagnosed with autism or a related disorder
scored 32 or higher.
元訳:32ポイント以上のうち8割はautism related disorder
試訳: 自閉症やその関連の診断を受けた人の8割は、32ポイント以上だった。
つまりこれは、このテストが8割の診断者をカバーすると言ってはいるが、
普通の人がテストを受けて、スコアが高ければ自閉症だ、とは言っていないんじゃないか?
702:デフォルトの名無しさん
04/10/10 21:17:48
自閉症は黙ってろ
703:デフォルトの名無しさん
04/10/10 21:27:16
ACになろうとして
感電死
704:デフォルトの名無しさん
04/10/10 22:46:04
>>701
そのとおり。
つまり、テスト問題を
1 + 1 = 2 は正しいか?
にすれば、
Ninety nine percent of those diagnosed with autism or a related disorder
scored fully.
705:ミミ
04/10/11 16:57:33
Unicode (UTF-16) ベースの Scheme 処理系を作る場合、
R5RS の read-char 手続きは、ポートから 2 バイトを読み取って Unicode 文字を返すのが
自然ですよね?1バイト読み取りのためには read-byte のような拡張手続きを用意して。
既存コードとの互換性がなくなると思いますけど。。。
706:デフォルトの名無しさん
04/10/11 17:18:08
read-charとかの関数の他に読み込む文字種を指定できるといいんじゃないかな
(set-input-char-set 'ネコミミモード)
(with-input-char-set 'ネコミミモード
(read)
)
=>ネコミミモードでーす
とか
707:デフォルトの名無しさん
04/10/11 17:53:02
read-char は「文字」を返すだけで、それがどんなエンコードだとかどんなサイズであるかなどは R5RS では規定されていない
708:デフォルトの名無しさん
04/10/11 17:53:35
CMUCL は,C++ の .so を呼べないのでしょうか?
//////////////////// a.cc
int foo (int a, int *b)
{
int c;
c = *b - 10;
*b = a * 10;
return c;
}
////////////////////
# g++-3.4 -shared -o a.so a.cc
;;;;;;;;;;;;;;;;;;;; a.lisp
(use-package "ALIEN")
(use-package "C-CALL")
(load-foreign "./a.so")
(def-alien-routine "foo" int
(a int) (b int :in-out))
(foo 13 3)
;;;;;;;;;;;;;;;;;;;;
# lisp -load a.lisp -eval '(quit)'
とやると,(長いので分割)
709:708
04/10/11 17:56:00
; Loading #p"/xxxxx/a.lisp".
;;; Opening shared library ./a.so ...
;;; Done.
Undefined foreign symbol: "foo"
[Condition of type KERNEL:SIMPLE-PROGRAM-ERROR]
Restarts:
0: [CONTINUE] Return NIL from load of "a.lisp".
1: [ABORT ] Skip remaining initializations.
Debug (type H for help)
(KERNEL:UNDEFINED-FOREIGN-SYMBOL-ERROR-HANDLER "<error finding name>"
#.(SYSTEM:INT-SAP #x3FFFC7E8)
#<Alien (* #) at #x3FFFC480>
(14))
Source: Error finding source:
Error in function DEBUG::GET-FILE-TOP-LEVEL-FORM: Source file no longer exists:
target:code/interr.lisp.
0] (quit)
710:デフォルトの名無しさん
04/10/11 18:58:09
a.soのシンボルをリストアップしてみりゃわかるよ
711:708
04/10/11 19:20:52
>>710
はじめてナノメートル nm しました.
うまくいきました! ありがとうございます.
今から >>710 に萌えます (;´Д`)
gcc で作ったやつと比較して,トンでもないシンボル名になっていました.
でもその名前で lisp コードに書き,アンダーバー `_' をハイフン `-' に変えて
使ってみると,正常に動きました.
シンボル名が変にならないようにする方法はこれから調べます.
712:デフォルトの名無しさん
04/10/11 19:35:31
>>705 see srfi-56
713:デフォルトの名無しさん
04/10/11 22:27:42
call-with-current-continuationについて教えてください.
多分誤解しているのだと思います.
たとえば,
(call/cc (lambda (k) (* 20 (k 30))))
=> 30
になると思います.
これを,
「kというprocedureがactiveになった時点で,それに
渡されるべき30という引数が返されたのである」と
理解していましたが,これは誤りなのでしょうか?
この考え方をもって既存のコードを読むと,実際に
返される値と異なる結果になってしまいます.
どこがいけないか,ご指摘願えますでしょうか.
よろしくお願いいたします.
714:デフォルトの名無しさん
04/10/11 22:55:04
kという手続きがxを引数に呼び出されると、
対応するcall/ccの返却値としてxが戻される。
もちろん後続の処理もcall/ccが普通に戻った場合と同じように続く。
715:デフォルトの名無しさん
04/10/11 23:08:44
>>713
「procedureがactiveになる」ってどゆこと?
716:デフォルトの名無しさん
04/10/11 23:24:50
>>713
Gaucheでの出力だけど...
(define m '())
(list 1 2 3 (call/cc (lambda (k) (set! m k))) 4 5 6)
--> (1 2 3 #<subr continuation> 4 5 6)
m
-->#<subr continuation>
(m 999)
--> (1 2 3 999 4 5 6)
(list 1 2 3 (+ 100 (call/cc (lambda (k) (set! m k)))) 4 5 6)
--> 継続と100は足せないというエラー
(list 1 2 3 (+ 100 (call/cc (lambda (k) (set! m k) 100))) 4 5 6)
--> 1 2 3 200 4 5 6
(m 500)
-->1 2 3 600 4 5 6
つまり継続を呼び出すときの引数でそれを作った(call/cc ...)が丸ごと置き換わると考えるととりあえずよいかもしれない。
うまい説明になってないかな^^?
(list 1 2 3 (+ 100 (call/cc (lambda (k) (set! m k)))) 4 5 6)
--> 継続と100は足せないというエラー
(list 1 2 3 (+ 100 (call/cc (lambda (k) (set! m k) 100))) 4 5 6)
--> 1 2 3 200 4 5 6
(m 500)
-->1 2 3 600 4 5 6
つまり継続を呼び出すときの引数で(call/cc ...)が丸ごと置き換わると考えるととりあえずよいかもしれない。
あまり説明になってないかな^^?
717:デフォルトの名無しさん
04/10/11 23:26:16
>> 715
713です.
「procedureが呼び出される」に訂正.
>> 714
ありがとうございます.
ということは根本的に間違えた考えではないと理解して,
コードを追い直しています.
718:716
04/10/11 23:27:55
書き込みの途中に継続を呼んでしまったようだ... ごめん m(_ _)m
719:デフォルトの名無しさん
04/10/11 23:45:56
>> 716
ありがとうございます.
実際に追っているコードを示した方が早いので,そうします.
たとえば,Kent Dybvig プログラミング言語Scheme (日本語版)
p.61に,call/ccのサンプルとして
(let ((x (call/cc (lambda (k) k))))
(x (lambda (ignore) "hi")))
=> "hi"
というのがありますが,これは結局
(call/cc (lambda (k) k) (lambda (ignore) "hi"))
と等価(でよいのでしょうか)ですね.
この式内の引数 (lambda (ignore) "hi")はprocedure
だから,答は本にあるように "hi" じゃなくて,その
procedure自体(#<user-defined-function> みたい)
になると思うのです.
しかし確かにguileなどでは本の通り "hi" と出ます.
問題はこのprocedure自体を返すのか,evalった結果を
返すのかの違いにあるのだと思いますが、「eval忘れ」
がどこかにあるのでしょうか?
ちなみに kawa ではエラーとなり確認できません.
720:デフォルトの名無しさん
04/10/11 23:47:02
>>711
>シンボル名が変にならないようにする方法はこれから調べます.
そいつはC++を使ってる限り無理だ。関数の多重定義を実現するために、
シンボルには型情報がくっつくようになってる。
721:デフォルトの名無しさん
04/10/11 23:47:17
継続(continuation)のメモ
URLリンク(www.opengroupware.jp)
722:デフォルトの名無しさん
04/10/12 00:03:24
719 です.
>問題はこのprocedure自体を返すのか,evalった結果を
>返すのかの違いにあるのだと思いますが、「eval忘れ」
>がどこかにあるのでしょうか?
は間違いですね。
問題はこのprocedure自体を返すのか,呼び出した結果を
返すのかの違いにあるのだと思いますが、「呼び出し忘れ」
がどこかにあるのでしょうか?
の意味です。
723:708
04/10/12 00:04:17
>>720
なんと,,,そうですか.今ちょっと調べ疲れていたところでした.
どうもありがとうございました.
まあ lisp コードなんてすぐ修正できてしまうからいいんですよね!
724:デフォルトの名無しさん
04/10/12 00:13:42
>>719
最初に (x (lambda (ignore) "hi")) を評価するとき x は継続であり、それは
「最初の (call/cc (lambda (k) k))」から戻ってきて、返却値を x に bind し、let の body を評価する」
という継続である。
なので、これを評価すると最初の (call/cc (lambda (k) k)) から (lambda (ignore) "hi") が返却され、
これが x に bind され、(x (lambda (ignore) "hi")) が再度評価されることになる。
二度目に評価されるとき、x には (lambda (ignore) "hi") が bind されているので、これはつまり
((lambda (ignore) "hi") (lambda (ignore) "hi"))
ということになり、最終的に "hi" が返却される。
725:デフォルトの名無しさん
04/10/12 00:34:47
訂正
719の中の置換したコードは
((call/cc (lambda (k) k)) (lambda (ignore) "hi"))
のつもりでした.
>>724
ありがとうございます.最終的に
((lambda (ignore) "hi") (lambda (ignore) "hi"))
に置換されるのがミソのようですね.
まだまだSchemerになれていないので,724をなぞって
ゆっくり考えます.ありがとうございました.
726:デフォルトの名無しさん
04/10/12 01:59:29
>>723
extern "C" {
ネコミミモード
};
727:716
04/10/12 02:43:54
おれが安易に「丸ごと置き換わると考えるととりあえずよいかもしれない」なんて書いちゃったのは良くなかった。ごめんなさい m(_ _)m
置換で考えると上手くない場合もあるんだ。
例えば、
(let ((c 100))
(let ((x (call/cc (lambda (k) k)))) ;<- @1
(let ((c 200))
(x (lambda (n) (+ 1 c)))))) ;<- @2
--> 201
の (call/cc (lambda (k) k)) を単純に (lambda (n) (+ 1 c))に置き換えて考えてしまうと
(let ((c 100))
(let ((x (lambda (n) (+ 1 c))))
(let ((c 200))
(x (lambda (n) (+ 1 c))))))
--> 101
となって結果が合わなくなってしまう。
これは@2のlambdaで作られた#<closure>は@1に送られるけど、その環境は@2を持っているということが単純な置換で考えると消えてしまうからなんだ。
というわけで、716は忘れてください ^^;
728:デフォルトの名無しさん
04/10/12 09:57:42
スコープだけじゃないね。
(let ((x 0))
(let ((c (call/cc (lambda (x) x))))
(set! x (+ x 1))
(c (lambda (y) x))))
と
(let ((x 0))
(let ((c (lambda (y) x)))
(set! x (+ x 1))
(c (lambda (y) x))))
はちがうし。
あたかも置き換えたかのようにジャンプするというか・・・。
729:デフォルトの名無しさん
04/10/12 20:10:09
713です.
多くの丁寧な follow-up をありがとうございます.
call/ccはSchemeらしいところだと思うのですが
それだけ奥が深いですね.
何せ midnight programmer なものですから,
これから寝るまで頭をひねって考えます.
今後ともよろしくお願いします.
730:デフォルトの名無しさん
04/10/12 20:27:57
schemeの継続って、プログラムの最小限要素をくくりだすのはいいが
そのためにやたらコストの高いものを導入してしまったという感じがする。
Smalltalkでの何でもかんでもオブジェクトとメッセージに近いものがある。
継続そのものが便利なときもあるけど、なくてもほとんど困らない。
731:デフォルトの名無しさん
04/10/12 20:31:45
継続抽出は銀の弾丸です
732:デフォルトの名無しさん
04/10/12 20:44:17
ほんとにそうなら継続のある言語がとっくに天下をとってると思う。
733:デフォルトの名無しさん
04/10/12 21:44:11
悪い方が良い法則。
734:デフォルトの名無しさん
04/10/12 22:35:38
おまえらただ継続継続いいたいだけちゃうんかと。
継続なんて極力使わない方がいい。
gotoがよりパワフルにそしてわかりにくくなったものだから。
銀の弾丸どころかソフトウェアエンジニアリング的には狼男だ。
735:デフォルトの名無しさん
04/10/12 22:39:36
例外処理のような上手い使い方ならいいんだけどね
736:デフォルトの名無しさん
04/10/12 23:02:34
ちんちんかゆいーー!
737:デフォルトの名無しさん
04/10/12 23:03:46
gotoが悪ならthreadなんて巨悪だな
738:デフォルトの名無しさん
04/10/12 23:04:48
>>736
cut しろ
739:デフォルトの名無しさん
04/10/12 23:35:23
>>737
threadとgotoは比べるもんじゃないだろ。
threadは基本的に代えがきかない。
740:デフォルトの名無しさん
04/10/13 03:12:19
The Seasoned Schemerの継続の説明らしい章を読んでます。
で、質問なんですが、この本の中では継続を「call/cc」じゃなくて
「letcc」(schemeの場合)、「throw」「catch」(CommonLispの場合)で
説明してるんですけど、これらは等価なものなんですか?
741:デフォルトの名無しさん
04/10/13 03:30:06
>>740
shiroさんのなぜ Scheme には return がないのか
URLリンク(www.shiro.dreamhost.com)
を読むとその辺がわかるかも。
742:デフォルトの名無しさん
04/10/13 10:25:44
continuationとgotoは比べるもんじゃないだろ。
continuationは基本的に代えがきかない。
743:デフォルトの名無しさん
04/10/13 14:30:21
はっきり言って、continuation≒gotoだよ。認めたくないだろうけどね。
gotoでcontinueもbreakもreturnも出来るじゃん、美しい!って悦に入ってるのが
schemer
744:デフォルトの名無しさん
04/10/13 16:12:52
だがそれがいい
745:デフォルトの名無しさん
04/10/13 16:21:01
>>742
おうむ返しだけだと馬鹿にしか見えませんよ。
continuationはやろうと思えばいくらでも書き換えられる。
書き換えたらフラグだらけになったり、
巨大な関数になったりしてして醜いから、使う、というものでしょ。
もちろんそういうときに使うのはいいけど、
できるときはwhileとかforとかmacroにしたほうがいいだろう。
threadはthreadを使わずに同じ機能を実現することが難しい。
特にthreadのどれか一つが死んだりしても他のthreadが監視しておいて
処理できる、という能力はエミュレートできない。
エミュレートだとスケジューリングがうまくいくように一単位の
処理時間をコントロールできないといけないし。
746:デフォルトの名無しさん
04/10/13 21:25:49
ケイゾクに恨みでもあるんですか?
747:デフォルトの名無しさん
04/10/13 21:57:42
色んな意味でコストがかかるところ。
748:デフォルトの名無しさん
04/10/13 22:54:32
>>746 ないけど?
749:デフォルトの名無しさん
04/10/14 00:13:10
threadだって高速に処理切り替えてるだけだから、
gotoで出来ないことはない。
750:デフォルトの名無しさん
04/10/14 00:39:00
スレッドと継続は全く別個の独立した概念であり、対立するものでもないのに何をムキになってるんだろう。
> 書き換えたらフラグだらけになったり、
> 巨大な関数になったりしてして醜いから、使う、というものでしょ
それこそ継続という概念が primitive なものであるということであり、scheme らしいところでは?
primitive なものさえあれば他の機能はそれらを組み合わせてできる。美しい。
例えば、コルーチン程度であれば call/cc で簡単に実現できる。
751:デフォルトの名無しさん
04/10/14 00:54:20
コルーチン程度しかできない、の間違いでしょ
752:デフォルトの名無しさん
04/10/14 01:06:04
Rubyの継続の実装はスレッドと同じだそうですよ
URLリンク(i.loveruby.net)
753:デフォルトの名無しさん
04/10/14 01:44:06
>>749
gotoでどうやって
> 特にthreadのどれか一つが死んだりしても他のthreadが監視しておいて
> 処理できる、という能力はエミュレートできない。
するんだ?
そしてどうやって一つの処理単位がCPUタイムを食いすぎないことを保証するんだ?
> エミュレートだとスケジューリングがうまくいくように一単位の
> 処理時間をコントロールできないといけないし。
>>750
> スレッドと継続は全く別個の独立した概念であり、対立するものでもないのに何をムキになってるんだろう。
じゃああなたが>>737や>>749を説得して上げてください。
754:デフォルトの名無しさん
04/10/14 01:45:11
gotoさえ使えば、breakもcontinueもreturnもいらないのはもちろん、
スレッドも関数もいもいらない。こういう機能はgotoを組み合わせてできる。
美しい。
755:デフォルトの名無しさん
04/10/14 01:53:27
>>750
美しかろうがどうだろうが、
「継続を無闇に使うべきでない」という事実には変わりはないな。
756:デフォルトの名無しさん
04/10/14 01:54:45
アセンブラにすりゃただのジャンプ命令。
ジャンプ命令使わずにアセンブラでプログラム組めるわけが無い。
即ち、息をするようにgotoを使え。
757:デフォルトの名無しさん
04/10/14 04:40:12
引数つきgoto
758:デフォルトの名無しさん
04/10/14 08:16:21
〉〉753OSやリアルタイム制御の本みれば書いてあるよ。つーか知らないの?
759:デフォルトの名無しさん
04/10/14 08:28:20
ヘタレLisperと本物のプログラマを隔てるOSという一つの壁
760:デフォルトの名無しさん
04/10/14 08:29:07
>>736-738
Prologの話?
761:デフォルトの名無しさん
04/10/14 09:24:37
まだちんちんかゆいよーー!
なぜか皮が膨らんできてる・・・
762:デフォルトの名無しさん
04/10/14 11:39:34
>>751
ユーザモードのスレッドは、本質的にはコルーチンと同等だけど?
763:デフォルトの名無しさん
04/10/14 16:06:08
コルーチンって何?
次ページ最新レス表示スレッドの検索類似スレ一覧話題のニュースおまかせリスト▼オプションを表示暇つぶし2ch
5065日前に更新/286 KB
担当:undef