CommonLisp Scheme Part11at TECH
CommonLisp Scheme Part11 - 暇つぶし2ch478:ミミ
04/09/24 18:46:38
こんにちは。
昨日は遅くまでありがとうございます。
細かい議論はあるかもしれませんが、
おおまかなアイデアは理解していただけたようですね。

私は部分継続を行いたいのではなくて、
コールバックの検問所を作りたいということです。
図にまとめてみました。

479:ミミ
04/09/24 18:47:08
■従来のコールバックの実装

┌─┐
│ │ ┌──┐
│ │ ┌┘ │
│ CbA├─┘ │
OS │ ├─┐ ContA │
側 │ │ └┐ │
│ │ └──┘
│ │ ┌──┐
│ │ ┌┘ │
│ CbB├─┘ │
│ ├─┐ o--───ここから ContA を呼ぶと
│ │ └┐ │ CbA から出て行ってしまう。
└─┘ └──┘ これは破綻する。


480:ミミ
04/09/24 18:47:28
■検問所式コールバックの実装

┌─┐
│ │
│ │ CbA ┌───┐
│ │ ┌─┘ │
│ ├─┼─┐ ContA │
OS │ │ │ └───┘
側 │ ⇔ │
│ │ │ ┌───┐
│ ├─┼─┘ │
│ │ └─┐ o--─── ここから ContA を呼んでも
│ │ CbB └───┘ OS 側に正しく戻ってくれる。
│ │
└─┘


コールバックは必ず検問所(⇔)を通して呼び出されるし、
検問所を通して戻る。検問所を通して戻るときは、
必要があればスタックの回復を行ってくれる。
したがって、Scheme 側では継続とコールバックの関係を
気にしなくてよい。

481:ミミ
04/09/24 18:49:37
■従来のコールバックの実装

┌─┐
│ │ ┌──┐
│ │ ┌┘ │
│ CbA├─┘ │
OS │ ├─┐ ContA │
側 │ │ └┐ │
│ │ └──┘
│ │ ┌──┐
│ │ ┌┘ │
│ CbB├─┘ │
│ ├─┐ o--───ここから ContA を呼ぶと
│ │ └┐ │ CbA から出て行ってしまう。
└─┘ └──┘ これは破綻する。


482:ミミ
04/09/24 18:50:32
あれれ、うまく表示されませんねぇ。。。

483:ミミ
04/09/24 18:54:26
■従来のコールバックの実装

┌─┐
│ │ ┌──┐
│ │ ┌┘ │
│ CbA├─┘ │
OS │ ├─┐ ContA │
側 │ │ └┐ │
│ │ └──┘
│ │ ┌──┐
│ │ ┌┘ │
│ CbB├─┘ │
│ ├─┐ o--───ここから ContA を呼ぶと
│ │ └┐ │ CbA から出て行ってしまう。
└─┘ └──┘ これは破綻する。


484:デフォルトの名無しさん
04/09/24 18:55:39
もういいよ・・・
なんとなくわかったから

書き込みの練習は専用板があるからそっちでやってくれ
URLリンク(aa5.2ch.net)

485:デフォルトの名無しさん
04/09/24 19:18:16
だから、具体的にどういう場面で使いたいのよ?
それは継続でなければならないのか?

486:デフォルトの名無しさん
04/09/24 19:20:13
UNIXっぽくない用途だって。

487:ミミ
04/09/24 19:31:23
>>485
> だから、具体的にどういう場面で使いたいのよ?

今のところ、特に使い道というものは考えていないです。

コールバック ベースの Scheme コードを書く場合、
Gauche のように継続に何らかを制限をつけるという方法もありますが、
検問所方式で常に安全を確保するという方法もあるのでは、
というだけです。

もう少しアイデアを膨らませたら、何か面白いことができるかもしれません。
Scheme 実装を書きながら、おいおい考えたいと思っています。


488:デフォルトの名無しさん
04/09/24 19:35:08
案の定何も考えてないのに非現実的なものを想定して時間を無駄にしてただけかよ
アホくさ

489:ミミ
04/09/24 19:37:58
>>448
そんなことはありませんよ。
どんな小さなアイデアも、大きな発明に結びつく可能性があるって、
どこかの発明家が言っていましたよ。

Windows 専用 Scheme で実現したい機能とかありましたら、
みなさんのご意見もお聞きしたいです。
面白そうだったら実装したいと思います。

490:デフォルトの名無しさん
04/09/24 19:52:13
RS232Cに継続ベースで送受信

491:ミミ
04/09/24 19:57:05
> RS232Cに継続ベースで送受信

ええ?これはどういうことですか?

492:デフォルトの名無しさん
04/09/24 19:58:21
なぜかここって学習能力のないUNIX知障が常駐してるね。
何故?
ここには何もありませんよ~?

493:デフォルトの名無しさん
04/09/24 20:03:36
「知障」だの「全部間違ってる」だの言うだけで具体的なことを
何一つ言えない威勢のいいやつが一人居るなw

おれ? まあ、おれもそうかな・・・

494:デフォルトの名無しさん
04/09/24 20:09:03
>>489
そういうのは、まずできることをやってから言うもんだよ。
技術的知識やノウハウがなきゃ、せっかくのアイデアもその価値を正しく見極めることができず、
多大な時間とコストをかけて実装したのに実はもっと簡単でいい解法があった、なんてことになりかねない。
そうでなくても、モノが無いのに口先だけの人が好かれやすいとは思えないし。

495:デフォルトの名無しさん
04/09/24 21:00:54
>>494 いいじゃん。いずれ実装が出れば白黒はっきりつくんだしさ。
実装がなきゃ評価できないってんなら黙ってればいい。
漏れは、>>480 で言っているのが部分継続とどう違うのか
よくわからないんで、これ以上はコードで説明してもらいたい
(仮想OSを使ったSchemeコードで構わない) と思うけど。

コールバックで捕まえる継続は、検問所までの部分継続だと
するだけでちゃんと動くんじゃないの、ってことね。



496:デフォルトの名無しさん
04/09/24 21:18:25
>>480
URLリンク(www.ipsj.or.jp)
これがズバリかな?
個人的には,
> Scheme 側では継続とコールバックの関係を気にしなくてよい
とは思えない.
完全な継続とコールバックまでの部分継続が暗黙のうちに
すり替えられるのはこわい…というか,常に意識していなければ危険だと思う.
call/ccとは別の名前で実装するんなら問題ないかな?

>>495
コールバック時に暗黙に行うって所がポイントなんじゃない?
俺は上述のようにデメリットが大きいと思うけどね.

497:デフォルトの名無しさん
04/09/24 22:44:16
キャッチコピーとしては魅力を感じます

498:デフォルトの名無しさん
04/09/24 22:53:39
cygwin で gauche-gl のインストールに成功した人
いませんか?
glut

499:デフォルトの名無しさん
04/09/24 22:56:29
glut 関連の関数が解決できずにmake が失敗します

500:デフォルトの名無しさん
04/09/24 23:09:41
そういや昔glutのインターフェースが無茶苦茶いいかげんな事に
気付いて使う気なくしたんだった。

501:デフォルトの名無しさん
04/09/24 23:20:57
ここを見る限りだと成功している人がいるみたいなんだけど・・・
やり方がわからん
URLリンク(www.kauda.jp)

502:デフォルトの名無しさん
04/09/25 05:41:27
>>499
うちでも普通に入ったけど。
glutはインストールしてある?
標準以外の場所に入ってたら、configureに--with-glut
オプションが必要かも。

503:デフォルトの名無しさん
04/09/25 09:13:43
>>498
成功してます
$ ln -s /usr/include/GL /usr/include/GLUT
$ ./confiugre --without-x
でいけるはず.


504:498
04/09/25 11:28:34
最近のcygwinはGLUTが最初から入っていると
いうことなのでGLUT.hを検索すると色々なディレクトリに
入っていてどこがどこやら・・・
見つかったディレクトリは

c:/cygwin/usr/include/FL
c:/cygwin/usr/include/mingw/GL
c:/cygwin/usr/X11R6/include/GL

GLUTはcygwinのsetup.exeからダウンロードした時点では
まだインストールされていない?のでしょうか

505:デフォルトの名無しさん
04/09/25 12:43:57
>>504
OpenGLパッケージをインストールすれば入ってくるが。

506:デフォルトの名無しさん
04/09/25 18:22:47
こういう話はうまくいったバージョン書いてくれないとダメなんじゃない?
まあcygwinて適当なftpから適当なバージョンのアーカイブ引っ張ってくるから
うまくいく組み合わせの特定ってかなり難しいとは思うけどね。
つまりcygwinで同一環境にするにはインストールログが必要なわけ。
こんなシステムだからcygwinは不安定って言われるのさ。


507:デフォルトの名無しさん
04/09/25 18:53:06
\   ∩─ー、    ====
  \/ ● 、_ `ヽ   ======
  / \( ●  ● |つ
  |   X_入__ノ   ミ   そんなエサで俺様がクマ―!!
   、 (_/   ノ /⌒l
   /\___ノ゙_/  /  =====
    〈         __ノ  ====
    \ \_    \
     \___)     \   ======   (´⌒
        \   ___ \__  (´⌒;;(´⌒;;
          \___)___)(´;;⌒  (´⌒;;  ズザザザ
                       (´⌒; (´⌒;;;

508:498
04/09/25 20:28:31
>>506
色々試行錯誤したんですが、上手くいきませんでした
OpenGLのバージョンを落とさないといけないっぽいことは
わかったのですが・・・
力尽きました

509:デフォルトの名無しさん
04/09/25 23:57:34
なんかcygwinのgaucheって不安定じゃない?
何かすぐにフリーズする

510:デフォルトの名無しさん
04/09/26 00:36:44
coLinuxを使えば?

511:デフォルトの名無しさん
04/09/26 01:14:43
それって解決になってない気が。
それよりVC++やMingwで動かす話があったはずだけど。

512:デフォルトの名無しさん
04/09/26 03:55:19
>>511
gauche-gl の話しでしょ?
もしかして VC++で使えるって話し?

513:デフォルトの名無しさん
04/09/26 04:26:56
511ではないが、cygwinではなくてMingwで動かす話がある。
あまりうまくいっていないようなので、やるなら自分でやった方がよいかも。

514:デフォルトの名無しさん
04/09/26 05:20:39
("root"
("usr" "aaa.txt" "bbb.txt"
("bin" "perl" "ruby" "gosh")
))

ディレクトリ構造をS式で表したいのですが、上のように
「リストの最初にディレクトリ名をおく」というのを考え
ました。もっといい方法ってありますか?

515:デフォルトの名無しさん
04/09/26 05:29:30
carはディレクトリ名、cdrはそのディレクトリの要素、でどう?
cdrは、listだったときはディレクトリ、atomだったらファイル名。

("etc" ; /etc/
 "fstab" ; /etc/fstab
 "passwd" ; /etc/passwd
 ("namadb" ; /etc/namedb/
  "named.conf" ; /etc/namedb/named.conf
  "named.root")) ; /etc/namedb/named.root

とか

516:515
04/09/26 05:31:02
あ、よくみたら同じことやってる、おれってばか(;´Д`)
もう寝ます…

517:ミミ
04/09/26 06:07:28
>>514
UNIX だけならそれでいいと思う。
Win だとドライブ名がないとだめだね。

("/" "C:" "WinNT" . "Notepad.exe")

絶対パスと相対パスはどう区別するのかな。

518:ミミ
04/09/26 06:09:13
あ、勘違い。
パスを表すんじゃなくって、
ディレクトリ構造を表すんですね。

519:デフォルトの名無しさん
04/09/26 06:32:49
>>515 >>517
ありがとう。絶対パスなので、上の方法で扱ってみます。

次は要素を探索して、その絶対パスを返す手続きです。でも
gaucheのfindあたりでいけそうですね。調べてみます。


520:デフォルトの名無しさん
04/09/26 21:55:24
PLTSchemeで.net を使えるそうなのですが・・・
URLリンク(www.rivendell.ws)
これって使うプロジェクトの直下において
使えばよろしいの?
というかmzSchme,PLT Scheme DrScheme って
なんで名前が3つあるんですかね?関係性が
わからないんですけど・・・

521:ミミ
04/09/26 23:29:19
>>529
> mzSchme,PLT Scheme DrScheme って
MzScheme は Scheme 実装のコア部分
DrScheme は統合開発環境
PLT Scheme は全体の総称かな。たぶん。

522:デフォルトの名無しさん
04/09/26 23:32:42
>>521
お前のキーボードにテンキーついてないだろ

HHKだから俺のにもついてないけどさ

523:ミミ
04/09/26 23:38:14
え、なんか鋭いですね。。。
探偵さんですか。。。

524:デフォルトの名無しさん
04/09/27 00:21:38
>>521
そういうことですか、サンクス。

>>522
え、なんでそうなるの?

525:デフォルトの名無しさん
04/09/27 00:26:56
ふつーは数字入力でわざわざテンキーまで手をのばしたりしないよ。

526:デフォルトの名無しさん
04/09/28 10:43:06
ふつーはレス番号を直接入力したりしないよ。


527:デフォルトの名無しさん
04/09/28 11:15:44
ふつーの人は2ちゃんねるなんてやらないよ

528:デフォルトの名無しさん
04/09/28 20:13:20
ふつーのひとはLispなんてやらないよ。

529:デフォルトの名無しさん
04/09/28 20:59:04
普通のやつらの上を行け

530:デフォルトの名無しさん
04/09/28 22:39:02
そんな実力はありません

531:デフォルトの名無しさん
04/09/29 04:52:42
(ノーマル? 普通のやつ) ; => #t
(ノーマル? (上 普通のやつ)) ; => #f
(ノーマル? (下 普通のやつ)) ; => #f
(アブノーマル? 普通のやつ) ; => #f
(アブノーマル? (上 普通のやつ)) ; => #t
(アブノーマル? (下 普通のやつ)) ; => #t

(equal? (上 普通のやつ) (下 普通のやつ)) ; => ?


532:デフォルトの名無しさん
04/09/29 04:55:37
(ノーマル? 普通のやつ) ; => #t
(ノーマル? (上 普通のやつ)) ; => #f
(ノーマル? (下 普通のやつ)) ; => #f
(アブノーマル? 普通のやつ) ; => #f
(アブノーマル? (上 普通のやつ)) ; => #t
(アブノーマル? (下 普通のやつ)) ; => #t

(equal? (上 普通のやつ) (下 普通のやつ)) ; => ?



533:デフォルトの名無しさん
04/09/29 07:15:56
だが気を付けたまえ

534:デフォルトの名無しさん
04/09/29 23:24:51
アブノーマルの行きつく先はAranskだ

535:デフォルトの名無しさん
04/09/29 23:54:01
MIT Schemeというので自作のDLLを呼びたいのですが
なかなかそういうサンプルソースが見つかりません
FFIとかで検索してみたのですが、なんか良いサンプル
ないですかね?付属のドキュメントは何か概要ぐらいしか
書いていない感じなんです



536:ミミ
04/09/30 00:31:23
このサンプルは見ました?

(define set-window-title
(windows-procedure
(set-window-text (window hwnd) (text string))
bool user32.dll "SetWindowText"))

(set-window-title my-win "Hi")
=> #t
;; Changes window's title/text

537:デフォルトの名無しさん
04/09/30 01:04:39
>>536
見ました
それだけみてもよくわかんないんです
そもそもエラーが出るし・・・
;Syntactic keyword may not be used as an expression: define
とか

538:デフォルトの名無しさん
04/09/30 23:51:48
いつのまにかgaucheがmingwでコンパイルできるようになっとる。
前はできんかったのに。mingwをバージョンアップしたからだろうか。(--;

539:デフォルトの名無しさん
04/10/01 00:12:12
shiroさんが業を煮やしてちょこっと進めた

540:デフォルトの名無しさん
04/10/01 02:09:58
おぉーーー

541:デフォルトの名無しさん
04/10/01 08:56:57
ACLってVisualStudioより高いですか。
ぐぐってもわからないってことは、相当な値段でしょうけど、、

542:デフォルトの名無しさん
04/10/01 10:32:44
>>541
前スレからコピペ。
----------------------------------------------------


715 :デフォルトの名無しさん :04/06/28 23:09
ACL アカデミックとかじゃなくて普通に商用に使うために買うといくらするの?


716 :デフォルトの名無しさん :04/06/29 02:30
このスレの Part 8 で紹介されていた URL に $599 という価格があるんだけど、
URLリンク(www.franz.com)

これって、アカデミック・ディスカウントなの?
そうは思ってなかった。
教育関係なら、ここからさらに割り引かれるのかと思ってました。

ご存知の方おられませんか?


543:デフォルトの名無しさん
04/10/01 10:33:14
続き
----------------------------------------------------
717 :デフォルトの名無しさん :04/06/29 08:23
先日のFranzセミナーでもらった価格表によると…

Windows/Linux/FreeBSD/MacOS X版
Professional 750,000 (395,000)
Enterprise 1,400,000 (795,000)
Platinum 2,000,000 (895,000)

UNIX (Sun, IBM, HP, Compaq)版
Professional 1,300,000 (520,000)
Enterprise 2,000,000 (1,040,000)
Platinum 2,750,000 (1,200,000)

…高い… orz

718 :717 :04/06/29 08:24
あ、括弧の中はアカデミック価格ね。

544:デフォルトの名無しさん
04/10/01 10:40:04
flatline 氏の『on Lisp』翻訳、24/25章まで進んだようです。いよいよProlog。
URLリンク(user.ecc.u-tokyo.ac.jp)

ちなみに、進振りで志望に通ったらしい。おめでとうございます。

545:541
04/10/01 12:01:02
>>542 >>543
あ、ありがとうございます。
WindowsでProfessionalだと、75万円ですか、、そもそも比較の対象ではないですね ... orz

しょーがない自分で作るか(嘘)


546:デフォルトの名無しさん
04/10/01 13:47:54
>>539
shiroさんにもWindowsの良さをもっと解って欲しいな
バイナリ配布形式に対応してActivePerlみたいにsetup.exeから
インストール出来るようになればユーザーかなり増えると思ふ
まあそれに比例してDQNも増えるんだけどね・・

547:デフォルトの名無しさん
04/10/01 14:45:30
>>546
Window$かよ。( ゚д゚)、ペッ

548:デフォルトの名無しさん
04/10/01 15:02:20
しまった。
ここにはUNIX馬鹿厨がいるんだった。

549:デフォルトの名無しさん
04/10/01 15:02:52
別にWindowsが(他の実用レベルのOSと比較して)悪いとは思わないが,
>>546から激しくDQN臭がするのは確かだ.

550:547
04/10/01 15:03:49
>>548
MACですが何か?

551:デフォルトの名無しさん
04/10/01 15:04:02
やっぱDQNだった….

552:デフォルトの名無しさん
04/10/01 15:15:06
>>549-551
相変わらず反応早いですね。


553:デフォルトの名無しさん
04/10/01 17:24:55
今MIT Scheme落としてるんだけど、これPLTと比べてどう?

554:デフォルトの名無しさん
04/10/01 17:25:01
とまあこのような連中が増えるという例でした。

555:ミミ
04/10/01 18:28:12
>>545
ACL Professional は 2 年間レンタルで
5, 6 万円だって聞きました。

556:デフォルトの名無しさん
04/10/01 20:40:05
ACLってそんなにいいの?
どんな最適化するのか興味ある~
ところでfranz社ってサ、LISP以外手を出さんの?
例えば、MLとかprologトカサ
あ?そんなLISPがええか?ええのんか?
どないやねん

557:デフォルトの名無しさん
04/10/01 20:44:28
Borland Turbo Prologという製品が昔あったと言う。
末路は (ry

558:デフォルトの名無しさん
04/10/01 20:47:40
>>557
ネタかと思ったら本当にあったのね。
正直、驚いた。

トリビアスレ向きだな。


559:デフォルトの名無しさん
04/10/01 20:53:02
Microsoft Visual L# 2005
Borland LBuilder 2005
とか出るといいのか?

560:デフォルトの名無しさん
04/10/01 21:08:47
某国の場合
Pascal→Delphiみたいな名前置換があるやも

いやむしろナイスな銘々してくれって感じ?
オタ向け言語から一気に若者の主流に返り咲くか?
そういやcurlてどうよ?
本見た感じでは、うーん・・・

561:デフォルトの名無しさん
04/10/01 21:20:45
なんか短期間で書き込んでる変な人がいますね。

562:デフォルトの名無しさん
04/10/01 22:44:05
ACL Professionalの個人向け2年間$599リースは日本でもやってんの?
間に挟まってるぼったくり屋さんが黙って無さそうなんだけど。
AllegroPrologは7で入るんだっけ?それとも別製品か?作ってるのは知ってるけど
どんな製品ラインナップになるのかまでは知らん。

563:デフォルトの名無しさん
04/10/02 00:01:18
CLHS は float に inf や NaN を求めていないんですね.
これらが無いと困りませんか?
近日規格策定予定だったりしますか?

564:563
04/10/02 00:04:09
おっと,clisp の impnotes で触れられているのをまだ見てなかった.スマソ。

565:ミミ
04/10/02 02:06:02
>>562
>ACL Professionalの個人向け2年間$599リースは日本でもやってんの?

Franz の営業さん (日本人) から聞きましたよ。
ただ、リースの場合のテクニカルサポートは英語のみだそうです。

566:デフォルトの名無しさん
04/10/02 10:35:48
>>565
マジですか。小俣ちゃんが言うんならそうなんだろな。
ACL7がリリースされて予定通りMacOSXでCommon Graphicsがサポートされて
同一条件だったら欲しいかも。日本語のテクニカルサポートなんかイラネ。英語で充分。
$1200で買い取りと$599で2年間リースのどっちにすっかで迷うな・・・

567:デフォルトの名無しさん
04/10/02 16:57:12
GaucheからPHPかPythonを使いたいのですが、どういう方法が
あるのでしょうか?

Cならこういう具合であるようなのですが。
URLリンク(www.shiro.dreamhost.com)

568:デフォルトの名無しさん
04/10/02 17:45:30
>>567
あのな、C言語でどうやって使うかを考えろ。
それわかったらGaucheでも使えるだろ。

569:デフォルトの名無しさん
04/10/02 20:27:32
わかった!Pythonインタープリタを実装するんだね!!

570:デフォルトの名無しさん
04/10/02 23:57:10
おれもわかった!PHP を Scheme で書きなおすんだ!
…つか PHP なんてなんで使いたいんだ?
Gauche で書けよ HTML も


571:デフォルトの名無しさん
04/10/03 01:23:46
チ○コかきたい

572:デフォルトの名無しさん
04/10/03 13:30:50
MIT schemeがアンインストールできないんですけど・・・何なんだよヽ(`Д´)ノ

573:デフォルトの名無しさん
04/10/03 13:38:12
λ教は一度入ったら、
もう二度とやめれません

574:デフォルトの名無しさん
04/10/03 13:48:31
信者の社会復帰を支援するツールとしてPythonが用意されています


575:デフォルトの名無しさん
04/10/03 14:00:08
Pythonなんてswitch文さえまともに使えない言語はダメ

576:デフォルトの名無しさん
04/10/03 15:07:31
しかし豊富なライブラリは欲しいよぅ(;´Д`)

577:デフォルトの名無しさん
04/10/03 15:26:09
では parrot 待ちだな

578:デフォルトの名無しさん
04/10/03 17:26:11
parrotでみんな幸せになれますか?

579:デフォルトの名無しさん
04/10/03 17:26:54
schemeでRS232-Cを制御しようと思ったらどうすればよいのでしょうか。

580:デフォルトの名無しさん
04/10/03 17:47:41
>>579
>>568

581:デフォルトの名無しさん
04/10/03 17:52:04
初心者な質問ですみません。
よろしくお願いします。

CLOSで引数を2つ取るメソッドを定義した場合、
それ以降は引数の数が異なる同名のメソッドの定義(オーバーロード)
って不可能なのでしょうか?




582:デフォルトの名無しさん
04/10/03 18:52:54
>>579
termiosインタフェースがある処理系なら
Schemeオンリーでできないか? Gaucheとか。
ioctlが叩けないからだめかな。


583:デフォルトの名無しさん
04/10/03 20:47:03
>>581
普通にできるだろ


584:デフォルトの名無しさん
04/10/03 23:17:18
Unix でのおすすめの scheme 実行環境は何ですか?

585:デフォルトの名無しさん
04/10/03 23:21:37
>>584
guileが標準的

586:デフォルトの名無しさん
04/10/03 23:23:47
>>585
本気か?
いや俺も標準的になって欲しいとは思ってるけど…

587:デフォルトの名無しさん
04/10/03 23:41:07
>>586
ここではそれが良いって書いてあるけれど…
URLリンク(www.sra.co.jp)


588:デフォルトの名無しさん
04/10/03 23:41:39
GNU ソフトウェアの標準の拡張用インタプリタは GUILE である.
GUILE はScheme 言語の実装である
(Scheme は Lisp の非常にきれいで簡潔な方言である).
URLリンク(www.gnu.org)
われわれは他の「スクリプト言語」例えば Perl や Python で書かれたプログラムを
拒絶することはないが, GUILE を使うことは GNU システム全体の一貫性のためには
非常に重要である.

589:デフォルトの名無しさん
04/10/03 23:47:25
guile ってどう読むの?

590:デフォルトの名無しさん
04/10/03 23:48:48
>>588
それは知ってるけど、実際はまだろくに使っていないと思っているんだけど…
おれが無知なだけだったらスマン、例を教えて欲しい

591:デフォルトの名無しさん
04/10/03 23:51:42
>>590
いや、私もどこで使われているか知らない。
同様の用途ではPerlかシェルを良く使うと思うけれど。
でも標準が合った方が良いのは確かでしょ?
乱立しても、いくつの処理系をインストールしたくないし。。

>>589
guile=ぐいるって読んでいるけれど、どうだろう。

592:デフォルトの名無しさん
04/10/03 23:51:57
guileで書かれたスクリプトって何かあるの?
あまり見たことないような…

593:デフォルトの名無しさん
04/10/03 23:54:52
>>589
   __,, , , , _ 、 ,,, ... ,, _ ..,_
 ー=、 、ー-、`ヽ、、ヽ`!i' , ,i",r'",-'"=ミ
    `ヽ`ヾ`、 ! ヽ ! l! i! !_i_/_<'"``
     `,T、iliー'" "、,"、',  i, リ
      !/!,li ,;;-=o=-,ッィ=。ゥィ
  __  i、`!', '; `ー /;;!i、''; ,!
ー''`ヽ`,ーi'`''"!、ヽ , `一'、 /   __
    `il `i ! ヽ、   ̄ ̄ / iヽ、/ ,.ヽ_
     i! !`   `ーァ、-ー'  ! ノ!トi,!'",ノ-、
   ,..=、i! iヽ-、 rィ',;'!ヽー-、!  `/_,i' _,.!'、
ーニー-、._ `ヽゞニ-、.;' i! ! ,  `ト_ノ`x-'" ノ
=ニヽ、 , `, /ヾ=ソ ノ !/   !、`ー`''イ、
-ー-、 `i, / / ヽ `イ_,  i -'" ̄`! !   ヽ
   Tノ /-'"  `   ' !    ヽ     !

594:デフォルトの名無しさん
04/10/03 23:56:04
いつになったら”まだ”が取れるんだろう。
永遠にこない気がしてならない。
そもそも「標準の拡張用インタプリタ」とはなんぞや?
何時使うんだよ。
Linuxのインストーラーはpythonで書かれている様だし。
使われないで標準もあったもんじゃない。
そもそもSCMをベースにしておきながらあの遅さはなんなんだ?
Cにトランスレートすりゃあいいってもんでもないだろ。

595:デフォルトの名無しさん
04/10/03 23:58:45
ガイルでしょう

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
コルーチンって何?

764:デフォルトの名無しさん
04/10/14 16:18:27
>>763
URLリンク(www.google.com)

765:デフォルトの名無しさん
04/10/14 17:26:42
>>762
ユーザーモードのスレッドは必ずしもそうでないと思うけど、
ユーザーモードのスレッドライブラリはそうだね。で、それが何か?


話は変わって、
そもそもSchemeの継続ってプリミティブか?
単にCPSで書けばいいだけじゃないの?こっちはどんな関数型言語にもできるし。

766:デフォルトの名無しさん
04/10/14 17:43:15
機械語のライブラリを実行中に継続を取ってきても
きちんと動くように要請してるんじゃない?

767:デフォルトの名無しさん
04/10/14 20:38:44
>>765
なんでそこに CPS が出てくるのか意味がわからない

768:デフォルトの名無しさん
04/10/14 20:45:57
>>768
Continuation Passing Style のことだよ?

769:デフォルトの名無しさん
04/10/14 21:25:50
>>767 の言いたいことを推測。

CPSで継続を陽に扱うには、最初から全部CPSで書かなくちゃならない。
CPSで書かれていないコードから呼ばれるコードで継続を取り出したかったら
call/ccはプリミティブにならざるを得ない。

…ってなとこか?
CPSでもMonadみたいな形で継続を隠すことはできるけど、それだって
最初からそのつもりで書いてないと。

個人的には、Schemeの継続は言語の実験をするための道具って
感覚が強いな。




770:765
04/10/14 21:44:13
>>769
言語の要素のプリミティブじゃなくて、
>>750
> それこそ継続という概念が primitive なものであるということであり、scheme らしいところでは?
> primitive なものさえあれば他の機能はそれらを組み合わせてできる。美しい。
の話。

(Schemeの)継続なんて無くてもCPSで書けば、gotoでもコルーチンでも
call/ccでも(w実現できるんだから、プリミティブな(基底をなす)機能ではないんでは?
ということ。

> 個人的には、Schemeの継続は言語の実験をするための道具って
> 感覚が強いな。
同意。

771:デフォルトの名無しさん
04/10/14 22:03:36
やたら継続を美しいと賛美しているのは、つい最近大学の
講義で継続を知って嬉しくなってる厨房だよね?

772:デフォルトの名無しさん
04/10/14 22:11:31
>>771
はい。

773:デフォルトの名無しさん
04/10/14 22:26:47
四角いタイヤでも目盛がついていれば長さを測ったりできて便利かもしれんが、
それで高速道路を走るのは無理だ。

774:デフォルトの名無しさん
04/10/14 22:37:43
で?

775:デフォルトの名無しさん
04/10/14 22:42:13
ちんちんかゆいーー!

776:デフォルトの名無しさん
04/10/14 22:44:58
>>775
切っとけ。

777:デフォルトの名無しさん
04/10/14 23:38:01
>>770
だから?基底をなす機能しか使っちゃいけないなら、
ラムダだけ使えば?
理論上は統べての計算はラムダ式で可能なんだから、


778:デフォルトの名無しさん
04/10/15 00:28:51
継続がプリミティブだからエライと言い出した
のは継続厨房でしょうが

779:デフォルトの名無しさん
04/10/15 01:15:03
だからつかわなきゃいいじゃん
threadだろうがcall/ccだろうが理解してない
人間がつかうと危険なのは当たり前。

780:デフォルトの名無しさん
04/10/15 01:20:39
>>778
エライなんて誰も言ってないよ

781:デフォルトの名無しさん
04/10/15 10:39:17
>>777
基底をなす機能しか使っちゃいけないなんて誰も言ってないよ。

>>779
理解している人間が使ったって危険なんですが。
というか、誰が使っても危険なものだということを理解していない人間は
理解している人間ではないでしょうね。

782:ミミ
04/10/15 14:26:27
>> 個人的には、Schemeの継続は言語の実験をするための道具って
>> 感覚が強いな。
>同意。
私も同意。
例外処理のような代替機能があれば十分だと思う。

783:デフォルトの名無しさん
04/10/15 16:26:43
どういう場合になにが危険といってるの?実装といっしょにあげてみてよ。

784:デフォルトの名無しさん
04/10/15 17:19:01
>>782
で、言語の実験で良い結果が得られたらその度に代替機能を実装してくの?

785:デフォルトの名無しさん
04/10/15 17:29:19
>>783
危険っぽいコード
(define go #f)

(call/cc (lambda(cc) (set! go cc)))

(call-with-input-file "foo" (lambda(port) (go port)))


はわわ~

786:デフォルトの名無しさん
04/10/15 17:32:26
>>784
パフォーマンスを上げたいなら専用化した方がいいからね。
限定的な継続にして万能な部分を切っていく。
VBのバリアント型みたいなものだよ。

787:デフォルトの名無しさん
04/10/15 17:45:17
>>784
良い結果がって言うよりさ、そもそも言語の設計で「良い悪い」を
判断するのって使ってみないとわからんわけじゃん。で、処理系
ネイティブに実装する方式だと、その処理系を使ってる人しか
試せない。だけどSchemeの場合、かなり凝ったことまで言語組み込み
のプリミティブを組み合わせで書ける。そしたら、R5RS準拠の
処理系ならどれでもその提案を試してみることができるわけだ。

こいういう場合に使われるcall/ccなんかは、むしろ提案する
言語機能の仕様記述なわけよ。ところが、Schemeの場合は
その仕様記述が動かせるプログラムになる。


788:!= 782
04/10/15 18:26:51
>>784
そう。実装してく。
whileやらbreakやらgeneratorやらに抽象化してそれを安全に使う。
call/ccはそれを作る道具であって、call/ccのスパゲッティを毎回
ほどいて、俺には解けるから危険じゃないとか言って喜ぶための
ものじゃないと思うね。
上手い抽象化を考えたりその抽象化を実装したりするのに頭をつかおう。

789:ミミ
04/10/15 18:27:43
>>784
実用上の開発では言語実装にまで遡って設計の見直しを図ることは稀でしょう。

もちろん継続があったらあったらでよいと思いますが、
C における goto よろしく、大規模な開発では原則として禁じるのが妥当ではないかと。
ソフトウェア工学上は継続は狼男だと言っている方がいらっしゃいましたが、
その視点におけるその意見には同意するということです。

>>785
それは継続の問題というよりも、
プログラミングの腕の問題という気が。。。
do でも論理エラーがあれば無限ループが書けるわけだし。

>>786
>パフォーマンスを上げたいなら専用化した方がいいからね。
>限定的な継続にして万能な部分を切っていく。
これに同意。
Scheme に継続しか用意しないというのは実用的ではないという感じがします。


790:デフォルトの名無しさん
04/10/15 19:46:48
「実用的な」制御構造がいずれも継続の上に(マクロで?)構築した
ライブラリとして書けるっていうのがSchemeの主張なんじゃないの?

791:デフォルトの名無しさん
04/10/15 19:52:56
話がループしているのは継続のせいですか?

792:デフォルトの名無しさん
04/10/15 20:06:32
じゃあ高速な継続の実装の仕方でも考えるかい?

793:デフォルトの名無しさん
04/10/15 20:35:42
>>791
gotoのせいです。

794:デフォルトの名無しさん
04/10/15 21:18:32
>>790
そう。
パフォーマンスとかが必要ならそれぞれの実装系においてライブラリ部分をCとかで実装していけばよい。

795:デフォルトの名無しさん
04/10/15 22:36:02
結局Schemeは非実用的ということですね

796:デフォルトの名無しさん
04/10/15 22:39:54
わざわざ去勢する必要もなかろう

797:デフォルトの名無しさん
04/10/16 01:39:19
CommonLispのマクロについての質問。
マクロはコンパイル時に評価を行う、ということは、コンパイルプロセスを
実行プロセスから分離することはできない、ということでOKでしょうか?
また、関数の中でマクロが定義されている場合、関数が呼び出される度に
マクロ展開(とコンパイル)が行われるのでしょうか?


798:デフォルトの名無しさん
04/10/16 01:58:24
どういう動作をすると思ってるの?

799:797
04/10/16 02:06:33
実行とコンパイルがインターリーブしていて、マクロの展開関数の中
から他の変数なんかも参照できる。その変数の値によって、展開の結果
が変わるかもしれない...というふうに"思って"います。

根本的に間違ってますか?


800:デフォルトの名無しさん
04/10/16 03:39:45
継続の話。

Kawa(Java による Scheme 実装)の継続は例外処理(try - catch)
によって実装されているね。確か大域脱出しかできなかったような気
がする(Common Lisp の block 相当)。

実際、おれの場合、大域脱出くらいでしか継続は使ったことないな。

801:デフォルトの名無しさん
04/10/16 04:37:48
>>797
>コンパイルプロセスを実行プロセスから分離する
lispには eval関数の様に実行時に式を評価する仕組みがあるので
コンパイル環境と実行環境を分離するのは難しいと思う。
でもこの話は、マクロとは関係ないような気がする。

>関数の中でマクロが定義されている場合
関数内でマクロを定義した場合の動作など考えたことが無かった。
で、やってみた。

;; 関数定義
(defun test (x)
(cond ((equal x 1) (defmacro m () 10))
((equal x 2) (defmacro m () 20))
(t nil))
(m))

;; 実行結果 ・・・ clisp の場合
(test 0) => 20
(test 1) => 20
(test 2) => 20

;; 実行結果 ・・・ xyzzy lisp の場合
(test 0) => 関数が定義されていません: m
(test 1) => 10
(test 0) => 10
(test 2) => 20
(test 0) => 20

xyzzyではマクロ展開を実行時に行っていて、clispでは関数定義時に
行っているようだ。CLtL2 的にはどうなっているんだろう?

802:デフォルトの名無しさん
04/10/16 08:26:44
重複定義でエラーが正解

803:デフォルトの名無しさん
04/10/16 09:41:37
>>801
その例は実行時までプログラムの意味が決まっていないよね?
そういうマクロはたとえ可能としても悪いマクロだと思う
(実際おれは不可能と思ってたし)
役に立つ場合って何かあるかな?

804:デフォルトの名無しさん
04/10/16 15:10:07
>>797
> また、関数の中でマクロが定義されている場合、関数が呼び出される度に
> マクロ展開(とコンパイル)が行われるのでしょうか?

コンパイルされたコードの中でのマクロ展開はコンパイル時に行われて、
実行時には再度行われない、てことになってます。
ですから、関数内でマクロを再定義するようになっていたとしても、
展開に使われる手続きはコンパイル時の環境にあるものになるはずです。
コンパイルしない場合には、何時、何度展開されるかは実装依存です。
cf. URLリンク(www.lisp.org)

>>801
xyzzy でもコンパイルすると clisp と同じ結果になりますね。
でもいまいちピンとこない結果だなあ。
(defmacro m () 20) は展開時には、つまりコンパイル時であれ関数定義時であれ、評価されませんよね?
だったら (m) は展開できない気がするんですが。勘違いしてる?

805:ミミ
04/10/16 15:19:43
> (defmacro m () 20) は展開時には、つまりコンパイル時であれ関数定義時であれ、評価されませんよね?
リーダが読み取って、最適化された内部構造体に変換するときに、
ついでに defmacro を評価してしまうという実装はあり得ると思う。
(そんな処理系を見たことがある気がする。)

その場合、最後に出てきた m の定義によってオーバーライドされてしまうので、
上記のような結果になるのでは。

806:804
04/10/16 15:34:00
>>805
あーなるほど、それなら納得いきますね。
確かに普通それで問題ないでしょうし。

807:デフォルトの名無しさん
04/10/16 16:17:58
そういうマクロはエラーにして欲しいなあ。
eval介入するならともかく、使い道なんてないでしょ。


808:デフォルトの名無しさん
04/10/16 17:47:56
Gaucheはエラーになった

809:デフォルトの名無しさん
04/10/16 18:00:35
>>808
GaucheってSchemeでしょ?
Scheme的には>>801て文法的にありえんし…
mのスコープが意味不明。

810:デフォルトの名無しさん
04/10/16 18:27:24
>>797-799
> また、関数の中でマクロが定義されている場合、
これって macrolet のことを言いたいのかなあ、とふと思った。

> 実行とコンパイルがインターリーブしていて、マクロの展開関数の中
> から他の変数なんかも参照できる。その変数の値によって、展開の結果
> が変わるかもしれない...というふうに"思って"います。

これについては、こんな例もあるかな。

(defvar *foo*)
(defmacro %foo (x)
`(,(if *foo* 'car 'cdr) ,x))
(defun foo (ls key)
(let ((*foo* key))
(%foo ls)))

として、

(let ((ls '(a b c)))
(values (foo ls t)(foo ls nil)))
=> ? , ?

とりあえず今手元にある xyzzy では、コンパイルしないと a , (b c)、
コンパイルするとコンパイル時の *foo* の値によって a , a or (b c) , (b c) が、
更に *foo* の値が未定義だと (b c) , (b c) が返ってきました。
……しかし、どうにも病的な例しか思い浮かばないなあ。

811:デフォルトの名無しさん
04/10/16 20:26:58
letがないものが条件コンパイルのイディオムとして使われて
てもよさそうだと思ったんだけど、そうでもないのかな?

812:797
04/10/16 22:43:41
コンパイル時の環境・値をキーワードにしてHyperSpecを必死になって
読んで、部分的な理解を得ました。

マクロ展開のようなコンパイル時に実行される式はevaluation env.のもと
で評価され、そうでない本当に実行時に実行される式はrun-time env.のもと
で評価される。で、evaluation env.とrun-time env.が同一である保証は
無いと。
私の場合、この二つが同一と仮定していたので、797の発言になったわけ
ですね。実際は、run-time env.の中の束縛とは異なるかもしれない束縛を
evaluation env.に加えてやることでコンパイルプロセスを実行プロセスから
分離していると。
後は、コンパイルの過程でevaluation env.がどのように構築されていくのか
が解ればいいのですが、これも理解に時間かかりそう。

>>810
まだ文法に自信がないですが、こんなのなら病的ではないかと。
期待通りには振る舞わないみたいですが。

(defun debug-print (form value) ...)
(defvar *do-debug*)
(defmacro debug-value (form)
(if *do-debug*
(list debug-print `(quote ,form) form)
form))


813:Ruby >>>>>>>>>>>>>>>Scheme
04/10/17 06:09:54
Scheme を駆使して、「普通のやつらの上を行け」るのは、(少なくとも現状では、そして恐らく永久に)ごく一部のプログラマであって、
普通のプログラマが少しでも「普通のやつらの上を行け」るのは、Ruby になるような気がしています。
URLリンク(jp.rubyist.net)

814:デフォルトの名無しさん
04/10/17 06:26:35
結局のところ、CommonLispでマクロを安全に使うには、
(1)トップレベルで定義する。関数内では定義しない。
(2)同名のマクロの再定義はしない。
(3)スペシャル変数等の環境で動作が変わるマクロは書かない。
ということですか?

815:デフォルトの名無しさん
04/10/17 10:15:21
ものをちゃんと理解する、が一番じゃないかな。
まあ理解できないからこそ安全に~とか言ってるんだろうけど。


816:デフォルトの名無しさん
04/10/17 11:04:12
>>815
それなりの指針を与えることは、有益だとおもうけどどうかな。
だれだって最初は初心者な訳なんだし。

817:デフォルトの名無しさん
04/10/17 11:11:48
>>816
指針としては、

マクロは単に式を変形する
・ソースを短かくするために書け
・いつ式が変形されたか気を付けろ(コンパイル時、実行時、再定義に注意)

って基本を叩きこめば十分じゃないか?まだあるかな?

818:デフォルトの名無しさん
04/10/17 11:52:18
>>816
> だれだって最初は初心者な訳なんだし。

これってよく使われるフレーズだけど全然言い訳になってないよな。
最初は初心者でも自力修得できる奴はなんぼでもいる。


819:デフォルトの名無しさん
04/10/17 13:24:58
>>813
おそらくはマクロ等を駆使することで、
「問題領域における問題の記述とコードが同一になる」 Lisp/Scheme すげえ!
って思うんだがどうよ?

820:デフォルトの名無しさん
04/10/17 15:23:24
>>817
>・ソースを短かくするために書け
これは同意できない。
結果としてソースが短くなるケースが多いとしても、ソースを短くすることは
マクロを書く目的にはなり得ません。

821:デフォルトの名無しさん
04/10/17 17:30:59
あんたにはならなくても俺はなるな

822:デフォルトの名無しさん
04/10/17 17:59:41
結果として短くなるのと、短くするのを目的として使うことを混同してませんか?

823:デフォルトの名無しさん
04/10/17 18:11:15
>>818
わからないことを責めてはいけないとおもう。
わかろうとしないことだとしてもそうだと思う。
そういう人を取り込むことが言語のすそのを広げることになるんじゃないかな。

824:デフォルトの名無しさん
04/10/17 18:14:49
>>821, 822
ソースコードの性質によるのかな~と思うけど、どうかな。

長く、広く使われるコードであれば、直感にあう抽象化を
するためにマクロを使うべきだろう。
けど、テストコードなんかの場合はとにかく楽をするために
マクロを使っても良いように思う。

825:デフォルトの名無しさん
04/10/17 18:31:27
>>813
言語に「上下」があるわけではないと思うけどなぁ。

俺は ruby も好きだけど、scheme で書いてる時とは気分が違うよね。
なんつうか、ruby は relax しながら書くけど、scheme だと、集中して
研ぎ澄まされてく感じがする。抽象的だけどさ。

826:デフォルトの名無しさん
04/10/17 18:34:07
(DQNニレススンナヨ)

827:デフォルトの名無しさん
04/10/17 19:55:25
>>813
いいんだよそれで。「普通のやつら~」が言ってるのは競争の激しい
ベンチャー企業は最大限に生産性をあげないと生き残れない、そのために
最強の言語を使うべきだって言ってるんであって、その他大勢が
何を使おうが知ったこっちゃない。あの文章は生きるか死ぬかの極限での
サバイバル術について語ってるんだ。そんな環境に置かれていないなら、
好みで言語を選べばいいのさ。





828:デフォルトの名無しさん
04/10/17 22:38:11
普通のプログラマにはjavaをお薦めします

829:デフォルトの名無しさん
04/10/17 22:54:30
ノーマルプログラマにお薦め→java
アブノーマルプログラマにお薦め↓


830:デフォルトの名無しさん
04/10/17 23:01:54
C

831:デフォルトの名無しさん
04/10/17 23:41:06
この掲示板は何言語で運営してるの?

832:デフォルトの名無しさん
04/10/17 23:46:39
>>820, 822
817 だけど(!= 821 ね)
煽りじゃなくて、どんな目的でマクロ書くのか教えてくれないか?
おれはマクロに関してはソースを短くする事しか考えてないんだけど…
あ、「短く」じゃなく「明快に」、と格好良く言えば伝わるかな?

>>824
おれはテストコードは逆にマクロつかわないなぁ
テストコードのテストなんてしたくないから
コピペでも良いから単純に書く、どうせテストなんだし

833:デフォルトの名無しさん
04/10/18 00:04:11
>>832
私の場合:
 * with-なんとか系 --- 最初と最後にお決まりの文句がある処理とか
 * 関数のインターフェイス ---
(foo-format t "~A" obj1 "~A" obj2 ...) とやりたい.

834:デフォルトの名無しさん
04/10/18 00:04:20
Ruby!!!!!!!!!!!!!!!!!!

835:デフォルトの名無しさん
04/10/18 00:14:14
>>832
820でも822でもないですが
イディオムや式に名前を付けるとき。短くなるとは限らない。

836:デフォルトの名無しさん
04/10/18 00:31:51
>>835
確かに短くても慣れてないイディオムを包むマクロは書くことあるけど
(そしてその名前が長い時もある)
何回も使えば少なくとも行数は短かくなる気がするけど…
(本当はタイプ量も少なくしたいけど補完があるから気にしない場合はある)
良い例がありますか?

837:デフォルトの名無しさん
04/10/18 00:48:40
マクロの例は,いろんなプログラムのソースがヒントになるなと思ったよ.
名前は忘れたけど数値計算のやつでは,型チェックをやってた.
ソースを見ると,その関数の引数の型が一目瞭然になってるの.

838:デフォルトの名無しさん
04/10/18 01:53:24
ソースのバイト数を減らすってのもいいけど
(例えば call-with-current-continuation → call/cc, multiple-value-bind → mvbind など),
重要なのは定型的コード内のパターンを抽出して構文要素数を減らすことだぜ?
ただ,inline関数で実現できるならその方がいい.
"On Lisp" を読めば抽象化手段としてマクロを使うべきかどうかの判断規準(の一例)が示されてるけど...


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