トップページ⇒tech
994コメント368KB

CommonLisp Scheme Part11

レス数が950を超えています。1000を超えると書き込みができなくなります。
0001デフォルトの名無しさんNGNG
過去スレ
Part1: http://piza2.2ch.net/tech/kako/987/987169286.html
Part2: http://pc.2ch.net/tech/kako/1002/10025/1002584344.html
Part3: http://pc.2ch.net/tech/kako/1008/10082/1008220265.html
Part4: http://pc.2ch.net/tech/kako/1016/10162/1016211619.html
Part5: http://pc3.2ch.net/tech/kako/1023/10230/1023091882.html
Part6: http://pc3.2ch.net/tech/kako/1031/10315/1031560687.html
Part7: http://ruku.qp.tc/dat2ch/0311/20/1042167213.html
Part8: http://pc2.2ch.net/tech/kako/1058/10582/1058263391.html
Part9: http://pc2.2ch.net/test/read.cgi/tech/1069594582/
Part10: http://pc5.2ch.net/test/read.cgi/tech/1075630259/

関連リンクは>>2-10あたり
0002デフォルトの名無しさんNGNG
□参考リンク□

日本Lispユーザ会(日本語)
http://jp.franz.com/jlug/index.html
ここにかなりの情報があります。
http://jp.franz.com/
削るとAllegro Common Lispのページへ

プログラミング言語Scheme(日本語)
ttp://www.sci.toyama-u.ac.jp/~iwao/Scheme/scheme.html
Schemeの人はまずここを見ましょう。

Lisper への道(日本語)
ttp://www.geocities.co.jp/SiliconValley-Oakland/1680/rakup.html
判りやすいLISP入門サイト。

Schemeへの道(日本語)
ttp://www.stdio.h.kyoto-u.ac.jp/~hioki/gairon-enshuu/SchemeNotes/scheme.html
ここはschemeの入門サイト。
0003デフォルトの名無しさんNGNG
慶応の授業のページ・記号処理プログラミング 2001
http://buri.sfc.keio.ac.jp/lisp/menu.html

Practical Scheme(日本語)
ttp://www.shiro.dreamhost.com/scheme/index-j.html
「普通のやつらの上を行け」など、興味深い文書を沢山翻訳されてます。
(Gaucheという完成度の高いscheme処理系作者さんのページでもあります。)

Scheme Hash(英語)
http://okmij.org/ftp/Scheme/index.html
S式でXMLを使える様にするSXMLなど

John McCarthy's Home Page
http://www-formal.stanford.edu/jmc/
LISPの生みの親、J・マッカーシーのページだそうです。

Association of Lisp Users
http://www.alu.org/alu/home
米国のLispユーザ会
0004デフォルトの名無しさんNGNG
□SICP関係□

SICP(英語)
http://mitpress.mit.edu/sicp/full-text/book/book.html
「計算機プログラムの構造と解釈」の原書です。
全てオンラインで読めます。

計算機プログラムの構造と解釈 第二版 (snip) に関連するホームページ
http://www.ipl.t.u-tokyo.ac.jp/sicp/

SICPの回答集
http://www.melt.kyutech.ac.jp/~gogogo/sicp_ex/
http://pluto.aurorasd.co.jp/~mkama/sicp/
http://www.ipl.t.u-tokyo.ac.jp/sicp/solution.root.html
http://www.sampou.org/scheme/sicp/answer/
0005デフォルトの名無しさんNGNG
□その他□

Schemeで書かれた正規表現ライブラリ
ttp://www.cs.rice.edu/~dorai/pregexp/pregexp.html

幻の「入門Scheme」
ttp://www4.ocn.ne.jp/~inukai/scheme_primer_j.html
オンラインで読める

各種scheme処理系をcygwin上からビルドする方法など。
ttp://www.geocities.co.jp/SiliconValley-PaloAlto/7043/

Bit - Implantation compacte de Scheme
http://www.iro.umontreal.ca/~dube/
mini-schemeよりも小さい(?)bytecode変換系

Lisp 言語処理系: CAMPUS LIsP, Lemon version
http://aten.aial.hiroshima-u.ac.jp/~kakugawa/clisp/index-ja.shtml
Cコードによるわずか1000行の実装

Cliki
http://www.cliki.net/index
CommonLispのプログラムがたくさん紹介されているのでここを当たるべし。
0006デフォルトの名無しさんNGNG
encyCMUCLopedia
http://www.isr.ist.utl.pt/library/docs/encycmuclopedia/doc/
cmucl以外でも有益なはず

CMUのLisp Repository
ftp://ftp.cs.cmu.edu/afs/cs/project/ai-repository/ai/lang/lisp/0.html
新旧様々なプログラムが置いてある

Tiny CLOS Tutorial
http://home.adelphi.edu/~sbloch/class/272/tclos/tutorial.shtml

Schemix
http://www.abstractnonsense.com/schemix/
Linuxのkernelへのパッチで、/dev/として扱えるTinyScheme

Bibliography of Scheme-related Research
http://library.readscheme.org/
Scheme関連の論文リンク集
0007デフォルトの名無しさんNGNG
その他よさそうなリンク

awkで書かれたわずか500行のLispインタプリタ
awklispを読めばLispが理解できる
ttp://www.accesscom.com/~darius/

Emacs Lisp 2
http://pc2.2ch.net/test/read.cgi/tech/1068467385/

* Hotdog Scheme http://rover.cs.nwu.edu/~scheme/
 MS が金出してたみたい
* Bigloo http://www-sop.inria.fr/mimosa/fp/Bigloo/
 CLR 用のコードを吐けるようになったらしい

継続

なんでも継続
ttp://www.shiro.dreamhost.com/scheme/docs/cont-j.html
Schemeへの道:継続
http://www.stdio.h.kyoto-u.ac.jp/~hioki/gairon-enshuu/SchemeNotes/continuation.html
継続の使い方
http://www.geocities.co.jp/SiliconValley-PaloAlto/7043/index.html#continuation
継続の使用法
http://www.ice.nuie.nagoya-u.ac.jp/~h003149b/lang/block.html
CPS(継続渡しスタイル)の説明
http://www.csl.sony.co.jp/person/masui/Forum/data/20011215023622/
Kahua: 継続ベースのアプリケーションサーバー
ttp://www.kahua.org/
0008デフォルトの名無しさんNGNG
仕様関係)
CLtL2: Common Lisp the Language 2nd edition
http://www-2.cs.cmu.edu/Groups/AI/html/cltl/cltl2.html
CLHS: Common Lisp Hyper Spec
http://www.ai.mit.edu/projects/iiip/doc/CommonLISP/HyperSpec/FrontMatter/Chapter-Index.html
R5RS: Revised(5) Scheme(ja)
http://www.sci.toyama-u.ac.jp/~iwao/Scheme/r5rsj/html/r5rsj.html

便利な情報リソース)
The Common Lisp Cookbook: いわゆる Cookbook
http://cl-cookbook.sourceforge.net/

小さい実装)
SECDR-Scheme: SECD machine model に基づく実装
ttp://lily.fan.gr.jp/~kmd/adhoc/view.rhtml?n=SECDR-Scheme_woyomu
Minischeme: 1 ファイルに凝縮された Scheme 処理系
http://tinyscheme.sourceforge.net/minischeme.tar.gz
TinyScheme: Minischeme を色々弄ったもの
http://tinyscheme.sourceforge.net/
KI-Scheme, AM-Scheme, etc...
http://www.nifty.com/download/dos/prog/lisp/
LispMe: Palm 上で動く Scheme 処理系. これも SECD virtual machine.
http://www.lispme.de/lispme/
0009デフォルトの名無しさんNGNG
LISP Scheme Part9 (html化)
http://ruku.qp.tc/dat2ch/0403/01/1069594582.html

独習 Scheme 三週間
http://www.sampou.org/scheme/t-y-scheme/t-y-scheme-Z-H-1.html
Schemeの教科書

よろずや
http://www.geocities.co.jp/SiliconValley-SanJose/7474/
lispの実用的な情報が色々。
0010デフォルトの名無しさんNGNG
乙
0011デフォルトの名無しさんNGNG
WindowsXPでschemaをやりたいのですが、XYZZYのような手軽
な処理系はありませんか?
0012デフォルトの名無しさんNGNG
>>11 http://www.drscheme.org/
0013デフォルトの名無しさんNGNG
>>11
lambdaがエラーになる・・・なぜに
0014デフォルトの名無しさんNGNG
>>13
Dr.Scheme?
Language -> Choose Language で
Standard R5RS を設定すれば lambda 使えるよ
0015デフォルトの名無しさんNGNG
>>11
対話環境なしでいいなら Handy Scheme なんかどう?
とりあえず、お手軽です。

http://www.geocities.jp/bneck44/hS.htm


0016デフォルトの名無しさんNGNG
>>15
簡単に窓を開けるみたいですね.
それなら FFI を実装してくれると,計算ものを他人に使ってもらうときに
ピッタリの解になるのですが.
0017デフォルトの名無しさんNGNG
0018デフォルトの名無しさんNGNG
保全
0019デフォルトの名無しさんNGNG
WiLiKi 荒らされてる……んだよね、あれは。
0020デフォルトの名無しさんNGNG
まさかWiLiKiを荒らすような奴がいるとは思わなかった。
よほど心が腐っていると思われる。
0021デフォルトの名無しさんNGNG
何かあったの?
0022デフォルトの名無しさんNGNG
WiLiKiがどのように荒らされたのか、差し支えない範囲で教えてください。
CLikiもたまに「バカ、アホ、氏ね」みたいな荒らされかたをすることがあるよね。
0023デフォルトの名無しさんNGNG
トップページの履歴見てみなよ。大幅な書き換えがあるから。 >>22
0024デフォルトの名無しさんNGNG
あんがと。確認しました。
0025デフォルトの名無しさんNGNG
こういう分かりやすいのより、本人にそのつもりが無いのに
結果としてグチャグチャにひっかきまわす輩の方がタチが悪いなぁと思う今日このごろ。
自覚が無いから学習もしないし。
0026デフォルトの名無しさんNGNG
またそのはなしか
0027デフォルトの名無しさんNGNG
formに、Lispのタームとしての定訳はありますか?
片仮名でフォームとするのが一般的でしょうか。
迷訳^H^H名訳で有名なSICPでは何と書いてあるのかとか、
Lisp全盛の頃の本では何になっているとかも知りたいですが。
0028デフォルトの名無しさんNGNG
Lisp全盛っていつよ?
0029デフォルトの名無しさんNGNG
WiLiKiの件はWinAPIのとこでど素人っぷりを晒している気の毒な人に
叱咤してるのがそれかなと思ったら、しょ〜もないことする奴が居るんだね〜。
あきれたもんだ。

>>28 は第5世代コンピュータとか、その辺りじゃないの?
0030デフォルトの名無しさんNGNG
形式
0031デフォルトの名無しさんNGNG
symbolicsとかの lisp machineがあったころじゃ、lisp全盛期って。
とはいうものの、日本ではそんな栄えてなかったから定訳はないとか。
0032part10 の >>968NGNG
part10 の >>988

clisp を windowsXP で,日本語ディレクトリ以下で使う件です.
CP932 が無くて自動的に UTF-8 になっていたわけですが,
impnotes.html によると libiconv が必要のようです.

とりあえず色々なところに gnuwin32 の libiconv を置いてみましたが,
できませんでした.
impnotes.html が言う「libiconv のインストール」とは,windows では
どういうことになるのでしょうか.
0033968じゃないけどNGNG
>>32
libiconvを適当なディレクトリにインストールし、そのディレクトリを
指定してコンパイルしなおすってこと。
sourceforgeやcygwinで配ってるバイナリだと日本語は使えないよ。
0034デフォルトの名無しさんNGNG
S式を捨ててM式やそれに似た構文を採用した言語もLispと呼んでいいなら
Lispの全盛期は現在 (苦しいか)
0035デフォルトの名無しさんNGNG
M式の言語って具体的には何ですか?
0036デフォルトの名無しさんNGNG
>>35
M式をさらにヘンテコな構文にしたLisp方言:
Perl、Python、Ruby...
003732NGNG
>>33
そうですか...orz

minGW でも build できればいいのですが.
0038デフォルトの名無しさんNGNG
日本での全盛期はELISとTAOの頃です
0039デフォルトの名無しさんNGNG
>>34
そんなの考えなくても現在が全盛期でさらに成長中。
たとえば、インストールベースについて考えてみる。IDCによると、
2003年には約1000万台のLinuxデスクトップが出荷されている。
ほとんど全てのディストリビューションにおいてデスクトップ環境
には何らかのLisp処理系が含まれ、Linuxデスクトップにはさらなる
成長の余地が期待されることを考えると、Lispの出荷数は現在が
過去最大であり、今後さらに伸びることが期待される。
プログラマの数だと、Emacs Lispやguile-gtkを利用したプロジェ
クトのメンバー数だけを見ても順調に伸びている。
利用者数にいたっては、webアプリのサーバサイドで使用され、
それと知らずに利用してるユーザーの数なんて数え切れない。
>>29,31,38の頃と比べるとシェアは減ってるかもしれないけど、
それ以上にパイが広がってるのが現在だと思う。
0040デフォルトの名無しさんNGNG
いつまでたってもマイナーなのは変わらんけどね
0041デフォルトの名無しさんNGNG
猿でも分かる guile プログラミング
〜 unix tool イージー拡張プログラミング 〜

見たいな tutorial があると助かるんだけどな〜。
Scheme の知識は前提にしてていいから。
0042デフォルトの名無しさんNGNG
>>40
10月に月刊 Lisp Magazine が創刊されるから
メジャーになるんじゃない?

0043デフォルトの名無しさんNGNG
>>42
マジ?w
0044デフォルトの名無しさんNGNG
float についての挙動がいまいち掴めません.教えてください.

ソースの最初に (setf *read-default-float-format* 'double-float) と
書いておくと,それ以降の `2e0' や '2.0' は double-float として
扱われるのですよね?
また,
  (setf b (* 2.0 2)) ==> 4.0
  (type-of b) ==> DOUBLE-FLOAT
となるのに,
  (setf a (atan 1)) ==> 0.7853981f0
  (type-of a) ==> SINGLE-FLOAT
となってしまいます.
全てを double-float にしたいです.どのようにすればよいのでしょうか.
0045デフォルトの名無しさんNGNG
(setf a (atan 1.0)) ではどう?
004644NGNG
>>45
あっ,すみません.それは気づいていました.
ちゃんと *read-default-float-format* が反映されます.

ソース内の全ての float を double-float にするつもりで
いろいろやったのですが,warning が出てしまっているので,
手順として
1. (setf *read-default-float-format* 'double-float)
2. int を float 表記に.(例: `1' を `1.0' や `1e0' に)
をやったのですが,不十分らしいのです.
3. とにかくリテラルを `1d0' に.
もやりましたが,まだ warning が出ます.

どうすれば完全に double-float だけのソースにできるのでしょうか.
0047デフォルトの名無しさんNGNG
それはリード時にdouble floatにするだけでしょ。
0048デフォルトの名無しさんNGNG
http://www.geocities.jp/bneck44/hS.htm
scheme + HSPって感じだな。
0049デフォルトの名無しさんNGNG
librep みたいなのの Windows 版になれば便利かも
005044NGNG
>>47
ごめんなさい.よく意味が飲み込めません...
ソース内のリテラルには効果無しですか? ちゃんと変わっているようにも見えますが...

数値計算をさせている方々は,どんな方針で float を扱っているのでしょうか.
single-float ではちょっと足りない感じはありませんか?
処理系依存なところが多くてどうしたらいいか途方に暮れています.
0051デフォルトの名無しさんNGNG
>>48 今、回線が細くてソース下して読む気にならないんで、ソース読んだ人
いたら教えてください。

Tiny Scheme 派生ということなんですが、文字列の長さ制限はどうなってます
か。
0052デフォルトの名無しさんNGNG
>>46
規格を調べてないから間違ってるかもしれないけど
(atan) とかの関数が返すfloatの精度は処理系依存だったような気がする。
この点は、>>45 がうまくいっているなら大丈夫として、

>3. とにかくリテラルを `1d0' に.
>もやりましたが,まだ warning が出ます.

integer が必要なところまで floatにしてない?
(elt '(a b c d) 1d0) とかは通らないよ。
005344NGNG
>>52
> integer が必要なところまで floatにしてない?

大丈夫です.cmucl や sbcl では warning が出ないので,
clisp 2.33.2 が何か間違えているのかと思いましたが,
CLHS で *read-default-float-format* の example を試してみたら
cmucl と sbcl は single-float と double-float しか実装されていないんですね...
cmucl を使っていれば何も知らずに過ごせるんですね...

ところで,sbcl ってちょっと bug ありませんか?
dotimes から (return) しようとするとコンパイルが通らないのです.
簡単なテストではうまくいくのですが.
0054デフォルトの名無しさんNGNG
>>42
ソースきぼんぬ。
0055デフォルトの名無しさんNGNG
月刊 Lisp Magazine
創刊号の付録は lambda closure の実装
9号まで集めると簡単に最適化 Lisp コンパイラが組めます。

その他、継続号を入手するのが困難な季刊 Schemer (予定)とか、
必要な時にだけ発行される Haskell User (未定)とか。
0056デフォルトの名無しさんNGNG
> 必要な時にだけ発行される Haskell User (未定)とか。

lazyだけにいつまで待っても出ないヨカーン
0057デフォルトの名無しさんNGNG
読者が読むまで記事が書かれません
0058デフォルトの名無しさんNGNG
>>51
#define LINESIZE 1024
char linebuff[LINESIZE];
char strbuff[256];


0059デフォルトの名無しさんNGNG
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄」
―――――――――――――‐┬┘
                        |
       ____.____    |
     |        |        |   |
     |        | ∧_∧ |   |
     |        |( ´∀`)つ ミ |
     |        |/ ⊃  ノ |   |  J ←さじ
        ̄ ̄ ̄ ̄' ̄ ̄ ̄ ̄   
0060デフォルトの名無しさんNGNG
>>55 月刊 Lisp Magazine か Lisp Wizard 探訪 とかやってくれんかなぁ
今どこで Lisp が使われているか本当に知りたいよ



0061デフォルトの名無しさんNGNG
昔、bitにはLispの連載があったよなぁ。。
0062デフォルトの名無しさんNGNG
Good Old Days
λ...
0063デフォルトの名無しさんNGNG
Gauche-devel-jpのshelarcyがいたい。
webも痛い。http://page.freett.com/shelarcy/
0064デフォルトの名無しさんNGNG
ウォチは板違いってテンプレに書いておいた方が良さそうだな
0065デフォルトの名無しさんNGNG
結局、月刊 Lisp Magazine はネタですか?
残念。
0066デフォルトの名無しさんNGNG
>>64
やってんのは一人だろ、どうせ。何のつもりか知らんが。
0067デフォルトの名無しさんNGNG
Lisp関係ないじゃん
0068デフォルトの名無しさんNGNG
>>63
あれは誰かがサクっと書いて「ほれ。」と出して黙らせるしかないんじゃないかな。
放置が一番でしょう。
川合さんのメールは似たような奴を相手にしたら使えそうなので、
それを引き出したという点では価値があるといえる(w
0069デフォルトの名無しさんNGNG
あれは単に匙を投げられただけでわ
0070デフォルトの名無しさんNGNG
R*RSでは伝統的なマクロ(不健全なマクロ)をサポートする気はないのかな?
もうすでに却下されているのかな?
0071デフォルトの名無しさんNGNG
>>70
一体何のために?
0072デフォルトの名無しさんNGNG
hygienic の対義語が不健全か。その表現いいねー
(defmacro sekusu (timpo mamco)
`(insert ,(if (hokei-p timpo) ...
とかやっちゃうわけだ。ハァハァ
0073デフォルトの名無しさんNGNG
Scheme の健全マクロを学ぶのに、おすすめのページはありますか?
0074デフォルトの名無しさんNGNG
>>73
ないよ
0075デフォルトの名無しさんNGNG
>>73
とりあえずブックマークにこんなの入ってた。
http://home.comcast.net/%7Eprunesquallor/macro.txt
0076デフォルトの名無しさんNGNG
>>73
前スレ(Part 10)の786にも書いたんだけど、
Schemeの健全マクロについては、

・日本語

オンラインで読める文献は >>5 に出てる「入門Scheme」以外にないと
思う。pdf ファイル。
#http://www4.ocn.ne.jp/~inukai/scheme_primer_j.html

書籍だったら、『プログラミング言語SCHEME』R.ケント ディヴィグ (著)
http://www.amazon.co.jp/exec/obidos/ASIN/4894712261


・英語

上の本の原書(英語版)がオンラインで読める。
http://www.scheme.com/tspl2d/index.html
0077デフォルトの名無しさんNGNG
>>76
よっぱど英語を見たくないのでもなければ、下の英語のがおすすめ。
わかりやすいよ。

0078デフォルトの名無しさんNGNG
Dr.Schemeって機能限定されてない?
defstructとか使えないような気がする・・・
0079デフォルトの名無しさんNGNG
「機能限定されてる」んじゃなくて、「機能拡張されてない」んでしょ
defstruct は srfi なんだから
0080デフォルトの名無しさんNGNG
The Little Schemer の9章を解説してるwebページはないですかね?
もしくは理解するのに役立つwebページ、本でもいいですが…。

define 使わなくても lambda をたくさん使えば関数定義できるってことを
解説した章だったんでしょうか?さぱーりわかりません。ヽ(´ー`)ノ

0081デフォルトの名無しさんNGNG
lambdaで関数定義ってことはY combinatorかなあ。
0082デフォルトの名無しさんNGNG
昨日の某大学の院試でSchemeの問題が出たんだけど…

できませんでした。orz
0083デフォルトの名無しさんNGNG
>>80
あれは Y Combinator の説明なんだけど、はっきり言ってわかりづらい。
私は旧版の日本語訳『Scheme手習い』しか読んでないんだけど。

ちなみに Y Combinator とは、lambda だけで定義された再帰関数をつくる
ための汎用関数。

とりあえずこんなページをどうぞ。
http://i.loveruby.net/ja/misc/ycombinator.html

あと、このスレの Part 9 の 422 から、lambda だけで再帰する方法に
ついて議論がある。個人的にはそこがとても参考になった。
そこを見ながら、自分でいろいろコードを書いてみて、Y Combinator が
なぜこういう形でなければならないのか、納得できるまで追及した。
0084デフォルトの名無しさんNGNG
>>82
ツバメの大学ですか?
いや,まあ俺も(ry
0085デフォルトの名無しさんNGNG
>>80 この説明はどうですか?
http://otoha.dyndns.org/diary/0408.html#19
0086デフォルトの名無しさんNGNG
(sort lst #'< :key #'car)

で先頭に来るやつが,元の lst の中でどこにあったのか (position) を
知るにはどうしたらいいんでしょう?

(position-if #'この中で一番大きい lst)
みたいなことをやりたいのです.
0087デフォルトの名無しさんNGNG
>>86
効率悪いけど、こんな感じじゃダメですか。
(let ((x '(1 2 3 4)))
(position (apply #'max x) x))
008886NGNG
>>87
ダメじゃないです.ただ,良く使われそうな操作なので,
みなさんなら最も短くて効率の良い方法をご存じかと思ったんです.

max が返すものは,元の要素と eq なんですよね.
0089デフォルトの名無しさんNGNG
(define (hoge x)
(let loop ((max (car x)) (mnum 0) (x (cdr x)) (num 1))
(cond ((null? x) mnum)
((> (car x) max) (loop (car x) num (cdr x) (+ num 1)))
(else (loop max mnum (cdr x) (+ num 1))))))
0090デフォルトの名無しさんNGNG
Schemeですまんが、結局こうするしかないのでは。

(define (position-if pred lis)
  (if (null? lis)
      -1
      (let loop ((pos 1) (ans-pos 0) (ans-val (car lis)) (lis (cdr lis)))
        (if (null? lis)
            ans-pos
            (if (pred (car lis) ans-val)
                (loop (+ 1 pos) pos (car lis) (cdr lis))
                (loop (+ 1 pos) ans-pos ans-val (cdr lis)))))))

(position-if < '(2 9 3 1 4)) => 3
(position-if > '(2 9 3 1 4)) => 1
(position-if < '()) => -1
009190NGNG
10分以上遅れて結婚とは…orz
0092デフォルトの名無しさんNGNG
マスターするならCommonLispとSchemeどっちがいい?
0093デフォルトの名無しさんNGNG
どっちも趣味
0094デフォルトの名無しさんNGNG
>>93
どっちも優雅で知的で、極めるまでは時間が
かかるけど学ぶことそのものが楽しみつつ行
なえる素晴しい言語って意味?

それともどっちも金にならないオタク言語で
ちょっとした満足感は得られるけど世間では
何の評価も得られなくて非生産的って意味?
0095デフォルトの名無しさんNGNG
Lisp の実装によくある、car 部のお隣(物理的な隣のメモリ)に
直接 cdr 部を置くことで、(car . cdr) を4+4 = 8バイトで表す技法が理解できません。

確か Guile の中の人に、それの説明らしき文書があったような気がするけど、
今、Guile が手元にないのと、そもそも英語が碌に読めません。

どうしてこんなのでちゃんと動くんですか?
誰か詳しい人教えてください。
0096デフォルトの名無しさんNGNG
>>95
アドレスのLSBから数ビットをタグに使う
009795NGNG
いや、タグの話ではなくて。。。

例えば、 単純な (1 . 2) というペアだけならば話は分かるが、
(1 2. 3) となった場合とか、((1 .2) 3 4 . 5) となった場合とか、
どうして >>95 で良いのかが分からん。
0098デフォルトの名無しさんNGNG
どこがダメになりそうだと思うのですか?
009995NGNG
例えば、ヒープを8バイト(セル2つ分)単位で確保して、

#define CAR(a) (*(a))
#define CDR(a) (*((a)|4))
みたいなマクロが定義されている場合、

仮に
car 部がアドレス 0x12345670 に配置されて、
cdr 部がアドレス 0x12345674 に配置されるとして、

その cdr の cdr はどうするのさ?とか、
(#define CDR(a) (*((a)+4)) なら、まだ納得できるけど・・・)

つか、上のような8バイト単位でメモリを切り取っていく
意味が良く分かっていないと思う(メモリの圧縮(=節約)の為
だという事ぐらいは分かるのだが)。
0100デフォルトの名無しさんNGNG
4バイトがセルへのポインタになったり即値になったりする様子がイメージできないのでは?
0101デフォルトの名無しさんNGNG
>>96
>>99の例でいうと, car部は 0x5670**** へのポインタとみなされて
cdr部は0x5674**** へのポインタとみなされるってことでいい?

>>100
即値の場合も即値へのポインタじゃないの?
0102デフォルトの名無しさんNGNG
即値は即値ですよ。ふつうヒープ上に配置したりはしません。
0103デフォルトの名無しさんNGNG
えーと、いわゆるcdr codingの話じゃなくて、consセルを
ポインタ2つ分きっかりで表す話をしてるんだよねぇ?
それならどこがどうわからないのかわからないんだけど。
基本はcarもcdrもポインタでそ。

テクニックとしてめんどいのは、ポインタが指しているものが
consセルなのかそれ以外のオブジェクトなのかの区別だけど、
それはconsセル以外のヒープアロケートオブジェクトの最初の
ワードに即値でもポインタでもないようなタグを持つマークを置いて
おけば、区別できる。

(ここで言う即値は、例えば30bit integerを2bitシフトして
下位2bitを01にしてポインタと区別する、というようなやつの
ことね >>101 )

0104デフォルトの名無しさんNGNG
CONSセルの値って全てがポインタだと思っていた。
即値が入ってる場合があるの?

http://www.shiro.dreamhost.com/scheme/trans/icad-j.html
> # 動的型付け。Lispでは全ての変数は実質的にポインタだ。変数ではなく
> 値の方に型が付いており、代入や束縛は実質的にポインタのコピーで行われ、
> ポインタが指されるものには作用しない。
0105104NGNG
おや、すでに解答が>>103に書かれていた。
リロードすればよかった。スマソ。
010695NGNG
>>100
>4バイトがセルへのポインタになったり即値になったりする様子がイメージできないのでは?

ん〜、そこら辺は分かっていると思うんだけど。。。

>>103
>consセルをポインタ2つ分きっかりで表す話をしてるんだよねぇ?
>それならどこがどうわからないのかわからないんだけど。

>>99 の例で言えば
cons + car であるアドレス 0x12345670 の cdr が
アドレス 0x12345674 なのは分かるけど、
アドレス 0x12345674 の cdr はどうなってるの?って事。

アドレス 0x12345678 になるならば話は分かるけど、
そうではなさそうだし・・・
0107デフォルトの名無しさんNGNG
Cのポインタの理解ができていないだけのような気がしないでもない。
010895NGNG
>>107
そうなの?

それとついでに、セルを確保する際に、
必ず8バイト(セル2つ分)単位で
メモリを切り取っていくという点も。
0109デフォルトの名無しさんNGNG
>>95
ど素人っぽいけど
その辺の話題は過去スレで散々がいしゅつだから、
過去ログさらっと流し読みしてみれば?
幸い全部残ってるし。
0110デフォルトの名無しさんNGNG
>>106

>アドレス 0x12345678 になるならば話は分かるけど、
なるよ。

そのポインタが下位2ビットは使ってないことわかる?
例えばその2ビットをフラグとみなして識別に使ったりする。
0111デフォルトの名無しさんNGNG
>>106
あーそうか、ポインタまるで理解してないね。
そういう事知ろうとする前に、C言語でもやったら?
0112デフォルトの名無しさんNGNG
そもそもこの場合、0x12345674 は cons cell を表わす値としてありえないだろう。
cons cell が 8バイトアラインメントなんだから。
ありえない値の cdr なんて取れるはずがない。
011395NGNG
>>110
>なるよ。

#define CDR(a) (*((a)|4))

ここで + 演算ではなく | 演算をしているでしょ?
それではどうやってもならないと思うし、
また >>108 の回答にもなっていない。
0114名無しさん@EmacsNGNG
8バイトで align されてるってことは
 a % 8 == 0
ってことだ。
この場合は 0<=i<7 の i に対して、a+i == a|i が成り立つ。
だから + でも | でもよい。
0115デフォルトの名無しさんNGNG
もしかして (1 2 . 3) が

0x12345670 1
0x12345674 2
0x12345678 3

みたいに配置されると思ってるのかな。

0x12345670 1
0x12345674 cons 0x12345678

0x12345678 2
0x1234567c 3

だよ。 cdr-coding だと話は別だけど、今時 cdr-coding なんてやらないし。
0116デフォルトの名無しさんNGNG
long一発で初期化できるというヨロコビはあるかも。通常の2倍の速さでコンパクションできるとか。
(コンパクションの必要があるかどうかは知らんけど)
011795NGNG
>>115
>0x12345670 1
>0x12345674 cons 0x12345678
>
>0x12345678 2
>0x1234567c 3
>
>だよ。

あ、なるほど。それで分かりました。
でもそれでは余り8バイト単位で確保する意味が無いですね。
逆にメモリを使いそう・・・

ところで、cdr-coding ってなんですか?
0118デフォルトの名無しさんNGNG
>>117
>でもそれでは余り8バイト単位で確保する意味が無いですね。

でも高速化の為なら意味があるか。
それだけ為なのかなぁ?
0119デフォルトの名無しさんNGNG
何バイト単位が最適だと思ってるの?
012095NGNG
>>119
4バイト
0121デフォルトの名無しさんNGNG
ポインタに4バイト使うなら、consセルは8ビットいるよ。
0122デフォルトの名無しさんNGNG
8ビットじゃなかった。8バイトだ。
0123デフォルトの名無しさんNGNG
>>120
…まあ落ち着け。
cons セルはバイナリ・ツリー(二分木)のノード(節)だ。
一つの節から生える枝は必ずcar, cdr の 2本だから、
一つの cons セルは2本分の枝のアドレスを保持する必要があるんだよ。
だから 4バイト × 2 で8バイトが必要になる。
0124デフォルトの名無しさんNGNG
>>120
あとな、この辺の図も見ておけ。
cons セルがどうしてポインタを2つ持つのか、いやおう無しに分かるから。
http://www.stdio.h.kyoto-u.ac.jp/~hioki/gairon-enshuu/SchemeNotes/listproc.html
0125デフォルトの名無しさんNGNG
>>117
それをみんなずっと言ってたんじゃないかあぁぁぁぁ・・ぁぁぁぁ・・・・・・
0126デフォルトの名無しさんNGNG
単にconsセルを理解してないだけだろ。
012795NGNG
いや、どうも。。。

結局のところ cons セルを "ナイーブに" 実装するだけだったら
ポインタを2つ積めば良いのは分かっているんだけど、
確か世の中には、それをもう少し圧縮する技法が
あったと思ってたので。

例えば >>115 のように、cdr となるセルを
(物理的に)隣のメモリに配置することが出来て、
それを cons 表現の(内部的に)特殊な表現として扱えれば、
本来であれば (car . cdr) を表現するためには
3つのセルを使用しなければならないところを、
たった2つのセルで表現できてしまう。
ていうか、セル1つの表現が4バイトあればほぼ事足りてしまう。
(勿論再帰などの問題があるので、通常のポインタ2つ丸々
使用する例外的な表現も許すようにしておけばよい)
Lisp で使うセルの大半は cons なので、
こういうのは結構お得な発想だと思っていたけど?
0128デフォルトの名無しさんNGNG
>>127 それをcdr-codingっていうんだよ。
http://www-2.cs.cmu.edu/Groups/AI/html/faqs/lang/lisp/part2/faq-doc-9.html

0129デフォルトの名無しさんNGNG
>結局のところ cons セルを "ナイーブに" 実装するだけだったら
>ポインタを2つ積めば良いのは分かっているんだけど、
>確か世の中には、それをもう少し圧縮する技法が
>あったと思ってたので。
そういうことは最初から書いとけよ。
理由付けもなく4バイトとか言われても、理解してないとしか思えないんだよ。
0130デフォルトの名無しさんNGNG
>>128
へーなるほど。。。

勉強になりました。
0131デフォルトの名無しさんNGNG
>>127
> 本来であれば (car . cdr) を表現するためには
> 3つのセルを使用しなければならないところを、
> たった2つのセルで表現できてしまう。

普通、「セル」といったら「cons cell」のことで、
(A . B)
のペアを1つのセルと数えると思うんだが
0132デフォルトの名無しさんNGNG
>>127
>結局のところ cons セルを "ナイーブに" 実装するだけだったら
>ポインタを2つ積めば良いのは分かっているんだけど、

>>117
>あ、なるほど。それで分かりました。

リスト遊びから読み直せ。
0133デフォルトの名無しさんNGNG
>>131
それだ!
>>127 とか、読んでも意味が分からんかったんだけど、
95氏は 変数(ポインタ)一つのことを1つのセルと呼んでいるんだ。

普通はconsセルといえば、二つのポインタのペアのことだとしか思わないよなあ。

あと、95氏は、彼の読んでいるコードは、何らかの最適化がされているということを
前提に考えているみたいだけど、それって思い込みなのじゃないか?
実際は、普通(ナイーブ)に2つのポインタのペアとしてコーディングされてるんじゃ
ないのか?>>115-117を見てると、そうとしか思えん。
0134デフォルトの名無しさんNGNG
ポインタ一つをセルと呼んでるとしても、
>本来であれば (car . cdr) を表現するためには
>3つのセルを使用しなければならないところを、
>たった2つのセルで表現できてしまう。
は理解不能。
なんで3つもいるの?
013595NGNG
>133
>95氏は 変数(ポインタ)一つのことを1つのセルと呼んでいるんだ。

Lisp 実行上での言葉と、Lisp 実装上の言葉の違いかなぁ・・・
「メモリセル」とか言わない?

>>133
>実際は、普通(ナイーブ)に2つのポインタのペアとしてコーディングされてるんじゃ
>ないのか?>>115-117を見てると、そうとしか思えん。

そう、「それ」が分かったんです。
単なる思い込みで、そのコードが所謂 "CDR-cording" をしていると
ばっかり思っていたので・・・
0136デフォルトの名無しさんNGNG
じゃあ95はポインタを二つ使うconsセルについては理解してるんだな?
0137デフォルトの名無しさんNGNG
>>135
>「メモリセル」とか言わない?
言うけど、Lispスレではすっごく紛らわしいよ。実装寄りの言葉を使いたいのは
分かるけど、なら「メモリセル一つ(cons セルにあらず)」とか書いて欲しいよ。
でなきゃ素直にポインタと書くとか。

> そう、「それ」が分かったんです。
うー、だったらはっきりそう書いて欲しかった。じゃあもう完全に分かったのね?
cdr-codingとかを除いて。
だけど、>>134とか見ると不安なんだけど。何に3つのポインタが必要なの?
0138デフォルトの名無しさんNGNG
>>127
> 本来であれば (car . cdr) を表現するためには
> 3つのセルを使用しなければならないところを、
> たった2つのセルで表現できてしまう。

tag + car + cdr で3つのポインタが必要なところを、
tag をアドレスのビットパターンに埋め込んで2つのポインタで表現できる、ということ?
でも、次の行の

> ていうか、セル1つの表現が4バイトあればほぼ事足りてしまう。

と合わせるとわけわからん。
「セル」がポインタ1つのことを指しているのなら「4バイトで "ほぼ" 事足りる」の意味が分からんし、
「セル」がconsセルのことを指しているのなら4バイト=ポインタ1つでは足りないし。

一体、ここでいう「セル」は何を指しているんだ?
013995NGNG
>>137
御心配かけて誠にスミマセン。

>>134 では「3つのポインタが必要」と言っているのではなくて、
「3つのセルが必要」と言っているのです。
pair と car と cdr。計3つ。

これでどうでしょ?
0140デフォルトの名無しさんNGNG
pairってなんだ・・・??
頼むからもうちょっと説明をしてくれ。
014195NGNG
そんなに「セル」って言葉の使い方、変なのかな・・・
>>128 で紹介されていた葱メロンの FAQ でも、
それっぽい使い方をしているみたいだけど。
pair って単語も、ちゃんと >>128 に出ているし。
0142デフォルトの名無しさんNGNG
自分用語を使わず、面倒でもまわりくどい言い方で説明してくれyo。
あまりにも言葉足らずで、その単語が本当に本来の意味で使われているのかどうかすら判断できない。
0143128NGNG
用語には文脈ってもんがあるんだからさぁ。
Lisp界では、文脈無しで「セル」って言ったら
「consセル」=「pair」=「carポインタとcdrポインタの対」
と思われるだろう。まあ、>>95 がそう思わないとしてもだ、
ここは曖昧さを避けるために区別できるような言葉を使っては
くれまいか。

>>128 で紹介した文書には確かに「CAR cell」「CDR cell」
という言い回しが出てくるが、それはCDR codingの説明の
文脈であるって前提で、しかも最初に「CAR cell」「CDR cell」
と修飾して使ってるから意味が通るんじゃない。
個人的には、「slot」と言った方が混乱が避けられると思うがね。
0144デフォルトの名無しさんNGNG
>>139
> pair と car と cdr。計3つ。
> これでどうでしょ?

了解。安心しますた。

>>141
> そんなに「セル」って言葉の使い方、変なのかな・・・

いや、変じゃないんだけど、質疑の最初の頃、話がが全然噛み合って
なかったから、私はあなたの知識水準を思い切り低く見積もっちゃって、
これは consセルを指しているのだ、あなたが consセルを誤解してるのだ、
と思ってしまったんですよ。まあ、誤解は私のほうでしたね。申し訳ない。

あなたも、聞きたい答えを得るのに、たくさん説明しなきゃならなくて
大変でしたね。お疲れ様。
014595NGNG
>>142
>自分用語を使わず、面倒でもまわりくどい言い方で説明してくれyo。
む〜。難しいですね。とりあえずやってみます。

>>138
>「セル」がポインタ1つのことを指しているのなら「4バイトで "ほぼ" 事足りる」の意味が分からんし、
ここで「ほぼ事足りる」と書いたのは、
>>128 で言う "CDR-NORMAL" のような存在があるからです。
こいつは4バイトじゃ表すことが出来ませんからね。

>「セル」がconsセルのことを指しているのなら4バイト=ポインタ1つでは足りないし。
それを無理やり足りさせてしまう技法を "CDR-cording" と呼ぶそうです。
0146デフォルトの名無しさんNGNG
>>143
>個人的には、「slot」と言った方が混乱が避けられると思うがね。
なるほど、でも slot というとまた別のイメージが・・・
この手のものをあらわす正式な用語ってないんですか?

>>144
いえいえ、どういたしまして。
0147デフォルトの名無しさんNGNG
で、結局 >>127 の中で用いてる「セル」は「consセル」なの?「メモリセル」なの?どっちなのよ
0148デフォルトの名無しさんNGNG
もういいだろ
0149デフォルトの名無しさんNGNG
(gc)
0150デフォルトの名無しさんNGNG
(exit)
0151デフォルトの名無しさんNGNG
なんだ
うやむやにして終わりか
0152デフォルトの名無しさんNGNG
>>147
これはメモリセルと断言できると思うよ。実装の話をしてるわけだし。
0153デフォルトの名無しさんNGNG
(1 . 2) を表現するために必要なメモリセルは二つだと思うんだけどなんか間違ってる?
0154デフォルトの名無しさんNGNG
>>153
実装次第。
0155デフォルトの名無しさんNGNG
>>154
や、CDR-cording とやらを使わない普通の実装でもよ。
普通の実装の場合でもアトムならポインタ使わないでしょ。リストの時だけ使う。
常にポインタ使う実装もあるのかもしれないけどさ。
0156デフォルトの名無しさんNGNG
(1 . 2) をあらわす即値を用意すればいいのでは。
0157デフォルトの名無しさんNGNG
>>156
それには何バイトいるの?
0158デフォルトの名無しさんNGNG
>>157
実装次第。
0159デフォルトの名無しさんNGNG
>>158
156のテクニックは必要な領域を減らすことができるの?
0160デフォルトの名無しさんNGNG
もういいだろ!
0161デフォルトの名無しさんNGNG
(gc!)
0162デフォルトの名無しさんNGNG
釣られすぎー
0163デフォルトの名無しさんNGNG
xyzzy とかで lisp-interaction-mode だと
自動的にLispのインデントをしてくれますよね?
でも、*.l を開いた後、自動インデントにならないのです
*.l のときは、Lisp用のインデントをしてくれるように
設定したいのですが、方法をご存知の方いませんか?
ググって調べたいのですが、何で調べたらよいのかも
よくわからないのです。
0164デフォルトの名無しさんNGNG
describe *auto-mode-alist*
0165デフォルトの名無しさんNGNG
妙に書き込みがあると思ったら…

95は>>63を彷彿とさせるなぁ…
0166デフォルトの名無しさんNGNG
>>165
そうか?95 はちゃんとした人だと思うが。
当初の勘違いのせいもあって、コミュニケーションがうまく
行かなかっただけじゃないのか?
0167デフォルトの名無しさんNGNG
ところで、Lisp スレも現在 Part11 に至っているわけだが、
その間、スレの参加者は増えたのだろうか?
URLのパラメータがUNIX時間なので、その差分を取ってみた。

(define x '(1091456033
       1075630259
       1069594582
       1058263391
       1042167213
       1031560687
       1023091882
       1016211619
       1008220265
       1002584344
       987169286))

(let loop ((x x))
 (if (null? (cdr x))
   '()
   (cons (/ (- (car x) (cadr x)) 86400.0)
      (loop (cdr x)))))

結論:全く傾向なし。いや、増減なしと見るべきか?
Lisp 人口は生きた化石のごとく変わらないのであろうか?
0168デフォルトの名無しさんNGNG
>>146
ワード?
0169デフォルトの名無しさんNGNG
レベルは下がり続けているな。
0170デフォルトの名無しさんNGNG
未踏の lego 用 XS lisp って本当にいじってみた人いる?
Google で「面白そう」って意見は結構見るんだけど
おれは Lisp 入門者だけど実装側の勉強にもなるかな?
017180NGNG
>>83 >>85
情報サンクス。
λ計算の理論から導出される公式として覚えておけば良いものみたいですね。
情報数学知らなかったので助かりました。
0172デフォルトの名無しさんNGNG
>>164
サンクス
0173デフォルトの名無しさんNGNG
気付いたら>>95のヴォケのおかげで無駄レスが・・
0174デフォルトの名無しさんNGNG
陸上の末続選手はちょっと Shiro さんに似てると思った
0175デフォルトの名無しさんNGNG
>>174
ぜ、全然似てない…!!!
http://images.google.co.jp/images?hl=ja&lr=&ie=UTF-8&c2coff=1&q=%E6%9C%AB%E7%B6%9A
0176デフォルトの名無しさんNGNG
>>174 馬鹿だな、親戚だから似てて当たり前
0177デフォルトの名無しさんNGNG
>>71
マクロを使ったプログラムの互換性を保障したいためでしょ。
デファクトなんだし、仕様に取り込んでもいいと思うのだが。
Schemeマクロを実装するよりも、ずっと手軽に実装できるしな。
0178デフォルトの名無しさんNGNG
>>177
legacyマクロでプログラムの互換性を保障するのは難しいよ。
バッチコンパイルする処理系だと、マクロから呼んでる関数が
マクロ展開時にはまだ無いってことがあり得る。
え、eval-whenですか? それはちょっと…
0179デフォルトの名無しさんNGNG
eval-whenは必須でしょ
0180デフォルトの名無しさんNGNG
そんなマクロはうちの子じゃありません
0181デフォルトの名無しさんNGNG
eval-whenてなに?
0182デフォルトの名無しさんNGNG
>>181
黒魔術。
0183デフォルトの名無しさんNGNG
(expt float integer)

としたとき,ちゃんと (* float float float ...) と等価になりますか?
HyperSpac では (expt rational integer) のときしか書いてないような.

普段は (expt float1 float2) == (exp (* float2 (log float1))) だと書いてありますが,
2 乗や 3 乗のときは,これでは困りますよね.

不安なら整数用の expt を作る必要がありますか?
0184デフォルトの名無しさんNGNG
>>183
>2 乗や 3 乗のときは,これでは困りますよね.
なにが困るのか判らない。
0185183NGNG
>>184
2 回か 3 回の掛け算で済むことに,log や exp の計算
(級数などを使うのでしょうか?) をしてしまうのは不経済では,と思ったのです.
0186デフォルトの名無しさんNGNG
それは「困る」とは違うよね
0187デフォルトの名無しさんNGNG
>>183
処理系任せだろうね。真面目な処理系なら最適化してるんじゃない。
心配ならプロファイリングしてみれば。
というか、そんな細かいところを気にする前にベンチ取ってボトルネック
見つける方がいいと思うよ。
0188183NGNG
>>186-187
みなさんのお陰で考え方が分かりました.ありがというございました.

(expt rational integer) の場合が記されているのは,
速度ではなく型の問題なんですね.

> 心配ならプロファイリングしてみれば。
> というか、そんな細かいところを気にする前にベンチ取ってボトルネック
> 見つける方がいいと思うよ。

そうですね.言われるまでこういうことには気づきませんでした.
0189デフォルトの名無しさんNGNG
LISPって遅そうでめちゃんこ速いね
019044NGNG
数値 (float) が書かれたテキストを読んで,
それとソース内のリテラルとで算術演算する場合は,
リテラルの表記を *read-default-float-format* に合わせておくべき,
というより合わせなくてはならないのでしょうか.

もう頭が痛いです.ソース内のリテラルも *read-...-format* で読むと
不都合でもあるのでしょうか...

clisp で long-float する人たちは,
リテラル全ての箇所で coerce するなんて,そんな話はありませんよね?
0191デフォルトの名無しさんNGNG
必要なら全ソースを*read-default-float-format*で検索すれば
そのうちわかるんでは?
clispも企業に対して動作保障をしているわけではないし、
どの言語処理系も数値周りは手抜き工事していたり、
バグの温床だったりする可能性が高いので。
0192デフォルトの名無しさんNGNG
>>190
最終的な目的がなんなのかによるだろ
0193デフォルトの名無しさんNGNG
defineの挙動なんですが、top levelとそうでないときとで
動作が異なるってやつの実装がマンドクセえんですが

実際はどうやってんでしょう
フラグ?
019444NGNG
むむ,compile しないで実行すると warning が出ない.
compile の過程で勝手に single-float にされているのかな?

>>191
探してみましたが,.lisp と .d がソースの全てでいいんですか?
grep の結果が思ったより少ないんですが...
ところで .d って何なんでしょう?
ソース/emacs/d-mode.el まであるのに何かは不明なんです.

>>192
ちょっとファイルから読んで計算するだけです.
single-float では桁が寂しい感じがしたので,せっかくだからと
long にしただけなのに怒られた,というわけなんです.
0195デフォルトの名無しさんNGNG
>>194
>ところで .d って何なんでしょう?

>Most of the C code of CLISP is stored in files with extension '.d'. It _is_
>C code, but the file will be preprocessed a bit.

http://cvs.sourceforge.net/viewcvs.py/clisp/clisp/src/CodingStyle?rev=1.10

ECL とかでも使われてたと思う。何のメリットがあるかは知らない。
019644NGNG
今まで eval-when を使ったことが無かったのですが,
もしかしてと思い,

(eval-when (compile load)
  (setf *read-default-float-format* 'double-float))

としたら,問題無くなりました.コンパイル時にも,その後の実行の時も
double-float で読む,ということなんですね.
今までこんな便利なものも知らなくて問題を長期化させました.すみませんでした.
0197デフォルトの名無しさんNGNG
>>193
環境を見ればトップレベルかどうかはわかるよね。

internal defineはマクロとの絡みがややこしい。
実装者泣かせかな。
0198デフォルトの名無しさんNGNG
内部defineはふつー実行前にletrecに変換するでしょ
まともな処理系なら
0199デフォルトの名無しさんNGNG
Dr.Schemeで「独習Scheme三週間」で紹介されてるすべての構文を使用するには
どうすればいいの?
ドットリストで構文エラー出るよ・・・
0200デフォルトの名無しさんNGNG
>>199
ドットリストで構文エラー出るなんてありえねー
そのコードさらしてみ
0201デフォルトの名無しさんNGNG
>>199
Language → choose Language で Full Scheme
0202デフォルトの名無しさんNGNG
9月の言語はSchemeと決まっています.
0203デフォルトの名無しさんNGNG
8月の言語は何だったの?
0204デフォルトの名無しさんNGNG
Augustだ。
略してAda。
0205デフォルトの名無しさんNGNG
cl の loop が,*短ければ* 読みやすさも書きやすさも両立してて,
すごくいいことを知りました.
lisp らしくないからと拒んでいた自分が悲しいです.
; グレアム氏の入門書が偏っているせいかと w

ところで,ファイルを丸々 string にする方法を探していたところ,
make-string したところに read-sequence を
使って書き込んでいくやつを見つけました.
でも,これしか無いんですか?

get-output-string-stream の input-stream 版が無いのは残念ですね.
0206デフォルトの名無しさんNGNG
そうこうしてるうちにOnLisp邦訳も更新されてたね。乙
後2章か、がんがれ
0207デフォルトの名無しさんNGNG
http://www.itmedia.co.jp/mobile/articles/0409/02/news048.html
0208デフォルトの名無しさんNGNG
>>207
なんだかなぁ... すべてが痛々しい
0209デフォルトの名無しさんNGNG
>>205
骨格だけ。
with-outpt-to-string (out)
(loop for line = (read-line stream) do (write-line line out)
とか。eofをどうするか(whileにするかエラー捕まえるか)は好きにすれ。
loopはcollect intoとかfor acrossとかfinallyとか使い出すと妙に可読性が
上がるので結構多用してるカモ。Lispらしからぬ見た目になるけどね。
0210デフォルトの名無しさんNGNG
3年前はロン毛だったと記憶してるんだけど・・・これヅラだよね?普通に考えて。
0211デフォルトの名無しさんNGNG
>>209
read-line は改行を消してしまうね.
「行の区切り」を指定できるスペシャル変数があればいいのに.
; awk みたいだ...
0212デフォルトの名無しさんNGNG
学生時代に授業でSchemeをちょこっとやったんですが、
最近CommonLispをいじってます。
で、CLのlambdaなんですが

(lambda (x) (* x 2)) => error
#'(lambda (x) (* x 2)) => anonymous closure

これにすごい違和感があります。この「#'」はナニモノで
何故必要なんでしょう。
0213デフォルトの名無しさんNGNG
>>212
このページが大変参考になる。
http://www.ice.nuie.nagoya-u.ac.jp/~h003149b/lang/comparison.html
0214デフォルトの名無しさんNGNG
LISP-1か2の違い。
0215デフォルトの名無しさんNGNG
数ヵ月前に見た時もロン毛だったよ>ドクターT。

0216デフォルトの名無しさんNGNG
cmuclで関数の実行時間をはかりたいのですが、何を使うのが適当でしょうか?
変数にとりたいのですが、timeマクロは出力してしまうから使えず、
get-internal-run-timeは秒単位らしくて粗すぎて使えず、です。

0217デフォルトの名無しさんNGNG
>>216
(get-output-string-stream)
で作ったストリームで *standard-output* を let で上書き,,,でできますか?
0218デフォルトの名無しさんNGNG
cmucl でコンパイルすると,結果がおかしくなりました.

(let ((alist '((:file . "foo.txt")
(:bar))))
(with-open-file (istrm (cdr (assoc :file alist)))
(rplacd (assoc :bar alist) 6))
(format t "~S~%" (assoc :bar alist))
(format t "~S~%" (car (assoc :bar alist)))
(format t "~S~%" (cdr (assoc :bar alist))))

これは,clisp ではコンパイルしてもしなくても
(:BAR . 6)
:BAR
6
となりますし,cmucl でもコンパイルしなければ同じ結果になります.しかし,

# lisp -eval '(compile-file "foo.lisp")' -eval '(quit)'
...
# lisp -load foo.x86f -eval '(quit)'
(:BAR . 6)
:BAR
NIL

となります.cdr 部はどこへ行ってしまったのでしょうか.困ってしまいました... (⊃д`)
バージョンは以下です (起動時のメッセージの一部).
CMU Common Lisp CVS release-19a 19a-release-20040728 + minimal debian patches, running on
0219218NGNG
追記.with-open-file を外せば直ります.
0220デフォルトの名無しさんNGNG
>>218
リテラルリストを破壊的に変更しちゃいかんよ。
0221218NGNG
>>220
結果は処理系依存ということなんですか.
最初の alist を,
(list (cons :file "foo.txt")
      (cons :bar nil))
に変更すればいいのでしょうか.

こういうのを警告してもらう方法がありましたら教えてください.
0222デフォルトの名無しさんNGNG
(rplacd (assoc :bar alist) 6))
↓
(setf alist (cons (cons :bar 6) alist))
0223218NGNG
>>222
assoc で引かれることがないとしても,なんとなく違和感がありませんか?
こういうのを普通に感じるて初めて中級者なのでしょうか.
0224デフォルトの名無しさんNGNG
リテラルを書き換えちゃだめってのは別にLispに限らない、プログラミング言語
一般(とくにコンパイラが介在するもの)に言えることでしょう。
Cでも文字列リテラルには手は出せませんし。
0225デフォルトの名無しさんNGNG
> Cでも文字列リテラルには手は出せませんし。

んなこたあない。

普通はしないけど。
0226デフォルトの名無しさんNGNG
OS-9 の C言語処理系は literalが code module (だっけ?) に
置かれるので、書き換えちゃだめでした...

昔話かつ lispじゃないので sage
0227デフォルトの名無しさんNGNG
>>225
> > Cでも文字列リテラルには手は出せませんし。
> んなこたあない。

いや、んなことあるよ。
リードオンリーなセグメントに置かれるので、変更しようとするとbus errorになる。
そうしないとリテラルはプロセス間で共用することも実行ファイルを直接バッ
キングストアにしてmmapすることもできなくてメモリ利用上非効率。
よしんばそうでなくとも複数の同じ内容の文字列リテラルは一つにまとめられるので、
そういうものだと変更すれば当然悪影響が出る。
0228デフォルトの名無しさんNGNG
古き悪しきお行儀の悪いやつ用のコンパイルオプションも大抵用意されてはいるけどね
0229デフォルトの名無しさんNGNG
警告も何も出ない?
セルにimmutableフラグとか付いてないのか。
tinyschemeだか何かの処理系はそういうフラグがあって、
破壊代入するとエラーか何か出た記憶がある。
LISPの場合大抵は複製するから、個人レベルでは対策しなくても
あんま問題にはならないけど、時間置いて使うとたまにやってしまったりするな。
こういう場合の処方で処理系にセーフティレベル上げるとか何らかの
モードがある場合もあるが、実際は目先の速度に気を取られて
気付かない&あえて無視する可能性が高いんだよな。
結局デバッガ立ち上げて原因がわかると。
cmuclレベルの処理系なら何らかのオプションがあると思う。
0230デフォルトの名無しさんNGNG
InterLispって良く見るんですが、これはLisp方言の一種ですか?
それともCL実装の名前ですが?
0231デフォルトの名無しさんNGNG
http://foldoc.doc.ic.ac.uk/foldoc/foldoc.cgi?Interlisp
0232デフォルトの名無しさんNGNG
>>217
折角教えていただいたのですが、出力文字列を解釈しなくちゃいけなくて大変そうで、
unix-gettimeofdayでusecをとってごまかしてしまいました。
プロセス時間じゃなくて実時間ですが。
経験値を上げてもうちょっと賢くなったらトライしてみます。
0233デフォルトの名無しさんNGNG
WindowsでLISPでマルチメディアが扱える
処理系ってないのでしょうか
0234デフォルトの名無しさんNGNG
マルチメディアってなんなんやー?
0235デフォルトの名無しさんNGNG
メディアが複数同時に使えることでは?
0236デフォルトの名無しさんNGNG
フロッピーとハードディスクのファイルを読み書きできるとかか。
0237デフォルトの名無しさんNGNG
クイックディスクを忘れないで欲しい。
0238デフォルトの名無しさんNGNG
えっと、lispacheの苫米地氏とオウム事件「逆洗脳」の苫米地氏って、
同じ人なんですか??
0239デフォルトの名無しさんNGNG
>>234-238
おまえら、いい加減にしろw

>>233
やっぱりACLじゃないの?
なんでもできそうだけど。
0240デフォルトの名無しさんNGNG
gauche用のsdlラッパというのが一番ありがちなパターンに見えるなあ
0241デフォルトの名無しさんNGNG
>>233
LISPならxyzzy,SCHEMEならHandySchemeのMCI関数でどうよ?
0242233NGNG
ACLインストールしました
HandyScheme は知りませんでした
なんかゲームの挙動をLISPで書いて
細かい部分をCで書いて、みたいな
ことを考えてるんですけど・・・
とするとgauche の sdlラッパというのがよさげですね
有難うございました
0243デフォルトの名無しさんNGNG
>>238
t

>>233=242
Corman Common Lispも見てみれば? IDE使わなきゃ無料だしWindows APIと
仲良くするのも結構得意だというのを聞いた希ガス。実体験ではないので本当のトコロが
どんなもんか知らんけど。
マニュアル眺めた限りではDLL作ったりとかインラインアセンブラ使ったりとかWindowsが
主環境であればそれなりに使えそうだったよ。SDLも誰かライブラリ作ってたはずだし。
0244233NGNG
>>243
有難うございます
いつも不思議に思うのですが
私も結構Lisp関連のサイトをこまめに
調べてはいるのですがそういう情報にたどり着けない・・・
どこでそういう情報を得るのですか?
英語圏を調べろってことですかね・・・欝
0245デフォルトの名無しさんNGNG
Cormanは日本語が通らないのが難点。ゲームとか作るんなら要らないかも知れないが。
それとも今は通るようになったのかな?
0246243NGNG
どこでって普通にググるとかcomp.lang.lisp読むとか。
英語圏避けてたらLisp関連サイト調べてないのとほぼ等価と思われ。
ってか折角ただでいろんな情報転がってるのに自分で枠狭めてちゃもったいない。
RCE関連サイトにはロシア語圏にディープなのが多いね。
0247デフォルトの名無しさんNGNG
Arcの話題ってこことは違う?
0248デフォルトの名無しさんNGNG
ここでいいんじゃないの。何か進展あった?
0249デフォルトの名無しさんNGNG
slime 1.0
ttp://common-lisp.net/project/slime/
0250デフォルトの名無しさんNGNG
gaucheってそもそも Windows に正式対応してたっけ?
Windows 2000 + cygwin でなんとかコンパイルできる段階みだいだけど、
ちゃんと使えてる人いる?


0251デフォルトの名無しさんNGNG
XP + Cygwin でとりあえず gosh が起動しますが
それ以上の確認はしてないっす
0252デフォルトの名無しさんNGNG
普通に使える
GLも使える
問題なし
0253デフォルトの名無しさんNGNG
>> 251-252
有難う。
どうやら、家のCygwinは古いようなので新しいやついれて
ためしてみます。
0254デフォルトの名無しさんNGNG
今日はFranzセミナーですね。終わったら報告キボンヌ
0255名無しさん@NGNG
前から気になってたんですが、CLOSにはコンストラクタってないんでしょうか?
0256デフォルトの名無しさんNGNG
:initformじゃだめ?
だめなら make-instanceをオーバーライド。

0257デフォルトの名無しさんNGNG
gauche-sdl
http://michaelvess.com/text/index.html?section=code
0258デフォルトの名無しさんNGNG
Win XP + ACL 6.2 + slime 1.0 + Meadow-2.10-dev (ASAGAO)
を使っているんですが、日本語が表示できる設定おしえてください。


0259デフォルトの名無しさんNGNG
>>256、に限らず
:initformと:initargsって何か使い分けるのに明確な基準とかある?
make-instanceをオーバーライドするんじゃなくてmake-fooみたいなのdefunして
その中でmake-instanceして細工したオブジェクト返すのはよくやるけど、CLOS的には
ダサいっすか?
0260デフォルトの名無しさんNGNG
ダサいというより、しっかりドキュメントしとかないと(していても)忘れそうじゃない?
間違ってmake-instance単独で使われたときに検出してエラーを出すようにしないと、
しばらくたって保守するときとかにやばそう。
0261デフォルトの名無しさんNGNG
>>255
> 前から気になってたんですが、CLOSにはコンストラクタってないんでしょうか?
どの言語のコンストラクタを想定しているのか分からないけど、make-instanceが
それにあたのるのかな。あるクラスに固有の初期化はそのクラスに特化した
make-instance(やinitialize-instance, reinitialize-instanceなど)のメソッドを
定義して行います。

>>259 :デフォルトの名無しさん :04/09/10 00:40
> >>256、に限らず
> :initformと:initargsって何か使い分けるのに明確な基準とかある?
スロットオプションの:initformと:initarg、それとクラスオプションの
:default-initargsにはそれぞれ微妙な使い分けの基準となりそうな違いが
あります。

簡単に言ってみると、
:initformは、あるスロットの初期値だけを指定するのに使う。
:initargは、initialization argumentの宣言に使う。
:default-initargsは各スロットの初期値の指定と、初期化メソッド群が
とるinitialization argumentのデフォルト値を一箇所にまとめて指定するのに使う。
つまり、必ずしもスロットの初期化に直接かかわらないものも指定できる。
initialization argumentを宣言したことにはならない。

initialization argument名の宣言がされていると、make-instanceと
その手下である関数が呼び出された時に、引数チェックに引っかからなくなる。

規格のココを読むと書いてあります。
7.1 Object Creation and Initialization
http://www.lispworks.com/reference/HyperSpec/Body/07_a.htm
0262233NGNG
gauche Windowsで使う方法がいまいちわからない・・・

ところでこういうCのライブラリのラッパをSchemeで
使えるようにする手順て以下のようなものでしょうか

(1) C でgauche から呼ぶためのdllを作成
(2) gauche から それを呼び出す

(2)の方法が良くわからないのですがCのライブラリに
gaucheからアクセスするのは簡単なのですか?
だとしたら自分で使いやすいようにラッパを作っても
いいんですけどね・・・
0263デフォルトの名無しさんNGNG
>>262
Gauche は examples/spigot/ が参考になるかと
0264233NGNG
>>263
(2)は define-module, select-module, dynamic-load, provide
の手順でいけるんですね
gauche が理解できる形でstubというのを作ってそこから引っ張るんですね
なんとなくわかったような・・・

@GOSH@ ってのは そのstubというのをつくるコマンドですか?
GOSH getstub $<
スタブとか言葉は聞いたことあるけど実はあんまりわかってないw
0265264NGNG
gauche インストールしました
gosh ってgouche のリスナーの名前だったんですね・・・
お恥ずかしい
0266デフォルトの名無しさんNGNG
>>258
(process-send-string proc (string-make-unibyte string))
string-make-unibyte してちゃ日本語は無理だよな。
さて、どうするか
0267デフォルトの名無しさんNGNG
>>258 266
とりあえず、次ので日本語できたっぽい。
Mac OS X, OpenMCL でだけど
diff -r1.397 slime.el
1430c1430
< (set-buffer-multibyte nil))
---
> (set-buffer-multibyte t))
1439c1439,1440
< (let* ((msg (concat (slime-prin1-to-string sexp) "\n"))
---
> (let* ((msg0 (concat (slime-prin1-to-string sexp) "\n"))
> (msg (encode-coding-string msg0 'euc-jp-unix))
1442c1443
< (process-send-string proc (string-make-unibyte string))))
---
> (process-send-string proc string)))
1502c1503,1504
< (let ((string (buffer-substring start end)))
---
> (let* ((string0 (buffer-substring start end))
> (string (decode-coding-string string0 'euc-jp-unix)))
0268デフォルトの名無しさんNGNG
うおおお
sortがでけた
0269デフォルトの名無しさんNGNG
Corman Lispの作者のCormanさんから宣伝メールが来たよ。
Lispの処理系売って食ってくというのは苦労してるんかね。
とにもかくにも日本語がちゃんと扱えないことにはねえ。
0270デフォルトの名無しさんNGNG
前から思っていたんだけれど、
スペシャルフォームをファーストクラス・オブジェクトにすることはできない
だろうか?
スペシャルフォームを引数にとったり、関数の戻り値としたりできないだろうか?

> or
<#special form>  <-- 通常なら syntax error
> (or #f 3)
3

こんな感じで、スペシャルフォームが単独で入力されても文法エラーに
ならないようにすれば、うまく行くような気がするのだけど、どうでしょう?
0271デフォルトの名無しさんNGNG
>>270
Gaucheだとできてしまう。

gosh> set!
#<syntax set!>
gosh> define
#<syntax define>
gosh> (define hoge #f)
hoge
gosh> (set! hoge define)
#<syntax define>
gosh> (hoge x 1)
x
gosh> x
1
0272270NGNG
ええー!Gauche って便利なのね。すごーい!

と言うか、なんで PetiteChezScheme だとできないのだろう??
何か不都合があるのでしょうか?
使えるほうが、絶対便利だと思うのだけど。
0273270NGNG
すると Gauche では、こんなこともできちゃうのでしょうか?

gosh> ((lambda (x y) (x #f y)) or 3)
3

スペシャルフォームは、car の位置にきたときだけ機能するようにすれば
こういう書き方も ok だと思うのだけど。
0274デフォルトの名無しさんNGNG
もはやGaucheは、かつてgccがCじゃなかったくらいにschemeじゃない気がする。
gccの場合はしばらくしたら標準が追い付いてきたので、
schemeもあと十年くらい待てば>>270みたいのが標準で使えるようになるかもよ。
0275デフォルトの名無しさんNGNG
>>273
やってみた。

gosh> ((lambda (x y) (x #f y)) or 3)
*** ERROR: invalid application: (#<syntax or> #f 3)
Stack Trace:
_______________________________________
gosh> (let ((hoge or)) hoge)
#<syntax or>
gosh> (let ((hoge or)) (hoge #f 3))
*** ERROR: invalid application: (#<syntax or> #f 3)
Stack Trace:
_______________________________________

意外とよわよわだったな、Gauche……。
0276270NGNG
>>275
あれれ、残念。
shiro さん、もし見てたら、ご検討お願いします。
0277デフォルトの名無しさんNGNG
guile> ((lambda (x y) (x #f y)) or 3)
3

できました
0278270NGNG
>>277
おお!さすが何でもありの Guile!
0279デフォルトの名無しさんNGNG
それにしても、こんなに便利そうなのに、どうして標準になっていないのだろう?
何か問題があるのだろうか?
0280デフォルトの名無しさんNGNG
そりゃSchemeが便利ならなんでもありとは対極にあるような言語だからだろ
0281デフォルトの名無しさんNGNG
マクロの展開についての根深い対立が…。
0282デフォルトの名無しさんNGNG
夢の中で問題点を一つ思い付いた。関数はまず全部の引数を評価してしまうが、
syntaxはそうではない。わかりやすいところではand, or, begin, ifなど。

(define foo #f)
(or #t (begin (set! foo 3) foo))
とこれ↓を比べてね:
((lambda (x y) (x #t (begin (set! foo y) y))) or 3)

そう考えるとトップレベルでのみ別の名前に束縛できるというのは
それなりに意味があるかも。
しかしguileだと後者も難なくこなしてしまうようだ。どうなっとるんだ。

guile> (define foo 1)
guile> ((lambda (x y) (x #t (begin (set! foo y) y))) or 3)
#t
guile> foo
1
guile> ((lambda (x y) (x #t (begin (set! foo y) y))) and 3)
3
guile> foo
3

きっと、こんなことやってるからguileは遅いんだな……。
0283デフォルトの名無しさんNGNG
>>279
(or a b) はaがtrueならbが評価されないってところが大事なところでしょ。
手続きとして使いたければormapとかanyとかあるわけだし、自分でも作れる
わけだし。
構文は、実行前に意味が確定できることが肝なんであって、>>277みたいのを
標準にする意義がわからん。


0284270NGNG
>>282
すばらしい!Guile のその挙動こそ、私が望んでいたものです。

>>283
それが、『Scheme手習い』の「lambdaは最高だ」に、スペシャルフォームを引数に
取れたら非常にシンプルに書けるような例が出ていたのです。
(実際はできないから、本では相互再帰を行って何とか解決していた)
0285270NGNG
>>282
Guile の実装はぜんぜん知りませんが、
きっとスペシャルフォームを実行するのは car の位置に来たときだけ、という
ルールでやっているのじゃないかなあ。

そんなに速度も落ちないのじゃないかと思うのだけど。
0286デフォルトの名無しさんNGNG
実行時に展開と評価時に展開じゃ速度にかなり違いが出るような気が。
0287デフォルトの名無しさんNGNG
"special formを実行する" のは構文を parseするときではないのか?

>>277みたいなのは parseするときに決まってないんだからだめじゃん。

Haskellの世界にでもくれば shortcutなんかわざわざ意識しないでいいよ :-)
0288270NGNG
うー、そういう問題があるのですか…。

スペシャルフォームを引数に取れると便利だという例をちょっと
書いてみました。
関数と違い、すべての要素を評価しないスペシャルフォームなので、
途中で結果がわかれば、リストを最後まで評価せずに止まります。

テストはしておりませんので、バグっていたらごめんなさい。

;関数を返す関数。引数に and か or を取る。
(define make-function
 (lambda (s-form)
  (lambda (list0)
   (s-form (atom? (car list0))
       ((make-function s-form) (cdr list0))))))

;リストにアトムが含まれるか?
(define has-atom? (make-function or))

;リストの要素がすべてアトムか?
(define all-atom? (make-function and))
0289270NGNG
もしかして、Haskell のように遅延評価がデフォルトだと、
スペシャルフォームのほとんどは不要になるのでしょうか?
0290デフォルトの名無しさんNGNG
>>274
標準 (R5RS) では未定義あるいは実装依存とされている領域を利用しているだけだから
scheme ⊃ Gauche だよ
0291デフォルトの名無しさんNGNG
ふと気づいたのだけど、マクロもスペシャルフォームの一種だよね?
Guile って、マクロも実行時に展開しているんだろうか?
だとしたら、遅いのも道理だなあ…。

どなたかGuileユーザの方、確かめていただけませんか?
0292デフォルトの名無しさんNGNG
guile> (define-syntax my-or
    (syntax-rules ()
     ((_ x y) (or x y))))

guile> ((lambda (s-form y) (s-form #t (display y))) my-or 3)

これを試していただけませんか?
#t が返ってくるなら、マクロを実行時に展開していると思う。
0293デフォルトの名無しさんNGNG
>>292
Unbound variable: define-syntax
とか怒られた。
0294デフォルトの名無しさんNGNG
あれ?当然エラーは 2つ目の式で出たんですよね?
1つ目のdefine-syntax の式の実行で出たのではないですよね?

するとやはり Guile は他と同じで、パース時にマクロを展開するのかな?
0295293NGNG
>>294
ごめん。(use-syntax (ice-9 syncase))忘れてた。
2つめの式で
ERROR: invalid syntax my-or
って出た。
0296デフォルトの名無しさんNGNG
了解。いずれにせよ、マクロ展開は実行時ではなく、解釈時なのね。
どうもありがとう。

そうしてみると、first class objectとして扱える special form はGuile の
場合、システム組み込みのものだけなのか。
ユーザ定義のマクロと、システム組み込みの special form を区別せずに扱えるのが
Lisp の良さの一つなのに、これでは価値半減だなあ。
実行してみるまで区別がつかないから、わかりにくいバグの元にもなりそうだ。

これなら、special form に別名を付けることしかできない Gauche の方が現実的な
落としどころのような気がする。

special form を first class として扱うためには、マクロ展開を実行時に行っても
構わないような、マシンパワーのあまりある時代を待つしかないのかもしれない。
0297デフォルトの名無しさんNGNG
まてよ。Gauche でも、マクロには別名は付けられないよね?
(define new-or my-or) は syntax error になると思う。

すると、ChezScheme のように、special form を一切拡張しないのが一番
現実的なのだろうか。何か寂しいなあ。
0298デフォルトの名無しさんNGNG
Gaucheではできる。Gaucheでは、コンパイル時に(手続き呼び出しではなく)
マクロだとわかるものならマクロ展開をしてくれるし、マクロの名前は
マクロそのものを返す。(define new-or my-or)も可能。

syntax classをapplicable objectにして、実行時に展開したら
おもしろいかも。evalが必要になるし、トップレベル以外の環境は
取得できないから無理だろうけどさ。
0299デフォルトの名無しさんNGNG
>>270
そういうのはマクロでやる。
実際、make-functionのコンパイル時にはs-formが構文かどうかは
わからないわけだから、コンパイラは ((make-function s-form) (cdr list0))
を評価してからs-formを呼ぶってコードを出すしかないじゃん。

>>287
Lazyなセマンティクスなら評価順の問題は出ないけど、「構文を
パラメタライズする」っていうのはもっと広い問題を含んでる。
Haskellでも、構文要素である '\' や '=' を関数引数として
渡すわけにはいかない。
構文のパラメタライズってのはメタプログラミングしてることになる。
Lispではマクロがメタプログラミングの道具。

0300270NGNG
>>298
やっぱり Gauche はバランスがよく取れているということなのでしょうか。


>>299
そうか!マクロか!と思って、さっそく>>288 のコードをマクロ化してみました。

;元の関数
;(案の定バグがあった(停止しない)ので修正してある。)
(define make-function
 (lambda (s-form null-value)
  (lambda (list0)
   (if (null? list0)
     null-value
     (s-form (atom? (car list0)
         ((make-function s-form null-value) (cdr list0))))))))

;マクロ化したもの
(define-syntax make-function
 (syntax-rules ()
  ((_ s-form null-value)
   (lambda (list0)
    (if (null? list0)
      null-value
      (s-form (atom? (car list0))
          ((make-function s-form null-value) (cdr list0))))))))

そうしたら、マクロ展開が停止しないんです。再帰的定義なのに停止条件がないから。
この場合、どう書いたらよいのでしょうか?ヘタレですみません。
0301270NGNG
『On Lisp』邦訳 10 マクロのその他の落し穴 10.4 再帰(P81)を読んでみました。
思ったより、解決は難しそうです…。
0302デフォルトの名無しさんNGNG
>>300
> やっぱり Gauche はバランスがよく取れているということなのでしょうか。

つーより、事前にコンパイルするんじゃguileみたいな挙動は不可能じゃね?
S式をそのまま解釈実行するのでないと。当然その場合実行速度は遅くなる。
0303デフォルトの名無しさんNGNG
なんか似たような話を見たことあるなあ……と思ってたんですが、
これなんか参考になりませんか? Common Lisp だけど。

ttp://home.comcast.net/~bc19191/blog/040527.html
0304デフォルトの名無しさんNGNG
>>270
実行時の停止条件と展開時の停止条件をごっちゃにしてると思われ。
停止を実行時に判断するなら、ループは実行時手続き呼び出しになる。

(define-syntax make-function
(syntax-rules ()
((_ s-form null-value)
(rec (f list0)
(if (null? list0)
null-value
(s-form (atom? (car list0))
(f (cdr list0))))))))

recはsrfi-31ね。letrecを使ってもよい。

停止を展開時に判断する場合は、実行しないでも停止条件がわかる
ことが必須。たとえば引数がリテラルリストで与えられているとか。
その場合はsyntax-rulesで再帰を書けばいい。

(syntax-rules ()
((_ s-form null-value val0)
(s-form (atom? val0) null-value))
((_ s-form null-value val0 val1 val2 ...)
(s-form (atom? val0)
(make-function null-value val1 val2 ...))))





0305270NGNG
ありがとうございました。言われてみれば『On Lisp』そのままの話でしたが、
具体的に書いていただくまで分かりませんでした。お恥ずかしい。

rec という構文は初めて知りました。
ChezScheme ではそのままでは動かなかったので、少し変えました。

;; rec 版
(define-syntax make-function
 (syntax-rules ()
  ((_ s-form null-value)
   (rec f
    (lambda (list0)
     (if (null? list0)
       null-value
       (s-form (atom? (car list0))
        (f (cdr list0)))))))))

;; 名前つきlet (letrec)版
(define-syntax make-function
 (syntax-rules ()
  ((_ s-form null-value)
   (lambda (list0)
    (let loop ((list0 list0))
     (if (null? list0)
       null-value
       (s-form (atom? (car list0))
        (loop (cdr list0)))))))))

(define has-atom? (make-function or #f))

(define all-atom? (make-function and #t))
0306270NGNG
今回は本当に勉強になりました。
今まで、special form が first class でない理由がずっとわからなかったの
ですが、答えはこうだったのですね。「マクロがあるから」

first class というのは関数抽象に関する概念で、special form は構文であるから、
そこには収まらない。それを扱うのは構文抽象の手段であるマクロ。

漠然としていますが、こういう理解でよろしいでしょうか。

以前 ruby の matz 氏が、マクロでできることはほとんど高階関数でできてしまう
と言っていましたが、決してそうではないですね。

今までマクロと言うと、パワフルだが汚いという負のイメージが強かったのですが、
今回それが変わりました。むしろ、関数抽象と補い合って Lisp の総体を支える
本質的なものだと感じました。今後もっとマクロを深く知りたいです。

ありがとうございました。
0307デフォルトの名無しさんNGNG
高尚なネタで盛り上がってるとろこスマン。
BKNL,TBNL,IMHO,UncommonWeb,AllegroServe+WebActions,CL-HTTPといろいろある
ウェブサーバ on CLなモノタチのなかでこのスレ住民のお勧めはどれなのか教えて欲しい。
できれば理由も。処理系はACLかCMUCLの予定です。
0308デフォルトの名無しさんNGNG
>>307
おれも知りたいな
ACL の WebAction はセミナー聞いただけだと
そう良くも悪くもなさげだった、ほとんど Apache Struts の焼直しって感じだけど
他のも Web 「アプリケーション」サーバーなのかしら?

0309デフォルトの名無しさんNGNG
スレの内容が高度すぎる…
初心者スレは良かった…
0310デフォルトの名無しさんNGNG
ちっとも高度じゃないよ。
分からないうちは飛ばしとけ。
0311デフォルトの名無しさんNGNG
>>309
大丈夫。あきらめなければそのうち、ちゃんとわかるようになるから。
シンプルなのが Lisp の身上。
スレの過去ログの、昔読んで分からなかったところが、少したつととても面白く
読めるようになります。経験者は語る。

-------------------
新山氏の日記に、久しぶりに Lisp のことが書かれている。
http://tabesugi.net/memo/2004/92.html#150242

新山氏は相変わらず冴えてます。読んで「うわー、そういう感じ、よく分かる」
と思った人も多いのではないだろうか。
0312デフォルトの名無しさんNGNG
>>306
> マクロでできることはほとんど高階関数でできてしまう

そこで高階関数と言っているのは、評価したくないコードブロックをラムダで
括ってしまうということを言ってるわけで、>>300 の前半の関数版に対して

;リストにアトムが含まれるか?
(define has-atom? (make-function (lambda (a b) (or a b)) #f))

と書けばよい、ということじゃない?
0313デフォルトの名無しさんNGNG
>>311
>「うわー、そういう感じ、よく分かる」
Lisp側から見て? それともPython側から?
ちなみに俺はSchemeもPythonも好きで両方使ってるけど,
Lisp側の意見はあまり共感できないなぁ.(マクロまんせーには同意するけど)
0314311NGNG
>>312
確かに引数として与えたとき or は評価されないけれど、has-atom? の内部で
or ではなく、or に似た働きの関数になっちゃうでしょ? or に与えたい引数
の両方をまず評価してしまうから、リストを最後まで評価しないと止まらない。

>>313
Python 側。と言うか、外から見た Lisper の雰囲気。(私は Python 知らないので)
0315312NGNG
>>314
あーそうか

(define make-function
  (lambda (operator null-value)
  (lambda (list0)
  (if (null? list0)
  null-value
  (operator (lambda () (not (pair? (car list0))))
  (lambda () ((make-function operator null-value) (cdr list0))))))))

(define has-atom? (make-function (lambda (a b) (or (a) (b))) #f))

こんな感じでどう?もしかしてまた勘違いしてるかな
0316デフォルトの名無しさんNGNG
>>315
今度はOK。つうか、煩雑で最初はよく分からんかった。
分かりやすいよう、遅延評価に直せるところを書き直してみた。
(かえって分かりづらい?)
やっぱりマクロのほうが分かりやすいと思う。

;;遅延評価版
(define make-function
 (lambda (operator null-value)
  (lambda (list0)
   (if (null? list0)
     null-value
     (operator (delay (atom? (car list0)))
          (delay ((make-function operator null-value) (cdr list0))))))))

(define has-atom? (make-function (lambda (a b) (or (force a) (force b))) #f))


それにしても、関数型言語方面の人が「Lispで遅延評価など書いておれるか!」と言ってるけど
気持ちがわかったような気がする。やっぱり煩雑だよね、これ。
0317デフォルトの名無しさんNGNG
リストの評価が途中で止まるのは、いずれもspecial form である or のおかげ
なのだから、or をそのまま渡せるマクロのほうが、はるかに自然。

or に仕事をさせるために、lambda や delay で囲んで、引数の強制的な評価を
回避させなければならない高階関数は冗長。
0318デフォルトの名無しさんNGNG
細かい話だけど、それぞれ1個目の delay と force 、要らないじゃん。
0319デフォルトの名無しさんNGNG
special-formをfirst-classにするってことは,
実行時にマクロ展開を行わせることになるよね.
そうすると静的スコープがグチャグチャになるような,ならないような….
あぁ,メタメタしてワケ分からん.

ところで,暗黙のforceを実装した処理系ってある?
暗黙のforceを実装してれば,遅延評価版>>316とかは,delay一つでよくなる.
0320312NGNG
>>318
そうだね、 or の第一引数はかならず評価されることが決まってるから
delay する必要はないのか

>>316-317
冗長で分かりにくい、こんなコード書きたくも読みたくもない、というのはもちろん同意。
今回意地になってしまったのは >>306 の

> 以前 ruby の matz 氏が、マクロでできることはほとんど高階関数でできてしまう
> と言っていましたが、決してそうではないですね。

に反論したくなっただけdeth。テヘ
0321デフォルトの名無しさんNGNG
>>320
> 以前 ruby の matz 氏が、マクロでできることはほとんど高階関数でできてしまう
> と言っていましたが、決してそうではないですね。

これ,orとかの評価を遅延させるためのマクロのことを念頭に置いてるんですかね.
「できる」と「やりやすい」は違うし,だいたい,できないこともおおいじゃん...
0322デフォルトの名無しさんNGNG
やりやすくないとやりたくない.
0323デフォルトの名無しさんNGNG
>>321
マクロでしかできないことってどういうものがありますか?
マクロは興味はあってもとっつきにくいなあと思っています。
教えてもらえるとイメージが湧くかも。
0324321NGNG
http://www.shiro.dreamhost.com/scheme/wiliki/wiliki.cgi?Scheme%3a%a5%de%a5%af%a5%ed%a4%ce%b8%fa%cd%d1
マクロの応用方法を分類して解説しているので,参考になるのでは.

「宣言的コードにみせる」や「ミニ言語のうめこみ」あたりが
美しいマクロの使い方だとおもいます.
0325デフォルトの名無しさんNGNG
>>321
まさに去年の今頃、似たような話をしていた記憶が。懐かしい。
ちなみに matz 氏の発言ていうのはこの辺。
ttp://www.rubyist.net/~matz/20030915.html

何となくだけど、matz 氏の意図しているところは
「dolist って for-each でいいじゃん?」ていう程度の話な気がする。
遅延評価がどうとか call-by-name がどうとかってところまでは風呂敷は広げてない感じ。
0326321NGNG
ああ,これって算符の記でやってた議論なんですね.しらなかった(赤面)
両者のスタンスの違いがよくわかりますた.
0327デフォルトの名無しさんNGNG
評価を遅延させるだけの目的でマクロを使うのはよくないと思う.
引数が評価されるかどうかが定義を見ないと判らないわけで,
むしろ可読性を損なっている気がする.
マクロはマクロを使わないとできないこと,例えばdefineを拡張して
パターンマッチできるようにするとか,そういう目的で使うべき.
0328デフォルトの名無しさんNGNG
Common Lisp使ってCみたくメモリ上のビット単位まで意識したコードって簡単に
書けますか? 書けるとしたらその方法が知りたいです。memory mapped I/Oの操作
みたいな低レベルな操作ができるのかな、ってのと、やっぱりそんな処理はCでヤレ、
そもそもLisp使ってやる内容じゃないだろ、って結論しかないのかを教えてくれるとうれしい。
0329デフォルトの名無しさんNGNG
素人でスマンが、Cで簡単に拡張ライブラリが書けるような
Lisp処理系を使う、って答えになるんじゃなかろうか。
0330デフォルトの名無しさんNGNG
最近の主なLisp処理系ならFFIでCのコードを呼べて楽よ。
>>328みたいなこともやればできそう。
でも分野的に、Cで書く方が直感的でメンテもしやすい気がしなくもないので、
そういうコードをCで書いてFFIで使うというのがいいんじゃないかい。


0331328NGNG
レスどうもです。やっぱりFFI使ってCで書くのが定石なんですね。
Cltl2眺めててbit-vectorのオブジェクトの存在するアドレスを物理メモリにマップできれば
もしかして・・・と思ったのですが違ったようです。LispMachineとかだとできたのかなぁ。
データの圧縮とかビットマップインデックスみたいに素のLispが提供していないメモリ上のデータ構造を
ゴリゴリ扱いたいなぁ、と思ったらLisperの取る道はFFIしかないんですかね。それともマクロで
抽象化してarray :element-type (unsigned-byte 32)の上で操作するのでしょうか。
0332デフォルトの名無しさんNGNG
物理メモリにmapするには、もひとつOSの助けも必要だと思われ。
Linuxはユーザ空間にmemory mapped I/Oをmapできたんだっけか。
ユーザ空間にI/OをmapするAPIと、具体的な仮想アドレスのreferenceを
取得できるAPIをFFIで書いたらできるのかな。
0333デフォルトの名無しさんNGNG
結局そういうインタフェース作ったとして問題は参照方法だろ
さすがにメモリ走査とかはポインタないと辛い
Cでやった方が全然楽だし速いよ

(let (ptr (make-integer-ptr mem)) ;; ポインタの作成
(ref ptr) ;; 参照
(deref ptr value) ;; 逆参照
(inc ptr)

こんなことやってられっか?
実際は型の問題もあるし、もっと煩雑になる
そもそも演算子がないのが痛い

int *ptr = mem; // ポインタの作成
&ptr; // 参照
*ptr = value; // 逆参照
++ptr;

やっぱ記述量が割に合わない
0334デフォルトの名無しさんNGNG
餅は餅屋
0335328NGNG
はぅあ。袋叩きにあってしまいましたな。記述量が割に合わないとかLisp向きじゃないよなぁ
とは思いながらも知らない世界があるかも程度の好奇心で聞いただけなのでした。

>>334 餅は餅屋
御意。いまも仕事でLispのコード書いてたんだけど、Lispで書いてるととにかく楽なんで
何でもかんでもLispで書けないかなとか思った私が阿呆でした。
どうでもいいけど、みんなこんな時間まで何やってんの?皆もデスマ?
0336デフォルトの名無しさんNGNG
Schemeで名前空間で名前を分類するようなことをしたいのですが、どういう方法を
取ればよいのでしょうか?
C++でnamespaceでモジュール全体を囲って名前の衝突が起きないようにして、
using namespaceで名前空間を使うというようなことです。
名前空間を階層化したりもしたいのです。
0337デフォルトの名無しさんNGNG
標準的な方法はないから
toplevelをletか何かで包んで必要な名前だけ外部に出すとか

(define proc1 #f)

(let ()
(define (proc1-sub1) ... )
(define (proc1-sub2) ... )
(set! proc1 proc1-sub1)) ;; export

あとは処理系依存だから、付属のマニュアルでも嫁
0338デフォルトの名無しさんNGNG
>>328
>>338 の言う通り、やってできなくはないと思う。mapしたアドレス値を
取得するのと、そのアドレスにアクセスするプリミティブは処理系
依存になるが。だがCでポインタを扱いなれてると、Lispでのアクセスは
冗長だね。マクロが使えることはメリットだけど。

0339デフォルトの名無しさんNGNG
>>336
処理系依存でよければmoduleシステムやなんやらを使うのがいいでしょう。

どうしてもportableでやりたいなら、top levelの束縛を変更する関数を
マクロで置き換えて、ほげほげとか。
って、top levelの束縛をマクロにするのはR5RS的にはだめなんだっけか...
0340デフォルトの名無しさんNGNG
スペースで区切られたテキストが以下のようにあったとして
A B C
D E F
↓(変換)
A
D

B
E

C
F

みたいな文章に整形するプログラムを作ろうと思ったのですが
いまいちエレガントにかけません
読み込むテキストファイルを"test.dat"として
以下のように書きました

(with-open-file (in "test.dat" :direction :input)
(let ((buff)
(str1)
(str2)
(str3)
(vstr))
(while (setq buff (read-line in nil))
(setq vstr (split-string buff "\t"))
(setq str1 (concatenate 'string str1 (first vstr) "\n"))
(setq str2 (concatenate 'string str2 (second vstr) "\n"))
(setq str3 (concatenate 'string str3 (third vstr) "\n")))
(format t "~A\n~A\n~A\n" str1 str2 str3)))

誰かアドバイスください・・・
0341デフォルトの名無しさんNGNG
縦読みデコーダでも作るの?
0342340NGNG
>>341
そんな大層なものではなくて
練習用に書いているのですが・・・

上の例では3列と固定しているところを可変で
対応できるようにしたいのです
str1,str2,str3 とかやるのは格好悪いし・・
もっとすっきり書けませんかね?
0343デフォルトの名無しさんNGNG
下のコードはヒントにならない?
(mapcar #'list '(a b c d e) '(3 4 5 6 7))
=> ((a 3) (b 4) (c 5) (d 6) (e 7))

0344340NGNG
>>342
有難うございます
で、さっそく以下のように書いてみたのですが、
結果が nil になってしまいます

(defun util (fname)
(with-open-file (in fname :direction :input)
(let ((buff)
(output))
(while (setq buff (read-line in nil))
(setq output
(mapcar #'list output (split-string buff "\t"))))
(mapcar #'(lambda (s) (format t "~A\n" s)) output))))

(util "test.dat")
nil

なぜ nil になってしまうのでしょうか?
0345デフォルトの名無しさんNGNG
whileの返り値
0346デフォルトの名無しさんNGNG
(defmacro for ((var start stop) &body body)
 (let ((gstop (gensym)))
  `(do ((,var ,start (1+ ,var))
     (,gstop ,stop))
     ((> ,var ,gstop))
   ,@body)))

これはOnLispに載っている "正しいforマクロ" (図42)
ですが、このgensymの例が何故正しいのかよくわかりません。

bodyの中にフリーなgstopが出てきたらやはり名前衝突を
起こしてしまう気がするのですが、私は何か勘違いして
いるのでしょうか。
0347デフォルトの名無しさんNGNG
>>344
(mapcar #'list nil '(1 2 3)) => nil だよ
まず output として '((A B C) (D E F)) を作ってこれを '((A D) (B E) (C F)) に変換する
と思えば良いんじゃない?
あんま考えてないけど↓
(defun util2 (output result)
(if (car output)
(util2 (mapcar #'cdr output) (cons (mapcar #'car output) result))
(reverse result)))

>(util2 '((A B C) (D E F)) '())=>((A D) (B E) (C F))
0348デフォルトの名無しさんNGNG
gensymはinternされない (システム内部の、名前からシンボルへの
対応表に登録されない) シンボルを作るので、このマクロの展開時に
作られるシンボル (#:G0031とか) と同じシンボルを外から与えることは
できない。(同じ名前にしてもシンボル自身は別オブジェクトなので
衝突しない)

0349340NGNG
nil にリスト追加してもnilなんすね
また修正してみました
途中経過ですが・・・
(with-open-file (in "test.dat" :direction :input)
(let((buff)
(output '()))
(while (setq buff (read-line in nil))
(if (null output)
(setq output (split-string buff "\t"))
(setq output
(mapcar #'list
output
(split-string buff "\t")))))
output))

としたら2行だと上手くいきますが => ((A D) (B E) (C F))
3行目からは(((A D) G) ((B E) H) ((C F) I))
となってしまふ・・・
<<347 のように今度は再帰で考えて見ます
0350デフォルトの名無しさんNGNG
>>348
ああそうか!
` が付いて無いからマクロの展開時に (let) は消えるんですね
納得・・・ありがとうございました
0351340NGNG
ようやく上手くいきました
良いLISPの勉強になりました

(defun util (filename)
(with-open-file (in filename :direction :input)
(let
((buff)
(output))
(while (setq buff (read-line in nil))
(if (null output)
(setq output (split-string buff "\t"))
(setq output
(mapcar #'(lambda (v1 v2)
(if (listp v1)
(append v1 (list v2))
(list v1 v2)))
output
(split-string buff "\t")))))
output)))

知恵を下さった皆さん有難うございました
もっとエレガントにいけるとかあったら
ぜひ教えてください
0352ミミNGNG
Scheme の継続と、Win32 API のウィンドウ プロシージャ コールバック
って、共存可能だと思いますか?
0353デフォルトの名無しさんNGNG
不可能な理由がなかったら可能だよ。
0354& ◆TACpYgPjX6 NGNG
それがよくわからないんですよ。
だって、OS 側でどんな処理をしているか分からないじゃないですか。

たとえば WM_KEYDOWN ハンドラ内で継続を作成して、
一度そのハンドラを終了して OS に制御を返すでしょ。
そのあと WM_LBUTTONDOWN ハンドラ内で
先ほどの継続を呼び出すと、WM_KEYDOWN メッセージの処理が
再開されるわけですよね。

OS 側でスタック上のデータではない
グローバル変数をいじっていたとすると、
コンテキストがめちゃくちゃになって、
よくない気がするんです。
0355デフォルトの名無しさんNGNG
> OS 側でどんな処理をしているか分からない

分からない以上、可能だという確認ができないんじゃないか?
0356ミミNGNG
いえいえ、今の私の知識ではわからないということなんです。
どなたか深い知識をご存知の方はいらっしゃらないかなと思いまして。
0357デフォルトの名無しさんNGNG
354の話で使いたい場面と、問題意識が少しわかったので
もう少し整理してから、その問題意識を中心に調べものしたらわかるのではないかな。
イベントハンドラまわりなんだよね。
;;; Windowsのことはよく知らないけど...
0358& ◆TACpYgPjX6 NGNG
実は Windows 専用 Scheme を作りたいと思っているんです。
特にシステム ハックをするためのツールを
Scheme でガンガン作りたいんですよねぇ。

コンセプトは
"Scheme as a better C."
"Scheme as a hacking tool."
0359デフォルトの名無しさんNGNG
で?
0360ミミNGNG
協力してくれたらうれしい。
できたら使わせてあげるから。
0361デフォルトの名無しさんNGNG
面白そうではあるが,コールバックまで正常動作させようとすると
継続はおろかクロージャさえ厳しいだろうな…
0362& ◆TACpYgPjX6 NGNG
だいたいですね、Lisp 系の言語って、
どれもこれも Unix っぽいのがよくないと思うんですよ。
Perl や Python も同じなんですけど、
Java はちょっと違う感じ。

Windows みたいな素敵なシステムに、
Scheme みたいな素敵な言語があれば、
みんな幸せだろうなぁ、と思ってさ。
0363ミミNGNG
すいません、どうしてクロージャが難しいのでしょうか。
何も OS が直接クロージャを呼び出すことは期待していないです。
間に C 関数をかませば問題ないですよね?

> 面白そうではあるが,
ありがとう。
0364デフォルトの名無しさんNGNG
PythonはMac出身じゃなかったっけ.
まぁ、それはともかく、Unixっぽいってどういうこと?
0365デフォルトの名無しさんNGNG
>>363
話の流れからすると,Win32APIを丸々wrapするんじゃなくて,
Cの関数を直接呼び出したりできる機構を用意しようってことだよね?
0366& ◆TACpYgPjX6 NGNG
一番大きなのは、コンソール (標準入出力) を前提としていること。

あと、いろんな Scheme 処理系をみてみても、
最初にサポートされるライブラリが POSIX ライブラリを移植したものとか、
GNU の readline たら curses たら、
/etc/network の存在を仮定したソケット ライブラリとか (Winsock にしてくれ)、
Windows で使うにはほとんどいらないものばっかりあって、
肝心の Windows 用のライブラリがないんですよ。

レジストリ アクセスや COM バインディングは必須でしょう。
もちろん ウィンドウ プログラミングができないとだめ。
(Unix では X がオプションだから困る)

あと、リソースのアクセスとか、シェル サービスへのアクセスとか、
さまざまな Win32 API をオブジェクト指向的にパックしたものとか
Win32 のセキュリティ機構は Unix と大きく異なっているから、
それを無理やり Unix 的に狭めても、使う気になれない。

Scheme だけで DLL を書くとか、サービス書くとか、
スクリーン セーバー書くとか、Scheme だけでデバドラ書くとか。
そんなのができない。

しようとすると、既存の Scheme に拡張機能を実装しないとだめで、
その Scheme 実装系の内部動作から把握しないとだめってことになる。
しかも Scheme 実装系自体が Unix を基盤としているので、
Windows 用に最適化されているわけでもない。

であれば、Windows 専用の Scheme 実装の上に
Windows 専用のライブラリを構築するほうが
ずっといいと思う。
0367デフォルトの名無しさんNGNG
うーん、Scheme.NETか?
0368ミミNGNG
>>365
> 話の流れからすると,Win32APIを丸々wrapするんじゃなくて,
> Cの関数を直接呼び出したりできる機構を用意しようってことだよね?

構想としては WIn32 API (というか任意の DLL 関数)
をすべて生で呼び出し可能にしたいとは
思っています (間に多少のサンクは入ってもよし)。

VB の Declare 文みたいに、Scheme ソース上で
宣言するだけで、外部の API を呼び出したいです。

たとえば、
(dll-import MessageBox
((DWORD hwnd)
(WSTR text)
(WSTR caption)
(UINT type))
(alias "MessageBoxW"
stdcall)
)
という感じで宣言して、
呼び出すときは
(MessageBox 'hwnd hwnd
'text "テキスト"
'caption "キャプション"
'type (| MB_OK MB_ICONINFORMATION) )

コールバックの話は、ウィンドウを使いたいために出てきた話です。
ウィンドウを使うには OS からのコールバックとして実装しなくてはならず、
その場合、継続と相性悪くないのかなぁ、とふと思ったのです。
0369デフォルトの名無しさんNGNG
>>366
> であれば、Windows 専用の Scheme 実装の上に
> Windows 専用のライブラリを構築するほうが
> ずっといいと思う。
そういうことは、既存Scheme処理系をWindowsに移植しようとして
挫折してからいうべきなのではないか。先人の知恵は偉大だよ。
;;; 挫折というのは移植者の能力不足のことではないよ。

あ、もしかして、scheracy?
0370& ◆TACpYgPjX6 NGNG
>>369
>あ、もしかして、scheracy?
え? Scheme ヤラシイ?
なんですかそれは。
0371デフォルトの名無しさんNGNG
>>367
だよね。他にもあるかも知れないけど、
.NETFramework をサポートする Scheme を開発するプロジェクト

ttp://radio.weblogs.com/0101156/stories/2002/03/19/tachy.html
ttp://www.cs.indiana.edu/~jgrinbla/index.htm
0372デフォルトの名無しさんNGNG
チョット前に出てたハンディスキームじゃダメなのか?
0373ミミNGNG
>>371
情報ありがとうございます。一度よく調べてみます。

うーん、私は .NET 勉強してからしばらくたつので、
いろいろ忘れていますが、.NET ってそんなにいいものですかね?

どうも GUI が重ったるいし、C# も VB.Net もなんかシンプルじゃないし、
.NET ライブラリってあんまり洗練されていないような気がするし (MS的ゴテゴテ)、
いじってたらバグがごろごろ出てきたし (もう直ってるだろうけど)
"as a hacking tool" というコンセプトと馴染むでしょうか。

"as a hacking tool" ===> "cool and cute" ですよ?
0374& ◆TACpYgPjX6 NGNG
>>372
> チョット前に出てたハンディスキームじゃダメなのか?
むむ!
これ、なんだかよさげですね。
こんなのがあったんですね。
ちょっと今日の宿題にしてみます。
ありがとうございます!
0375デフォルトの名無しさんNGNG
おぇ
0376デフォルトの名無しさんNGNG
"as a hacking tool"
===> "as a hacking tool"
0377デフォルトの名無しさんNGNG
なんでハンドル二つ使って常時ageなんだ?
0378デフォルトの名無しさんNGNG
Cからのscheme呼出しの中で補足された継続のエクステントが無制限な処理系ってあるの?
GaucheでもCからのコールバックで補足されたもののエクステントはコールバック内に限定されるし
0379デフォルトの名無しさんNGNG
>>363
クロージャが難しいというよりはガーベジコレクションが難しそう.
Schemeで書かれた関数をWin32APIに渡して,コールバック関数として登録したとして,
その関数がいつまで使われるかはSchemeインタプリタ側では判別できないと思う.
0380デフォルトの名無しさんNGNG
>>377
1. 2ch が Netscape や Mozilla に対応していない。
2. よって、cookie に書き込まれた全角のハンドル名が化ける。
3. あわててハンドル名を入れなおすと、そのときは正しい名前で掲示板に
  書き込まれる。
4. 次に書き込むと、またハンドルが化ける。
5. 以下繰り返し。

Netscape, Mozilla ではハンドルは半角英数にするのが吉。

常時 age については分からない。
0381デフォルトの名無しさんNGNG
>>380
> >>377
> 常時 age については分からない。
sage を知らない、だろうな。
0382デフォルトの名無しさんNGNG
> Windows みたいな素敵なシステムに、
ここんとこに賛同できないのは漏れだけなのか。s/Windows/MacOSX/だったら同意なんだが。
0383デフォルトの名無しさんNGNG
その部分は罠と判断した。
0384デフォルトの名無しさんNGNG
>>366
> 一番大きなのは、コンソール (標準入出力) を前提としていること。

なにか大きな誤解をしているような。
Schemeって必ずしもトップレベル環境のreader/writerと標準入出力が結びついている
必要はないでしょ。Dr.Schemeとか触ってみれば? ttp://www.drscheme.org/

あとDLLの動的呼び出しそのものはそれほど難しくないと思われ

ttp://www.kt.rim.or.jp/~qfwfq/rhiz-pi/
> 共有オブジェクト(Win32ではDLL)を動的にロードし、
> 中の関数をscheme コードから呼び出すことができる。
> さらにコールバック関数をscheme コードで記述できる。
0385デフォルトの名無しさんNGNG
DrSchemeって、一応他のエディタで編集してロードすれば、日本語表示できるみたいだな。
例えば、「あ」と言う文字のように二文字目が\と同じコードの場合には「あ\」と、\を余分にくっつけて
\\を\と認識させるという技を使わなくちゃいけないのが面倒だけど。

ランタイムDLLが必要になるがEXEも作れるようだし、俺の中ではDrScheme最強になりつつある。
0386デフォルトの名無しさんNGNG
gaucheでhtml解析するときって皆さんどうやってます?
saaxとかつかってます?
それとも自分で解析モジュールを書いちゃいます?
0387デフォルトの名無しさんNGNG
やっと cygwin + slib のインスコ完了したよ・・・
なんでこんなに疲れるんだろう
0388デフォルトの名無しさんNGNG
>>386 これは? 使ったことないけど。
http://www.neilvandyke.org/htmlprag/
0389デフォルトの名無しさんNGNG
gosh のload-path は add-load-path 以外に方法がないのですか?
毎回指定するの面度印ですけど・・・
0390デフォルトの名無しさんNGNG
>>389
command line optionの-I
0391デフォルトの名無しさんNGNG
>>368
継続はコールバックに跨らなければ問題ない。
ハンドラからtoplevelに直接行ったりきたりする様な継続の呼び出しは
不可能ではないけど、コールバックを叩くWindows側で何をしているのかわからんから、
こっちはやらない方が良いとは思う。
ちゃんとコールバックに制御を返却する当てがあるなら、たぶん問題なし。
これに関しては結局セオリーみたいのは見つからなかった。

(deine user32 (loadlib "user32.dll" ))
(define DefWindowProc (getproc user32 "DefWindowProcA" __stdcall '(h m w l)))

(define handler (make-callback __stdcall
(lambda (hwnd msg wparam lparam) (DefWindowProc hwnd msg wparam lparam))))
(define (single-window handler) (make-window handler))

自作の処理系ではこういう感じで窓を作成する。
make-callbackでクロージャとC関数をブリッジする以外に特別な物はない。
schemeの様に内部定義を許す言語のメリットはここから。
handlerはclosureそのものなので、関数外の局所変数をあえて引数渡しする必要がなく、
C言語だとグローバル変数に移したり関数で分離していた箇所を一つにまとめることができる。

(define (test foo)
(make-window (make-callback __stdcall (lambda (hwnd msg wparam lparam)
(display foo) ;; ハンドラ外の変数の参照
(DefWindowProc hwnd msg wparam lparam))

この辺の自由度はC言語と比べると比較にならない。(gccはExtensionで関数内関数が
使えるんだけど制限が多く、schemeの様に内関数同士の再帰やコールバック関数にできない。)

ただね、いまんとここれ使って何がしたいって訳でもないので、そのまま放置状態。
とにかく機構そのものより、ラッパとか書くのが面倒すぎて、型変換も適当。
0392& ◆TACpYgPjX6 NGNG
>>391
> 継続はコールバックに跨らなければ問題ない。
> ちゃんとコールバックに制御を返却する当てがあるなら、たぶん問題なし。
> これに関しては結局セオリーみたいのは見つからなかった。

OS から コールバック A が呼ばれ、そこで継続 ContA を作成して、
トップレベルに束縛したとします。
次に、OS から別のコールバック B が呼ばれ、そこから ContA を呼び出すとします。
ContA を呼び出した直後は別に問題は発生しませんよね。
問題は、ContA を呼び出し後に、コールバック A から呼び出し側に戻って
しまうことが問題なのですよね。

であれば、コールバック A から OS 側に戻ろうとする直前に、
あたかも、コールバック B から戻ったように見せかけることができれば、
いい感じがしませんか?
0393ミミNGNG
具体的な実装方法は、コールバック クロージャ B の
サンクとなる C 関数において、
コールバック開始時の継続をキャプチャしておきます。
また、「コールバック B のコンテキストである」という記録を
g_callbackContext グローバル変数に保持しておきます。

ここで、コールバック クロージャ A のサンクとなる C 関数から
OS 側に戻ろうとするとき、g_callbackContext を確認し、
それがコールバック A のコンテキストであれば、
そのまま OS 側に戻ります。
コールバック A のコンテキストでなければ、
そのコンテキストに対応する継続 (コールバック B 開始時にキャプチャしたもの)
を呼び出すことで、コールバック B のコンテキストを回復した上で
OS 側に戻ります。

少し問題なのは、コールバックの戻り値をどのように決定するかですが。。。
0394デフォルトの名無しさんNGNG
>>393
>問題は、ContA を呼び出し後に、コールバック A から呼び出し側に戻って
>しまうことが問題なのですよね。

Scheme の継続って、OS 側のコンテキストすら
捕獲できるほど強力だったか?

根源的に何か勘違いしていないか?
0395& ◆TACpYgPjX6 NGNG
>>394
実装によってはできますよ。
スタックをすべて記憶する類の実装の場合です。
0396デフォルトの名無しさんNGNG
なんでそんなに継続にこだわってるんだ?
コールバックの中で補足した継続にそこまで意味があるとは思えないんだが。
具体的にどういう使いかたを想定しているの?
0397ミミNGNG
いやー、コールバック ベースではない普通の Scheme コードの場合
(C でいう main() プログラム)、継続はどこで作成されたものであっても
自由に使えますよね。

でも、コールバック ベースの Scheme コードの場合
(C でいう WinMain() プログラム)、その継続がどのコールバック内
(「どの」というのは空間および時間で区別しなければならない)
で呼び出されたかを覚えていないとだめですよね。

継続を1つのコールバック内に閉じ込めて使用しなければならないという
この窮屈さを解消したいだけなのですけど。。。
0398ミミNGNG
すいません、間違い。
× で呼び出されたかを覚えていないとだめですよね。
○ で作成されたかを覚えていないとだめですよね。
0399デフォルトの名無しさんNGNG
いいかげんsageてくんないかなあ・・・
0400デフォルトの名無しさんNGNG
こんなことでぐだぐだ言ってないで、さっさと処理系書いてみれ。
コールバックをまたぐ継続が動かないことくらいすぐ分かるよ。
0401ミミNGNG
>> 400
いや、私がいいたかったのは、そうじゃないんですよぉ。。。
おこんないでくださいよぉ。。
0402デフォルトの名無しさんNGNG
具体的に 「こういう使い方すると非常に便利だから絶対使いたい」 というわけでもないのに、
処理系云々の前段階げグダグダいっても意味無いだろ。
実装するにはいろいろ難しい問題があり、汎用的なものにすることは不可能なんだから、
要求が出る前から考えたって良い解法が出るわけがない。
あと、いいかげんsageろ知障。
0403デフォルトの名無しさんNGNG
くれぐれもshiroさんとこ行ったりして迷惑かけるなよ
0404デフォルトの名無しさんNGNG
汎用的に実装するのはまず無理だろうし,できたとしても
OS側の継続(変な言い方だけど)が戻らないんじゃ意味無し.
が,絶対に無理かと問われると断言できないのが歯痒いというか何というか.
0405ミミNGNG

> 汎用的に実装するのはまず無理だろうし,
うーんと、私はコールバックを超えて継続したいと言っているんではないのですよ。

> OS側の継続(変な言い方だけど)が戻らないんじゃ意味無し
いや、ですから、OS 側の継続を行うのは可能なんですって。。。

> くれぐれもshiroさんとこ行ったりして迷惑かけるなよ
あのう、shiroさんて、誰でしょうか。。。

> あと、いいかげんsageろ知障。
すいません、やっと意味が分かりました。m(_ _)m
0406デフォルトの名無しさんNGNG
> コールバック A から OS 側に戻ろうとする直前に、
> あたかも、コールバック B から戻ったように見せかけることができれば、
この時点でOS側の継続は戻ってないと思うんだが

そもそもOSがコールバック関数を呼ぶってのは言わば見せかけであって,
実際にはプロセス間通信なんかが絡んでるの判ってる?
0407デフォルトの名無しさんNGNG
>>406
Windows素人は黙ってて欲しいなあ・・・
0408ミミNGNG
>>406
たぶん、私の意図を誤解されています。
実際に OS 側の継続を戻す Scheme 実装系はありますよ。
0409デフォルトの名無しさんNGNG
OS のコールバックを跨ぐ事を前提にしているのに、
Scheme 側で生のスタックを使おうとしているのが、
根本的な設計ミスだろ?

普通の Scheme コンパイラで生のスタックを使っていたりするのは、
それが "たまたま" 使えたから。

それを理解せずにスタックに拘る奴は愚かと言う他はない。
0410デフォルトの名無しさんNGNG
>>408
> 実際に OS 側の継続を戻す Scheme 実装系はありますよ。

それはどの OS 上のどの実装系?
OS 側のサポートが無い限り setjmp/longjmp 以上のことができるとは思えないんだが。
0411ミミNGNG
> 409
> OS のコールバックを跨ぐ事を前提にしているのに、

ですから、私はコールバックをまたぎたいんではないんですって。
コールバックをまたぐことはできないことは、最初っから分かっているんですよ。
私がやりたいのは、いかに継続をコールバックというしがらみから解放させたように
見せかけるか、という手法なんですよ。

> 普通の Scheme コンパイラで生のスタックを使っていたりするのは、
> それが "たまたま" 使えたから。
> それを理解せずにスタックに拘る奴は愚かと言う他はない。

スタックを記録するタイプの実装を行っている SCM は、
Mac, Win, Linux, BSD, Solaris, AIX, HP-UX, OS/2,
DOS, Amiga, Atari など多くの OS に移植されています。
これほど汎用的に使える手法を"たまたま"と表現することはできないでしょう。
0412デフォルトの名無しさんNGNG
>私がやりたいのは、いかに継続をコールバックというしがらみから解放させたように
>見せかけるか、という手法なんですよ。
で、そう見せかけるためには、実際にはコールバックをまたぐ必要があるんだろ?

>これほど汎用的に使える手法を"たまたま"と表現することはできないでしょう。
"たまたま" の意味を取り違えているな。
レジスタに 0 をセットのには、たまたま XOR が使えるけど、
123 をセットする為には、どんなにビットをいじくりまわしても
無理。素直にロード命令を使っとけって事。
0413デフォルトの名無しさんNGNG
> ですから、私はコールバックをまたぎたいんではないんですって。
まず,「コールバックを跨がなければ問題なく継続を扱える」のは
>>391さんの言う通り問題ない.
>>392の発言はどう読んでも「コールバックを跨ぎたい」という風にしか
読み取れないんだが.
> いかに継続をコールバックというしがらみから解放させたように
> 見せかけるか、
もう少し具体的に書いてくれ.これでは全く意味不明.
0414デフォルトの名無しさんNGNG
なんか変なやつが増えた?
具体的には412だけどさ・・・
おねがいだからこれ以上変なスレにしないでね(苦笑

恐らくミミが言ってるのはschemeで擬似的な継続を作ってやりすごそうって事だよな?
その偽の継続と、OS側の本物の継続はかならずしも一致しなくていい。
0415デフォルトの名無しさんNGNG
つまりschemeコード上で破綻してなければどんな手段の継続であるうとかまわない、
最終的にプログラムを終了させたときにOS側の継続と一致していれば良い、
って事だと思う。
0416デフォルトの名無しさんNGNG
だからコールバックに突入してそのままルートの継続呼び出して戻ってきても、
OS側の本物の継続はまだコールバックの中、ってこともありえる。
0417デフォルトの名無しさんNGNG
>>416
言ってることは分からなくもないが,別に疑似的な継続なんて持ち出さなくても
「コールバックを跨がなければ問題なく継続を扱える」
方法はあるわけで.
0418デフォルトの名無しさんNGNG
で,コールバックを跨ぐために疑似的な継続を持ち出してみたものの,
どのみちOS側の継続は戻せないので意味ないじゃん…という感じ.
0419デフォルトの名無しさんNGNG
別にOS側の継続戻す必要ないよ
0420デフォルトの名無しさんNGNG
おまいらちょっと用語の整理が居るんじゃないか?
おれは理解が追いついていないから何もできんですまんが
0421デフォルトの名無しさんNGNG
>>419
WM_* のコールバック中に継続を保存し、それを再開できるとでも?
0422デフォルトの名無しさんNGNG
コールバックをまたがないのなら、それは継続ではないし、継続である必要も無い。
全く無意味で非実用的な事態を想定し、無駄に思考時間を消費しているだけ。
0423デフォルトの名無しさんNGNG
>>420
ついでにカキコしてる人の整理もな…
どれとどれが同じ人の書き込みなのかさっぱり
0424デフォルトの名無しさんNGNG
>>423
「ミミ」以外は区別する必要無い気が
0425デフォルトの名無しさんNGNG
>>392 を図示してみた。間違っていたら指摘してくれ。
注)[Sn]:Scheme で使うスタック要素, [On]:OS で使うスタック要素

1.
>OS から コールバック A が呼ばれ、
スタック:[S1][S2][O1][O2][A]

2.
>そこで継続 ContA を作成して、
>トップレベルに束縛したとします。
スタック:[S1][S2][O1][O2][A]
ContA:[S1][S2][O1][O2][A]

3.
>次に、OS から別のコールバック B が呼ばれ、
スタック:[S3][S4][S5][S6][O3][O4][O5][O6][B]
ContA:[S1][S2][O1][O2][A]
0426デフォルトの名無しさんNGNG
4.
>そこから ContA を呼び出すとします。
>ContA を呼び出した直後は別に問題は発生しませんよね。
スタック:[S1][S2][O1][O2][A]

5.
>問題は、ContA を呼び出し後に、コールバック A から呼び出し側に戻って
>しまうことが問題なのですよね。
スタック:[S1][S2][O1][O2] <-これが問題。本来なら[O6]に戻るべき。

6.
>であれば、コールバック A から OS 側に戻ろうとする直前に、
>あたかも、コールバック B から戻ったように見せかけることができれば、
>いい感じがしませんか?
3.から4.に遷移する時に
スタック:[S3][S4][S5][S6][O3][O4][O5][O6][A]
となればいい、って事か?
0427ミミNGNG
>>415
>>416
私の意図を汲み取ってくれています。
ありがとうございます。

>>425
>>426
最後の 6 だけ私の意図とは違います。

> 3.から4.に遷移する時に
> スタック:[S3][S4][S5][S6][O3][O4][O5][O6][A]
> となればいい、って事か?
のではなくって、
継続 A へ飛んだあと、
コールバックを終了して OS 側に戻る直前に、

スタック:[S3][S4][S5][S6][O3][O4][O5][O6]

となるということです。
したがって、これを行うのは、
コールバック A の C サンクの中です。
0428デフォルトの名無しさんNGNG
コールバックの用途が概ね副作用であり、大域的状態変化が伴う事を無視して
スタックだけを取り上げるのはいかがなものかと
0429デフォルトの名無しさんNGNG
>>410は無視ですかそうですか
0430デフォルトの名無しさんNGNG
410に限らず、都合の悪いレスは無視みたいね
オナニーは一人でやってほしいもんだ
0431デフォルトの名無しさんNGNG
>>429
素人さんは、すっこんでろ
0432デフォルトの名無しさんNGNG
410は何が知りたいんだろう・・・
0433デフォルトの名無しさんNGNG
>>410=429=430
setjmp/longjmpは、別に「OSの機能」で実現されてるわけじゃないぞ?
ほぼレジスタやスタックの操作だけ。
アセンブラというものが使える状況なら基本的にどのOSでも作れる。
0434デフォルトの名無しさんNGNG
>>433
だからこそOSを含めて継続の保存/復帰を実現するには、OS側のサポートも必要だろってことだよ。
で、そういう実装があるのなら参考のために是非知りたいということ。
0435デフォルトの名無しさんNGNG
>>434
おまえさ、わざと勘違いしてんのか?
つまんねえよ。
話の腰を折るだけのつもりなら消えてくれ。
0436デフォルトの名無しさんNGNG
なんか、OSを含めて継続保存とか意味不明なこと言ってるアフォがいるけど、
いつからOS含めた話になったの?
0437デフォルトの名無しさんNGNG
>>436
>>408に、「実際に OS 側の継続を戻す Scheme 実装系はありますよ。」とあり、
>>410は、その実装系はなんなのかを知りたいという。
ただそれだけの話なんだが、そんなに分かりづらいか?
0438デフォルトの名無しさんNGNG
WindowsプログラマとUNIX BAKA (BAd Knowhow Association)の
間で文化摩擦が発生しています
0439デフォルトの名無しさんNGNG
「OS側の継続」の定義がそれぞれ違うんだろうね。
なんかプロセス間通信とか言ってる馬鹿(=410)が混じってるので
これ以上続けても無駄な気がする。

それでも続けるなら、
ここからは「Windows限定」でどぞ↓
0440デフォルトの名無しさんNGNG
なんでそーなるの?
Windows でも X でも、Scheme 的継続はコールバック跨げないよ。
0441デフォルトの名無しさんNGNG
>>440
だから話をシンプルにするための処置だよ。
おまえた単にWindows嫌いなだけだろ。
以降「Windows限定」でどぞ↓
0442デフォルトの名無しさんNGNG
('A`)
0443デフォルトの名無しさんNGNG
そもそもXなんて誰も使わないしUNIX系は無視してもいいと思う。
「ミミ」自体Windowsって言ってるんだし。
0444デフォルトの名無しさんNGNG
いや〜、やっぱり Scheme は面白いですね。
0445デフォルトの名無しさんNGNG
(gc)
0446デフォルトの名無しさんNGNG
(exit)
0447デフォルトの名無しさんNGNG
UNIX馬鹿の粘着のおかげで横道逸れすぎて話が全然進まなかったな。
0448デフォルトの名無しさんNGNG
なんでもいいからさー、実装出してよ。
0449デフォルトの名無しさんNGNG
程よく荒れてきたようなので、一つ質問。

例えば、
ContA:[S1][S2][O1][O2][A]

で、[A] から抜けて([O2][O1]の事は脇に置いておいて)
[S2]に戻るから、これを「継続」って呼んでいるんだよね?

なのに 6.のように
[A] から抜けた後、[S6]に戻る(?)ものを
「継続」って呼んでも良いとでも思っているの?
それは Scheme でいう「継続」とは全く別のものじゃないの?
0450デフォルトの名無しさんNGNG
ミミタンの作る処理系は独自実装なので
そんなコトはどうでもいいのです。
0451デフォルトの名無しさんNGNG
別に問題ない。
スタックのどこであろうとschemeコードに制御が移ったのなら、それは立派な継続。
コールバック内外へ飛んだ事を「継続を使うユーザー」が知っていればいい。
0452デフォルトの名無しさんNGNG
とりあえず Scheme にやさしい OS をつくろうよ。
0453デフォルトの名無しさんNGNG
頭固い人多いね
ま、一人が粘着してるだけかもしらんけど・・

>>449
>「継続」って呼んでも良いとでも思っているの?
>「継続」って呼んでも良いとでも思っているの?
>「継続」って呼んでも良いとでも思っているの?

もうね、君に理解は無理だよ
0454デフォルトの名無しさんNGNG
>>453
>もうね、君に理解は無理だよ
いや、それはすなわち規格で規定された動作が
出来なくなってしまうという事を意味すると思ったのだが・・・

ま、確かに俺には理解不能だな。
0455デフォルトの名無しさんNGNG
>>454
ミミが定義した偽継続だからそれでいいんだろ。scheme的継続だと思ってはいけない。
0456デフォルトの名無しさんNGNG
規格に通らなくなるってわけでもなさそうだけど。
規定された動作って、どの辺の事?>454
0457デフォルトの名無しさんNGNG
実装の話もいいけど、
使う側の話もしようぜ?
0458デフォルトの名無しさんNGNG
ヒント。partial continuaionについて調べよ。
0459デフォルトの名無しさんNGNG
事の発端となった香具師の要件が明確でないのに本人はうやむやにしたまま消えちゃうし、
まるでそれと入れ替わるかのようにいつもは議論になっても出てこないような類のレベルの低い煽りのみを繰り返す香具師が出てくるし、
そんな状態で外野が言い合ってたって全く意味が無く、時間の無駄以外の何者でもないと思う。
0460デフォルトの名無しさんNGNG
ミミは夜行性だから夜まで待て
0461デフォルトの名無しさんNGNG
話を蒸し返すようで悪いが,「プロセス間通信云々」→「Windows素人は黙ってろ」
の流れの意味が分からない.誰か説明キボン.
例えば,Windowsのウィンドウプロシージャが呼び出される過程は,
・OSからウィンドウの属しているスレッドのメッセージキューに
 メッセージが送られる.(ここでプロセス間通信)
・ウィンドウの属しているスレッドにて,キューからメッセージ取り出し.
・取り出したメッセージを引数にコールバックプロシージャを呼び出す.
こんな感じじゃないの?
明らかにプロセス間通信は絡んでると思うんだけど.
0462デフォルトの名無しさんNGNG
http://www.double.co.nz/scheme/partial-continuations/partial-continuations.html
0463デフォルトの名無しさんNGNG
>>461
必死に慣れない参考書読んで調べたんだろうけどさ、基本的なことを
まるで理解してないな。
おまえが調べた内容は、OS側でブラックボックス化してる部分を
ただほじくりかえしただけ。つまり大ハズレもいいとこ。
これはね、まず恥ずかしいことなんだと認識してくれよ?
悦に浸るどころじゃないよ?(w
なんのためにスレッド毎にメッセージキューがあるのかをまずよく考えてね?
Windowsの開発者はメッセージキューの知識だけでプログラミングできるだろ。
あえて「プロセス間通信」を意識して扱う必要なんてないんだよ。
別にOSを作るわけじゃないんだから。
つーかプログラム書いた事もなさそうだし、どっか他行って勉強してきて。
もうね、ここで続けられると邪魔だから消えろ。
0464デフォルトの名無しさんNGNG
全然素人なんだけど、WindowsってOSの使用するスタック領域と
アプリケーションプロセスの使用するスタック領域は連続しているの?
連続しているからスタックを保存すれば継続が補足できると言う前提で
議論しているみたいだけど、OS側に制御が渡った瞬間、別のプロセス空間の
スタック領域にスイッチする場合、どう考えてもOS側の継続を制御するのは
無理のように思えるけど。。
0465デフォルトの名無しさんNGNG
>>464=461
全部間違ってる
もう引退時じゃね?
LISPには柔軟な頭が必要なのよ
0466デフォルトの名無しさんNGNG
> ・OSからウィンドウの属しているスレッドのメッセージキューに
>  メッセージが送られる.(ここでプロセス間通信)

PostMessage,SendMessageは
・他プロセスの場合は最初に該当するスレッドの保有するメッセージキュー領域を
メモリマップドファイルを使って共有し、データ書き込み。
・同一プロセス、他スレッドの場合は受信スレッドのメッセージキューに直接書き込み。
・同一スレッドなら、コールバックの直接呼出し。
こんな感じか?
0467464NGNG
一応いっておくけど、461とは別人です。
>>425みてもわかるように、OS側の継続がアプリケーションと
同じスタックに乗っている前提で話してるよね?
違うのかな?
0468デフォルトの名無しさんNGNG
>>463
反応するのも馬鹿らしいが,
メッセージキューってのは立派なプロセス/スレッド間通信の一種.
あと,この部分は別にブラックボックスにはなってない.むしろ基礎の基礎.

>>464
> OS側の継続を制御するのは無理
これは正しい.
> スタックを保存すれば継続が補足できると言う前提で議論している
こっちは×.最終的にスタックを元の状態に戻してやれば
Schemeインタプリタ側では好き勝手にいじってもいいよねー,って話.
たぶん.
0469464NGNG
>>468
コールバックは常に同一プロセス内から直接呼び出されるのなら、
スタックコピーで制御は戻りそうなんだけど、私が疑問に思ったのは、
コールバックを渡すOS側は同じプロセス空間で動いてないような気が
するんだけど。あてずっぽうですが。
0470デフォルトの名無しさんNGNG
>>458
http://www.google.co.jp/search?hl=ja&ie=UTF-8&q=R5RS+partial+continuaion&lr=
R5RS partial continuaionに該当するページが見つかりませんでした。
http://www.google.co.jp/search?hl=ja&ie=UTF-8&q=scheme+partial+continuaion&lr=
scheme partial continuaionに該当するページが見つかりませんでした。


>>462
規格とは関係ないみたいよ?
もちろん部分継続も問題ないし。
いったい何を危惧してるのかね。
ちゃんと継続を理解してる人って少ないの?
0471デフォルトの名無しさんNGNG
>>464
スレ違いな質問繰り返してんじゃねーよ
デバッガ使って自分で確かめろ
ミミよりウザイ
0472464NGNG
Schemeインタプリタ自体は同一プロセス内で動いてるから、
スタックコピーで継続が戻るのは当たり前だと思うけど、
Schemeインタプリタとは異なるプロセスの継続も補足できるの?
0473デフォルトの名無しさんNGNG
>>469
メッセージキューにメッセージを置くのはOS側(もちろん違うプロセス空間で動いてる)だけど,
メッセージを取り出すのは自分なので問題ない.というか,別に違うプロセス空間から
呼び出されても問題ないと思うけど.

>>470
ミミがやりたいのは部分継続じゃないの? ってことだと思う.
0474464NGNG
>>473
ああ、ここでコールバックって言ってるのは、あくまでも
イベントキューから自分で読み出して関数を呼ぶイベント駆動
プログラミングのことなんだね。
違うものを想像してたよ。
0475デフォルトの名無しさんNGNG
>Schemeインタプリタとは異なるプロセスの継続も補足できるの?
で き ま せ ん

なあ、その電波な質問はどっからやってくるんだ?
0476464NGNG
>>475
言葉のすれ違いと思ってくんなまし。
0477デフォルトの名無しさんNGNG
つーか試しもしないで質問ばかりする464は不要な人材
0478ミミNGNG
こんにちは。
昨日は遅くまでありがとうございます。
細かい議論はあるかもしれませんが、
おおまかなアイデアは理解していただけたようですね。

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

┌──┐
│ │ ┌────┐
│ │ ┌┘ │
│ CbA├─┘ │
OS │ ├─┐ ContA │
側 │ │ └┐ │
│ │ └────┘
│ │ ┌────┐
│ │ ┌┘ │
│ CbB├─┘ │
│ ├─┐ o--─────ここから ContA を呼ぶと
│ │ └┐ │ CbA から出て行ってしまう。
└──┘ └────┘ これは破綻する。
0480ミミNGNG
■検問所式コールバックの実装

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


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

┌──┐
│ │ ┌────┐
│ │ ┌┘ │
│ CbA├─┘ │
OS │ ├─┐ ContA │
側 │ │ └┐ │
│ │ └────┘
│ │ ┌────┐
│ │ ┌┘ │
│ CbB├─┘ │
│ ├─┐ o--─────ここから ContA を呼ぶと
│ │ └┐ │ CbA から出て行ってしまう。
└──┘ └────┘ これは破綻する。
0482ミミNGNG
あれれ、うまく表示されませんねぇ。。。
0483ミミNGNG
■従来のコールバックの実装

┌──┐
│ │ ┌────┐
│ │ ┌┘ │
│ CbA├─┘ │
OS │ ├─┐ ContA │
側 │ │ └┐ │
│ │ └────┘
│ │ ┌────┐
│ │ ┌┘ │
│ CbB├─┘ │
│ ├─┐ o--─────ここから ContA を呼ぶと
│ │ └┐ │ CbA から出て行ってしまう。
└──┘ └────┘ これは破綻する。
0484デフォルトの名無しさんNGNG
もういいよ・・・
なんとなくわかったから

書き込みの練習は専用板があるからそっちでやってくれ
http://aa5.2ch.net/aasaloon/
0485デフォルトの名無しさんNGNG
だから、具体的にどういう場面で使いたいのよ?
それは継続でなければならないのか?
0486デフォルトの名無しさんNGNG
UNIXっぽくない用途だって。
0487ミミNGNG
>>485
> だから、具体的にどういう場面で使いたいのよ?

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

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

もう少しアイデアを膨らませたら、何か面白いことができるかもしれません。
Scheme 実装を書きながら、おいおい考えたいと思っています。
0488デフォルトの名無しさんNGNG
案の定何も考えてないのに非現実的なものを想定して時間を無駄にしてただけかよ
アホくさ
0489ミミNGNG
>>448
そんなことはありませんよ。
どんな小さなアイデアも、大きな発明に結びつく可能性があるって、
どこかの発明家が言っていましたよ。

Windows 専用 Scheme で実現したい機能とかありましたら、
みなさんのご意見もお聞きしたいです。
面白そうだったら実装したいと思います。
0490デフォルトの名無しさんNGNG
RS232Cに継続ベースで送受信
0491ミミNGNG
> RS232Cに継続ベースで送受信

ええ?これはどういうことですか?
0492デフォルトの名無しさんNGNG
なぜかここって学習能力のないUNIX知障が常駐してるね。
何故?
ここには何もありませんよ〜?
0493デフォルトの名無しさんNGNG
「知障」だの「全部間違ってる」だの言うだけで具体的なことを
何一つ言えない威勢のいいやつが一人居るなw

おれ? まあ、おれもそうかな・・・
0494デフォルトの名無しさんNGNG
>>489
そういうのは、まずできることをやってから言うもんだよ。
技術的知識やノウハウがなきゃ、せっかくのアイデアもその価値を正しく見極めることができず、
多大な時間とコストをかけて実装したのに実はもっと簡単でいい解法があった、なんてことになりかねない。
そうでなくても、モノが無いのに口先だけの人が好かれやすいとは思えないし。
0495デフォルトの名無しさんNGNG
>>494 いいじゃん。いずれ実装が出れば白黒はっきりつくんだしさ。
実装がなきゃ評価できないってんなら黙ってればいい。
漏れは、>>480 で言っているのが部分継続とどう違うのか
よくわからないんで、これ以上はコードで説明してもらいたい
(仮想OSを使ったSchemeコードで構わない) と思うけど。

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

0496デフォルトの名無しさんNGNG
>>480
http://www.ipsj.or.jp/members/Trans/Jpn/03/2001/4211/article004.html
これがズバリかな?
個人的には,
> Scheme 側では継続とコールバックの関係を気にしなくてよい
とは思えない.
完全な継続とコールバックまでの部分継続が暗黙のうちに
すり替えられるのはこわい…というか,常に意識していなければ危険だと思う.
call/ccとは別の名前で実装するんなら問題ないかな?

>>495
コールバック時に暗黙に行うって所がポイントなんじゃない?
俺は上述のようにデメリットが大きいと思うけどね.
0497デフォルトの名無しさんNGNG
キャッチコピーとしては魅力を感じます
0498デフォルトの名無しさんNGNG
cygwin で gauche-gl のインストールに成功した人
いませんか?
glut
0499デフォルトの名無しさんNGNG
glut 関連の関数が解決できずにmake が失敗します
0500デフォルトの名無しさんNGNG
そういや昔glutのインターフェースが無茶苦茶いいかげんな事に
気付いて使う気なくしたんだった。
0501デフォルトの名無しさんNGNG
ここを見る限りだと成功している人がいるみたいなんだけど・・・
やり方がわからん
ttp://www.kauda.jp/~oda/diary200404.html
0502デフォルトの名無しさんNGNG
>>499
うちでも普通に入ったけど。
glutはインストールしてある?
標準以外の場所に入ってたら、configureに--with-glut
オプションが必要かも。
0503デフォルトの名無しさんNGNG
>>498
成功してます
$ ln -s /usr/include/GL /usr/include/GLUT
$ ./confiugre --without-x
でいけるはず.
0504498NGNG
最近の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からダウンロードした時点では
まだインストールされていない?のでしょうか
0505デフォルトの名無しさんNGNG
>>504
OpenGLパッケージをインストールすれば入ってくるが。
0506デフォルトの名無しさんNGNG
こういう話はうまくいったバージョン書いてくれないとダメなんじゃない?
まあcygwinて適当なftpから適当なバージョンのアーカイブ引っ張ってくるから
うまくいく組み合わせの特定ってかなり難しいとは思うけどね。
つまりcygwinで同一環境にするにはインストールログが必要なわけ。
こんなシステムだからcygwinは不安定って言われるのさ。
0507デフォルトの名無しさんNGNG
\   ∩─ー、    ====
  \/ ● 、_ `ヽ   ======
  / \( ●  ● |つ
  |   X_入__ノ   ミ   そんなエサで俺様がクマ――!!
   、 (_/   ノ /⌒l
   /\___ノ゙_/  /  =====
    〈         __ノ  ====
    \ \_    \
     \___)     \   ======   (´⌒
        \   ___ \__  (´⌒;;(´⌒;;
          \___)___)(´;;⌒  (´⌒;;  ズザザザ
                       (´⌒; (´⌒;;;
0508498NGNG
>>506
色々試行錯誤したんですが、上手くいきませんでした
OpenGLのバージョンを落とさないといけないっぽいことは
わかったのですが・・・
力尽きました
0509デフォルトの名無しさんNGNG
なんかcygwinのgaucheって不安定じゃない?
何かすぐにフリーズする
0510デフォルトの名無しさんNGNG
coLinuxを使えば?
0511デフォルトの名無しさんNGNG
それって解決になってない気が。
それよりVC++やMingwで動かす話があったはずだけど。
0512デフォルトの名無しさんNGNG
>>511
gauche-gl の話しでしょ?
もしかして VC++で使えるって話し?
0513デフォルトの名無しさんNGNG
511ではないが、cygwinではなくてMingwで動かす話がある。
あまりうまくいっていないようなので、やるなら自分でやった方がよいかも。
0514デフォルトの名無しさんNGNG
("root"
("usr" "aaa.txt" "bbb.txt"
("bin" "perl" "ruby" "gosh")
))

ディレクトリ構造をS式で表したいのですが、上のように
「リストの最初にディレクトリ名をおく」というのを考え
ました。もっといい方法ってありますか?
0515デフォルトの名無しさんNGNG
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

とか
0516515NGNG
あ、よくみたら同じことやってる、おれってばか(;´Д`)
もう寝ます…
0517ミミNGNG
>>514
UNIX だけならそれでいいと思う。
Win だとドライブ名がないとだめだね。

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

絶対パスと相対パスはどう区別するのかな。
0518ミミNGNG
あ、勘違い。
パスを表すんじゃなくって、
ディレクトリ構造を表すんですね。
0519デフォルトの名無しさんNGNG
>>515 >>517
ありがとう。絶対パスなので、上の方法で扱ってみます。

次は要素を探索して、その絶対パスを返す手続きです。でも
gaucheのfindあたりでいけそうですね。調べてみます。
0520デフォルトの名無しさんNGNG
PLTSchemeで.net を使えるそうなのですが・・・
http://www.rivendell.ws/dot-scheme/
これって使うプロジェクトの直下において
使えばよろしいの?
というかmzSchme,PLT Scheme DrScheme って
なんで名前が3つあるんですかね?関係性が
わからないんですけど・・・
0521ミミNGNG
>>529
> mzSchme,PLT Scheme DrScheme って
MzScheme は Scheme 実装のコア部分
DrScheme は統合開発環境
PLT Scheme は全体の総称かな。たぶん。
0522デフォルトの名無しさんNGNG
>>521
お前のキーボードにテンキーついてないだろ

HHKだから俺のにもついてないけどさ
0523ミミNGNG
え、なんか鋭いですね。。。
探偵さんですか。。。
0524デフォルトの名無しさんNGNG
>>521
そういうことですか、サンクス。

>>522
え、なんでそうなるの?
0525デフォルトの名無しさんNGNG
ふつーは数字入力でわざわざテンキーまで手をのばしたりしないよ。
0526デフォルトの名無しさんNGNG
ふつーはレス番号を直接入力したりしないよ。
0527デフォルトの名無しさんNGNG
ふつーの人は2ちゃんねるなんてやらないよ
0528デフォルトの名無しさんNGNG
ふつーのひとはLispなんてやらないよ。
0529デフォルトの名無しさんNGNG
普通のやつらの上を行け
0530デフォルトの名無しさんNGNG
そんな実力はありません
0531デフォルトの名無しさんNGNG
(ノーマル? 普通のやつ) ; => #t
(ノーマル? (上 普通のやつ)) ; => #f
(ノーマル? (下 普通のやつ)) ; => #f
(アブノーマル? 普通のやつ) ; => #f
(アブノーマル? (上 普通のやつ)) ; => #t
(アブノーマル? (下 普通のやつ)) ; => #t

(equal? (上 普通のやつ) (下 普通のやつ)) ; => ?
0532デフォルトの名無しさんNGNG
(ノーマル? 普通のやつ) ; => #t
(ノーマル? (上 普通のやつ)) ; => #f
(ノーマル? (下 普通のやつ)) ; => #f
(アブノーマル? 普通のやつ) ; => #f
(アブノーマル? (上 普通のやつ)) ; => #t
(アブノーマル? (下 普通のやつ)) ; => #t

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

0533デフォルトの名無しさんNGNG
だが気を付けたまえ
0534デフォルトの名無しさんNGNG
アブノーマルの行きつく先はAranskだ
0535デフォルトの名無しさんNGNG
MIT Schemeというので自作のDLLを呼びたいのですが
なかなかそういうサンプルソースが見つかりません
FFIとかで検索してみたのですが、なんか良いサンプル
ないですかね?付属のドキュメントは何か概要ぐらいしか
書いていない感じなんです

0536ミミNGNG
このサンプルは見ました?

(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
0537デフォルトの名無しさんNGNG
>>536
見ました
それだけみてもよくわかんないんです
そもそもエラーが出るし・・・
;Syntactic keyword may not be used as an expression: define
とか
0538デフォルトの名無しさんNGNG
いつのまにかgaucheがmingwでコンパイルできるようになっとる。
前はできんかったのに。mingwをバージョンアップしたからだろうか。(--;
0539デフォルトの名無しさんNGNG
shiroさんが業を煮やしてちょこっと進めた
0540デフォルトの名無しさんNGNG
おぉーーー
0541デフォルトの名無しさんNGNG
ACLってVisualStudioより高いですか。
ぐぐってもわからないってことは、相当な値段でしょうけど、、
0542デフォルトの名無しさんNGNG
>>541
前スレからコピペ。
----------------------------------------------------


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


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

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

ご存知の方おられませんか?
0543デフォルトの名無しさんNGNG
続き
----------------------------------------------------
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
あ、括弧の中はアカデミック価格ね。
0544デフォルトの名無しさんNGNG
flatline 氏の『on Lisp』翻訳、24/25章まで進んだようです。いよいよProlog。
http://user.ecc.u-tokyo.ac.jp/~g340299/

ちなみに、進振りで志望に通ったらしい。おめでとうございます。
0545541NGNG
>>542 >>543
あ、ありがとうございます。
WindowsでProfessionalだと、75万円ですか、、そもそも比較の対象ではないですね ... orz

しょーがない自分で作るか(嘘)
0546デフォルトの名無しさんNGNG
>>539
shiroさんにもWindowsの良さをもっと解って欲しいな
バイナリ配布形式に対応してActivePerlみたいにsetup.exeから
インストール出来るようになればユーザーかなり増えると思ふ
まあそれに比例してDQNも増えるんだけどね・・
0547デフォルトの名無しさんNGNG
>>546
Window$かよ。( ゚д゚)、ペッ
0548デフォルトの名無しさんNGNG
しまった。
ここにはUNIX馬鹿厨がいるんだった。
0549デフォルトの名無しさんNGNG
別にWindowsが(他の実用レベルのOSと比較して)悪いとは思わないが,
>>546から激しくDQN臭がするのは確かだ.
0550547NGNG
>>548
MACですが何か?
0551デフォルトの名無しさんNGNG
やっぱDQNだった….
0552デフォルトの名無しさんNGNG
>>549-551
相変わらず反応早いですね。
0553デフォルトの名無しさんNGNG
今MIT Scheme落としてるんだけど、これPLTと比べてどう?
0554デフォルトの名無しさんNGNG
とまあこのような連中が増えるという例でした。
0555ミミNGNG
>>545
ACL Professional は 2 年間レンタルで
5, 6 万円だって聞きました。
0556デフォルトの名無しさんNGNG
ACLってそんなにいいの?
どんな最適化するのか興味ある〜
ところでfranz社ってサ、LISP以外手を出さんの?
例えば、MLとかprologトカサ
あ?そんなLISPがええか?ええのんか?
どないやねん
0557デフォルトの名無しさんNGNG
Borland Turbo Prologという製品が昔あったと言う。
末路は (ry
0558デフォルトの名無しさんNGNG
>>557
ネタかと思ったら本当にあったのね。
正直、驚いた。

トリビアスレ向きだな。
0559デフォルトの名無しさんNGNG
Microsoft Visual L# 2005
Borland LBuilder 2005
とか出るといいのか?
0560デフォルトの名無しさんNGNG
某国の場合
Pascal→Delphiみたいな名前置換があるやも

いやむしろナイスな銘々してくれって感じ?
オタ向け言語から一気に若者の主流に返り咲くか?
そういやcurlてどうよ?
本見た感じでは、うーん・・・
0561デフォルトの名無しさんNGNG
なんか短期間で書き込んでる変な人がいますね。
0562デフォルトの名無しさんNGNG
ACL Professionalの個人向け2年間$599リースは日本でもやってんの?
間に挟まってるぼったくり屋さんが黙って無さそうなんだけど。
AllegroPrologは7で入るんだっけ?それとも別製品か?作ってるのは知ってるけど
どんな製品ラインナップになるのかまでは知らん。
0563デフォルトの名無しさんNGNG
CLHS は float に inf や NaN を求めていないんですね.
これらが無いと困りませんか?
近日規格策定予定だったりしますか?
0564563NGNG
おっと,clisp の impnotes で触れられているのをまだ見てなかった.スマソ。
0565ミミNGNG
>>562
>ACL Professionalの個人向け2年間$599リースは日本でもやってんの?

Franz の営業さん (日本人) から聞きましたよ。
ただ、リースの場合のテクニカルサポートは英語のみだそうです。
0566デフォルトの名無しさんNGNG
>>565
マジですか。小俣ちゃんが言うんならそうなんだろな。
ACL7がリリースされて予定通りMacOSXでCommon Graphicsがサポートされて
同一条件だったら欲しいかも。日本語のテクニカルサポートなんかイラネ。英語で充分。
$1200で買い取りと$599で2年間リースのどっちにすっかで迷うな・・・
0567デフォルトの名無しさんNGNG
GaucheからPHPかPythonを使いたいのですが、どういう方法が
あるのでしょうか?

Cならこういう具合であるようなのですが。
http://www.shiro.dreamhost.com/scheme/wiliki/wiliki.cgi?Gauche%3aMeCab
0568デフォルトの名無しさんNGNG
>>567
あのな、C言語でどうやって使うかを考えろ。
それわかったらGaucheでも使えるだろ。
0569デフォルトの名無しさんNGNG
わかった!Pythonインタープリタを実装するんだね!!
0570デフォルトの名無しさんNGNG
おれもわかった!PHP を Scheme で書きなおすんだ!
…つか PHP なんてなんで使いたいんだ?
Gauche で書けよ HTML も
0571デフォルトの名無しさんNGNG
チ○コかきたい
0572デフォルトの名無しさんNGNG
MIT schemeがアンインストールできないんですけど・・・何なんだよヽ(`Д´)ノ
0573デフォルトの名無しさんNGNG
λ教は一度入ったら、
もう二度とやめれません
0574デフォルトの名無しさんNGNG
信者の社会復帰を支援するツールとしてPythonが用意されています
0575デフォルトの名無しさんNGNG
Pythonなんてswitch文さえまともに使えない言語はダメ
0576デフォルトの名無しさんNGNG
しかし豊富なライブラリは欲しいよぅ(;´Д`)
0577デフォルトの名無しさんNGNG
では parrot 待ちだな
0578デフォルトの名無しさんNGNG
parrotでみんな幸せになれますか?
0579デフォルトの名無しさんNGNG
schemeでRS232-Cを制御しようと思ったらどうすればよいのでしょうか。
0580デフォルトの名無しさんNGNG
>>579
>>568
0581デフォルトの名無しさんNGNG
初心者な質問ですみません。
よろしくお願いします。

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


0582デフォルトの名無しさんNGNG
>>579
termiosインタフェースがある処理系なら
Schemeオンリーでできないか? Gaucheとか。
ioctlが叩けないからだめかな。
0583デフォルトの名無しさんNGNG
>>581
普通にできるだろ
0584デフォルトの名無しさんNGNG
Unix でのおすすめの scheme 実行環境は何ですか?
0585デフォルトの名無しさんNGNG
>>584
guileが標準的
0586デフォルトの名無しさんNGNG
>>585
本気か?
いや俺も標準的になって欲しいとは思ってるけど…
0587デフォルトの名無しさんNGNG
>>586
ここではそれが良いって書いてあるけれど…
http://www.sra.co.jp/wingnut/standards-j_toc.html#Design%20Advice
0588デフォルトの名無しさんNGNG
GNU ソフトウェアの標準の拡張用インタプリタは GUILE である.
GUILE はScheme 言語の実装である
(Scheme は Lisp の非常にきれいで簡潔な方言である).
http://www.gnu.org/software/guile/.
われわれは他の「スクリプト言語」例えば Perl や Python で書かれたプログラムを
拒絶することはないが, GUILE を使うことは GNU システム全体の一貫性のためには
非常に重要である.
0589デフォルトの名無しさんNGNG
guile ってどう読むの?
0590デフォルトの名無しさんNGNG
>>588
それは知ってるけど、実際はまだろくに使っていないと思っているんだけど…
おれが無知なだけだったらスマン、例を教えて欲しい
0591デフォルトの名無しさんNGNG
>>590
いや、私もどこで使われているか知らない。
同様の用途ではPerlかシェルを良く使うと思うけれど。
でも標準が合った方が良いのは確かでしょ?
乱立しても、いくつの処理系をインストールしたくないし。。

>>589
guile=ぐいるって読んでいるけれど、どうだろう。
0592デフォルトの名無しさんNGNG
guileで書かれたスクリプトって何かあるの?
あまり見たことないような…
0593デフォルトの名無しさんNGNG
>>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ノ /-'"  `   ' !    ヽ     !
0594デフォルトの名無しさんNGNG
いつになったら”まだ”が取れるんだろう。
永遠にこない気がしてならない。
そもそも「標準の拡張用インタプリタ」とはなんぞや?
何時使うんだよ。
Linuxのインストーラーはpythonで書かれている様だし。
使われないで標準もあったもんじゃない。
そもそもSCMをベースにしておきながらあの遅さはなんなんだ?
Cにトランスレートすりゃあいいってもんでもないだろ。
0595デフォルトの名無しさんNGNG
ガイルでしょう
0596デフォルトの名無しさんNGNG
http://www.google.co.jp/search?num=100&hl=ja&ie=UTF-8&newwindow=1&q=guile+%E3%82%AC%E3%82%A4%E3%83%AB&btnG=Google+%E6%A4%9C%E7%B4%A2&lr=lang_ja
http://www.google.co.jp/search?num=100&hl=ja&ie=UTF-8&newwindow=1&q=guile+%E3%82%B0%E3%82%A4%E3%83%AB&btnG=Google+%E6%A4%9C%E7%B4%A2&lr=lang_ja
0597デフォルトの名無しさんNGNG
http://www.google.co.jp/search?num=100&hl=ja&ie=UTF-8&newwindow=1&c2coff=1&q=guile+%E3%82%AC%E3%82%A4%E3%83%AB+lisp&lr=lang_ja

http://www.google.co.jp/search?num=100&hl=ja&ie=UTF-8&newwindow=1&c2coff=1&q=guile+%E3%82%B0%E3%82%A4%E3%83%AB+lisp&lr=lang_ja
0598デフォルトの名無しさんNGNG
>>596
その検索結果には明らかに>>593のガイルが含まれているよ
0599デフォルトの名無しさんNGNG
lisp ガイル     7件
lisp guile ガイル  3件
guile ガイル    303件

ノイズばっかだな
0600デフォルトの名無しさんNGNG
>>598
綴として読むのだからどのガイルでも良いと思う。
0601デフォルトの名無しさんNGNG
lispじゃ引っかかんないんじゃない?
scheme
0602デフォルトの名無しさんNGNG
gaucheよりguileの方がいいところって何?
0603デフォルトの名無しさんNGNG
gacuhe-gl のマンデルブロートのサンプルを実行したいんですけど
load するだけじゃだめですよね
実行して画面にだしたいんですけどどうやったらよいのでしょう?
0604デフォルトの名無しさんNGNG
http://www.google.com/search?hl=ja&ie=UTF-8&q=scheme+guile+%E3%82%AC%E3%82%A4%E3%83%AB&lr=

http://www.google.com/search?hl=ja&ie=UTF-8&q=scheme+guile+%E3%82%B0%E3%82%A4%E3%83%AB&lr=
0605デフォルトの名無しさんNGNG
>>602
GNUのお墨つき。
0606デフォルトの名無しさんNGNG
そこで Pika Scheme ですよ
0607デフォルトの名無しさんNGNG
>>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あたりが無難?
0608デフォルトの名無しさんNGNG
gimpとか
0609デフォルトの名無しさんNGNG
その中だとbiglooがよさそう
0610デフォルトの名無しさんNGNG
guileはGNU/LINUXならほぼ最初から入っているので、悪い選択じゃない。
0611デフォルトの名無しさんNGNG
>>610
貴様はguile使ったことあるのか?
guile常用してるやついるの?
何に使うのか知らんが。
0612デフォルトの名無しさんNGNG
scheme処理系一覧っぽいのが出てきたところでふと思い出したのですが、
リアルタイムで経緯をご存知の方がいたらYale Tがどんな末路を辿ったのか教えて
いただきたく。全然話題にも上らないんでマイナーな本なんだろうと思うけど
Slade先生のObject-Oriented Common LispでLisp使い始めたのでちと興味あり。
0613デフォルトの名無しさんNGNG
>>581
> CLOSで引数を2つ取るメソッドを定義した場合、
> それ以降は引数の数が異なる同名のメソッドの定義(オーバーロード)
> って不可能なのでしょうか?
ラムダリスト(引数リスト)が合同(congruent)のメソッドは一つのGeneric function
に共存できると規定されています。

required argumentの数が違う2つのラムダリストは合同とは言えません。

find-method, remove-method を駆使して、メソッドをgeneric functionからすべて削除
した後で、異なるラムダリストを持つgeneric functionを定義することは可能です。

(defmethod foo (a b &optional c))
としておくのはダメなの?
0614デフォルトの名無しさんNGNG
既に知ってるかもしれんが、T についての文書ってこれくらいしか知らんなあ。
Olin Shivers: History of T
http://store.yahoo.com/paulgraham/thist.html
0615デフォルトの名無しさんNGNG
>>307
UnCommon Web は継続渡しスタイルで書けてなかなかおもしろい。
0616デフォルトの名無しさんNGNG
Schemeで次のようなリストを生成したいのですが、
どういう手続きになるのでしょうか。

(define l '("a" "b" ("c" "c1" "c2")))
(define (foo l)
(?))
=> (list ("a" "b" "c" "c1")("a" "b" "c" "c2"))
0617デフォルトの名無しさんNGNG
>>616
(define l '("a" "b" ("c" "c1" "c2")))
(define (foo boo) `(list ,boo))
(foo l)
=> (list ("a" "b" ("c" "c1" "c2")))
0618デフォルトの名無しさんNGNG
>>616の質問も、>>617の回答も、まったく意味がわからんのは俺だけ?
0619デフォルトの名無しさんNGNG
俺も分からん.
0620デフォルトの名無しさんNGNG
>> 618,619
すいません。質問がまちがってました。やりたいことは、S式で表現
したディレクトリ構造から文字列を生成する、です。
(define l '("a" "b" ("c" "c1" "c2")))
(define (foo l)
(?))
=> ("a/" "a/b" "a/c/" "a/c/c1" "a/c/c2")

0621デフォルトの名無しさんNGNG
>>620
リストはディレクトリ。そのリストの先頭がディレクトリ名。
リスト内の2番目以降がファイル名。としています。
(define l '("etc" "hosts" ("apache" "httpd.conf" "httpd.conf.bak")))
0622(define (´∀`) 'マターリ)NGNG
(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))))
今思いついたのはこんなの。
0623(define (´∀`) 'マターリ)NGNG
(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)))))
0624デフォルトの名無しさんNGNG
こんなもんか。(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 と被ってるじゃん。
0625デフォルトの名無しさんNGNG
>> 622 623
Gaucheを使ってます。このコードは何で動くのでしょうか。
>> 624
elispで動きました。gaucheのコードではどうなるのでしょうか。
0626デフォルトの名無しさんNGNG
>>625
やれやれ... それは君への宿題とするので来週までに解いてきたまえ。
それと、メール欄に sage と書きたまえ。
0627デフォルトの名無しさんNGNG
なんとかできました。(なんで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)))))))
0628(define (´∀`) 'マターリ)NGNG
(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は失敗作。
0629デフォルトの名無しさんNGNG
>>614
Tについてのドキュメントって異様に少ないですよね。普通に失敗したプロジェクトだったの
でしょうか。

>>615
継続スタイルはUCWのウリみたいですが、フレームワークの他の部分はどんな感じですか?
副作用バリバリの手続きでHTML生成する設計になってたりしたらイヤかも。
beseのMLに開発者がポストしてましたが、パフォーマンスが気になるくらい遅いですか?
もう少し詳細な使用感を語っていただけるとうれしいです。参考にするので。
0630デフォルトの名無しさんNGNG
Tは失敗というか、誰もメンテしなかった・できなかった結果のような
386以降で書かれてたなら誰もが欲しかっただろうし
0631デフォルトの名無しさんNGNG

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))))
0632631NGNG
間違ってた... かなり無理があるけど、これで当っているかな?

(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))))
0633デフォルトの名無しさんNGNG
(let ((next-dir (string-append dir (caar file) "/")))
(foo-iter (append result (list next-dir))
next-dir
(cdar file)))
(car file)の処理はこれでいいんだろうけど(cdr file)の分の処理がない。
0634デフォルトの名無しさんNGNG
(if (pair? (car file))の内側に(foo-iterがあるけど
(foo-iterの内側に(if (pair? (car file))を持っていったほうが
すっきりすると思う。
0635631NGNG
>> 633
まったく、おっしゃる通りでした。

>> 634
...暫く考える...
なるほど。なんとなくイメージできました。勉強になります。

他の人のと見比べるとやっぱり、map とかも勉強しないとだめですね。
0636デフォルトの名無しさんNGNG
>>631
SICPの何ページですか。俺の勉強したいので。
0637デフォルトの名無しさんNGNG
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);
0638631NGNG
>>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))))
0639デフォルトの名無しさんNGNG
foo-entryにresultはいらんな。
0640デフォルトの名無しさんNGNG
foo 本体は(foo-entry 'hoge "" l)でいいな。
0641デフォルトの名無しさんNGNG
>>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)))))))
0642デフォルトの名無しさんNGNG
スペースの変換を忘れてたorz
(define (foo l)
  (if (string? l)
    (list l)
    (map (lambda (x) (string-append (car l) "/" x))
         (cons "" (apply append (map foo (cdr l)))))))
0643631NGNG
>>639 >>640
確かにそうですね。

>>641
メリットは特にないですね。
高階関数に馴染みがなくてあれ以外の実装を
思いつかなかったというのが真相だったりします。

やろうと思えば引数を増やして全て末尾再帰にできるかも
しれませんが、やたら読みにくいソースになるでしょうね。
0644デフォルトの名無しさんNGNG
埋め込み言語の例というのが見てみたいんだけど,
onlisp 以外にもなにかありませんか?
0645デフォルトの名無しさんNGNG
>>644 これとか?
ttp://www.shiro.dreamhost.com/scheme/vault/escm.html

これはちょっと埋め込みとはちがうけど、S 式で HTML を書くというアプローチ
ttp://cl-www.msi.co.jp/solutions/knowledge/
ttp://cl-www.msi.co.jp/solutions/knowledge/src
0646645NGNG
あ、ちがった、埋め込み言語ってそういう意味じゃないのね。

たとえば Lisp/Scheme で書かれた LR パーザジェネレータとか。
腐るほどありそうだな。今、さっと見つかったのはこんなの。
ttp://www.informatik.uni-freiburg.de/proglang/software/essence/doc/html/essence.html
0647644NGNG
>>646
ども.
たしかに数はたくさんありそうなんですけど,うまく見つけられなくて.
ここのリンク先のはソースもあるんで,
schemeは使ったこと無いけど,本とにらめっこしながら読んでみます.
他にもいい例があればお願いします.
0648デフォルトの名無しさんNGNG
LISPはちょっとかじった程度でよくわかってないのですが
質問させてください

たとえば、Cでネットワークゲームを作るときに
なんか処理したかったら、適当なデータ構造に
情報を埋め込んで送信して、受信側でデータを解釈→処理
とかなりますよね
LISPのevalとかを使うと、プログラム本体がデータ構造もかねるから
動作させたい処理のS式をそのままリテラルとして送信して
eval させて動作させてしまう、とか出来るんでしょうかね?
0649デフォルトの名無しさんNGNG
Lisp に限らず、eval のある言語ならだいたいできるんじゃないのかな。
0650デフォルトの名無しさんNGNG
eval is evil.
0651デフォルトの名無しさんNGNG
でもそういう設計はよくないけどな。
ネットワーク越し(じゃなくても)で通信するときに相手から送られてくるものを
信用するというのは危険すぎる、ということを歴史は教えている。
0652デフォルトの名無しさんNGNG
>>651
アプレットやSOAPと基本は同じでしょ?
用はセキュリティーの確保の仕方の問題だと思われ。
0653デフォルトの名無しさんNGNG
>>648
evalも結局のところは、「受信側でデータを解釈→処理」してるだけ
なんだけどね。「解釈→処理」の処理系が最初から用意されていると
いうだけで。

汎用性が高い、本体と同じ言語で書ける、といった側面はそのまま
メリットにもデメリットにもなるし。
0654デフォルトの名無しさんNGNG
scheme の eval みたいに環境を指定できれば比較的手軽にセキュリティー確保できるね
0655デフォルトの名無しさんNGNG
shiro さんの2004.10.07の文章で、
http://www.shiro.dreamhost.com/scheme/wiliki/wiliki2.cgi?Shiro

以前から Lisper としての適性に関係があるとして、時々話題になっている、
アスペルガー症候群・高機能自閉症の、簡易テストが紹介されている。

「平均は16.4ポイントで、 32ポイント以上のうち8割はautism related disorder
だそうだ。私(shiroさん)は31ポイントだった」そうです。
http://www.wired.com/wired/archive/9.12/aqtest.html

自分でやってみたところ、慎重に回答したのに38ポイントだった。
しかし自分はヘタレ Schemer。ぜんぜんLisp能力に比例して無いじゃん…。
0656デフォルトの名無しさんNGNG
このテスト、人間関係が苦手である、うまく行っていないという項目が多いな。
だから、

・ Lisper として能力が高い
→・他言語のプログラマとしても成功する
→・周囲から尊敬を集める
→・人間関係が良くなる
→・このテストのスコアが下がる

Lisper としての能力と、このテストのスコアには、こういう負の相関が
働いている気がするのだが。
0657デフォルトの名無しさんNGNG
心理テストに気休め以上の意味があるとは思わん。
0658デフォルトの名無しさんNGNG
>>655
辞書引きながらやってみた。 24ポイント。
微妙に低くてチョトくやしい (w
0659655NGNG
念のために言うけど、このテストはまったく当てにならないと思うよ。
『on Lisp』をいつまでも読み進められない私がそれは保証できる。

だけどなんとなく、ほかの人の点数も知りたいのう。
冷やかしでトライしてくれた人、他にもいたら書き込んでください。
おながいします。
0660デフォルトの名無しさんNGNG
34。Lisp は好きだけど能力があるのかどうか……
0661デフォルトの名無しさんNGNG
emacs で動く scheme 実行環境はありますか?
0662デフォルトの名無しさんNGNG
>>659
自閉症スペクトラムのテストとしてはそこそこいい出来だと思うが。
親戚男性自閉症率高の趣味の Schemer で、40点。非人間的なものへ
のこだわりと認識能力で点数が出て、直接 Lisp と関係があるわけ
じゃないから。

>>661
M-x run-scheme では不満?
0663655NGNG
>>662
自閉症スペクトラムについては、まあ同意です。
自閉症には私も興味を持って、いろいろ調べてみたことがあります。

「当てにならない」と書いたのは、Lisper としての能力と、このテストの関連。

>>661
思い切って guile-emacs を導入するのはどうだろう?
使ったことはないけれど。
0664デフォルトの名無しさんNGNG
>>656
・ Lisper として能力が高い
→・でも別にプログラマとしては成功しない
→・周囲からも尊敬は集めない
→・人間関係も良くならない
→・このテストのスコアが上がる

Lisper としての能力と、このテストのスコアには、こういう正の相関が(以下略)
0665デフォルトの名無しさんNGNG
感O しないで AC になれなかったので,
せめて lisp で AC に近づこうとしています.
これが妥当な lisp の用途ということでよろしいでしょうか?
0666655NGNG
それにしても、当然のように「自閉症スペクトラム」という言葉を使う人も、
やはりこのスレにはいましたか。ポイントも私より上だし。

>>664
私はプログラマとして才能がなかったんで、Lisp を覚えて「普通の奴らに差をつけ」
ようとしたんだけど、Lisper としても才能がなかった。
しかも副作用として、それまでは面白かった Java がつまらなくなってしまった。

自分はダメだったけど、Lisperとして成功できる人なら、他の言語でも成功するのかと
思っていたのに、まさか逆だというのですか?!


>>665
私は感電と Lisp の経験者だけど、現状は前述のとおり。
でもいいのだ。Lisp は面白いから。
きっと Lisp は、ただ面白いためにあるのだ。


才能はさておき、こういうことに興味を持つことには、自閉症傾向は関係が
あるような気がしなくもない。
0667デフォルトの名無しさんNGNG
ACよりもSEXPになりたい。
0668デフォルトの名無しさんNGNG
この自閉症どもが
0669デフォルトの名無しさんNGNG
>>667
sexp が t になるには 8 歳までに (ry
0670デフォルトの名無しさんNGNG
     ∩
( ゚∀゚)彡 sexp!sexp!
 ⊂彡
0671デフォルトの名無しさんNGNG
Lispの才能と体重は正比例の関係があるらしいよ
0672デフォルトの名無しさんNGNG
>>671
デブヲタ発見。
0673デフォルトの名無しさんNGNG
sexpと体重は正比例の関係があるらしいよ
0674デフォルトの名無しさんNGNG
「on Lisp」の日本語版があるって聞いたんだがその本の日本語名ってなに?
'on' も 'Lisp'も一般的すぎて検索してもよくわからない・・・

本じゃなくてどこかのWebページなのか?
0675デフォルトの名無しさんNGNG
>>674
>>544
0676デフォルトの名無しさんNGNG
>>674
>>544
0677674NGNG
おお、サンクス!!
スレの真ん中あたりにあったのか・・・

#こう書くべきかな? (thanx 675 676)
0678デフォルトの名無しさんNGNG
>>671
なんとなく,才能は体重の逆数にあるような.
0 Kgで発散しますが,CLHS には inf が無いのでちょっと分かりません.
0679デフォルトの名無しさんNGNG
Gauche(ver 0.8.1)でGauche-gtk(ver 0.4.1)
やってるんですけど、
(gdk-font-load)が未定義の値って言われちゃいます。
なんで?

0680デフォルトの名無しさんNGNG
まだ4kgもないうちの甥っ子は天性のlisperなのかしら
0681デフォルトの名無しさんNGNG
大人になると、才能は錆付くんだよ。
0682デフォルトの名無しさんNGNG
SRFI40: A Library of Streamsを読んでて違和感を感じたので、それを文に
してみた。schemeのプロミスの話。感想きかせて。

members3.jcom.home.ne.jp/t-yam/promiseless.html
0683デフォルトの名無しさんNGNG
ブラクラ?
0684デフォルトの名無しさんNGNG
>>682 いいんじゃない? そもそもR5RSはdelayが特定の「プロミス型」を
返すことを要求していないから、そこで必要な時に必要なだけforceされる
処理系も許されてるんじゃないかな。(delayの返す値は「プロミスである」
とされているだけで、それが具体的に何なのかは未定義。さらに、
「プロミスとそれがforceされた値とを区別することは規格内ではできない」
とされているから、プロミスなんてユーザには見えない、っていう処理系
もありと。)

個人的にはimplicit forceしてくれた方がずっとプログラマに易しいと
思う。R5RSでそうなっていないのは、色々な遅延評価メカニズムを実装する
ベースとしての処理系実装も許しているからなんじゃないかな。色々
試してみたいときにはforceされるタイミングを制御したいことも
あるんじゃない?

0685デフォルトの名無しさんNGNG
具体的なコードを挙げると説得力が増すぞ。
0686デフォルトの名無しさんNGNG
delay/forceが無駄な仕様にみえて仕方がない。
Schemeの思想と背反する様な。
実際使う事あるの?
0687デフォルトの名無しさんNGNG
くまああああああ
0688682NGNG
レスありがとう。

>>684
R5RSの注意すべき点は、プロミス型があるかどうかではなくてプロミスが
オブジェクトであること(R5RS 4.2.5)だと思う。それが根本的な問題かと。

> forceされるタイミングを制御したいことも
ありそうだよね、これ。ただ、必要になったときに強制されるのだ、という
方が純粋なcall-by-needに近いようにも思う。

>>685
リンクたどればあるよ。
0689デフォルトの名無しさんNGNG
>>674
"On Lisp"とかぐーぐるさまに教えると次の検索で少しは幸せになれるんではなかろうか。
0690682NGNG
再レス。
>>684
> プロミスなんてユーザには見えない、っていう処理系もありと
あなたの言ってることがわかったw
R5RSのforceの解説の最後の方にそう書いてあるのね。完全に見落としてた。
thx
0691デフォルトの名無しさんNGNG
forceはpromiseにしか適用できない(かもしれない)のに、
promiseであるかどうか判別する手段が無い(かもしれない)。

つまり完全に評価順序が分かっててpromiseと値を混在させないように
プログラムが書けるときしか使えない。
でも遅延評価ではあらかじめ評価順序を知るのは一般にはとても難しい。
実用性が全然ないような。(>>616をさえ遅延評価で書くのに挫折…)
0692デフォルトの名無しさんNGNG
>>691
forceは何にでも適用できるよ。それは保証されてる。
promiseであるかどうか判別する手段はないかもしれない。
0693デフォルトの名無しさんNGNG
>>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>
0694692NGNG
あ、わりい。漏れの勘違い。
'may' だから、適用できるかどうかわからんのね。
なんだ、ますます使い勝手が悪いなあ。
0695デフォルトの名無しさんNGNG
>>691
関数的なもの、つまり副作用が無いものであれば評価順序に意味は無いはず。
そういうものと組み合わせてこそ promise の真価は発揮される。
一度評価したら二度目以降の force は必ず同じ値になるというのもそう。

とはいいつつも delay/force を使ったことないや。
0696デフォルトの名無しさんNGNG
>>695
> 関数的なもの、つまり副作用が無いものであれば評価順序に意味は無いはず。
間違い。それなら遅延評価なんて要らない。

そもそも副作用の話はしていない。>>691で言っているのは、
「評価順序が完全にわかってない場合、一度forceしてしまったものに
もう一度forceしてしまうことがあり、それがエラーになる(実装依存で)」
ということ。
0697デフォルトの名無しさんNGNG
何度 force しようが promise は promise のままでは?
force した結果の値を他で保持しておく必要無いんだし
0698デフォルトの名無しさんNGNG
691は「渡された値がpromiseかどうかわからないから念のためforceしとけ」
ってことができない、って言いたかったんじゃない?

>>695 正規順序と適用順序について調べるとよろし。
0699デフォルトの名無しさんNGNG
>>697
forceした結果を他の関数に渡さないと計算は進まないし、
delayし忘れると計算してしまう。
なにか自分でプログラミングしたら難しさがわかると思うけど。

自分が遅延評価のプログラムだと思うものをgoshで組んだ後
MIT Schemeにかけてそのまま動いたら、結構すごいことだと思うよ。
0700デフォルトの名無しさんNGNG
>>698
そうです。

全部promiseにしてしまえばいいのだろうけれど、
それには一から遅延評価の処理系を作るか、
それなりのライブラリを作った上で注意深くforce/delayを
利用しつつ目的のプログラムを作るか、
ということになって、どっちもかなりのオーバーヘッド。

すぐには計算して欲しくない所にだけ適当にdelayいれておいて後で
なんとかするというわけにはいかない。
0701デフォルトの名無しさんNGNG
>>655
微妙に訳が違ってないか?
Eighty percent of those diagnosed with autism or a related disorder
scored 32 or higher.

元訳:32ポイント以上のうち8割はautism related disorder
試訳: 自閉症やその関連の診断を受けた人の8割は、32ポイント以上だった。

つまりこれは、このテストが8割の診断者をカバーすると言ってはいるが、
普通の人がテストを受けて、スコアが高ければ自閉症だ、とは言っていないんじゃないか?
0702デフォルトの名無しさんNGNG
自閉症は黙ってろ
0703デフォルトの名無しさんNGNG
ACになろうとして
感電死
0704デフォルトの名無しさんNGNG
>>701
そのとおり。
つまり、テスト問題を
 1 + 1 = 2 は正しいか?
にすれば、
  Ninety nine percent of those diagnosed with autism or a related disorder
  scored fully.
0705ミミNGNG
Unicode (UTF-16) ベースの Scheme 処理系を作る場合、
R5RS の read-char 手続きは、ポートから 2 バイトを読み取って Unicode 文字を返すのが
自然ですよね?1バイト読み取りのためには read-byte のような拡張手続きを用意して。
既存コードとの互換性がなくなると思いますけど。。。
0706デフォルトの名無しさんNGNG
read-charとかの関数の他に読み込む文字種を指定できるといいんじゃないかな

(set-input-char-set 'ネコミミモード)

(with-input-char-set 'ネコミミモード
(read)
)
=>ネコミミモードでーす

とか
0707デフォルトの名無しさんNGNG
read-char は「文字」を返すだけで、それがどんなエンコードだとかどんなサイズであるかなどは R5RS では規定されていない
0708デフォルトの名無しさんNGNG
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)'

とやると,(長いので分割)
0709708NGNG
; 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)
0710デフォルトの名無しさんNGNG
a.soのシンボルをリストアップしてみりゃわかるよ
0711708NGNG
>>710
はじめてナノメートル nm しました.
うまくいきました! ありがとうございます.
今から >>710 に萌えます (;´Д`)


gcc で作ったやつと比較して,トンでもないシンボル名になっていました.
でもその名前で lisp コードに書き,アンダーバー `_' をハイフン `-' に変えて
使ってみると,正常に動きました.
シンボル名が変にならないようにする方法はこれから調べます.
0712デフォルトの名無しさんNGNG
>>705 see srfi-56
0713デフォルトの名無しさんNGNG
call-with-current-continuationについて教えてください.
多分誤解しているのだと思います.
たとえば,
(call/cc (lambda (k) (* 20 (k 30))))
   => 30
になると思います.
これを,
「kというprocedureがactiveになった時点で,それに
渡されるべき30という引数が返されたのである」と
理解していましたが,これは誤りなのでしょうか?
この考え方をもって既存のコードを読むと,実際に
返される値と異なる結果になってしまいます.
どこがいけないか,ご指摘願えますでしょうか.
よろしくお願いいたします.
0714デフォルトの名無しさんNGNG
kという手続きがxを引数に呼び出されると、
対応するcall/ccの返却値としてxが戻される。
もちろん後続の処理もcall/ccが普通に戻った場合と同じように続く。
0715デフォルトの名無しさんNGNG
>>713
「procedureがactiveになる」ってどゆこと?
0716デフォルトの名無しさんNGNG
>>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 ...)が丸ごと置き換わると考えるととりあえずよいかもしれない。

あまり説明になってないかな^^?
0717デフォルトの名無しさんNGNG
>> 715

713です.
「procedureが呼び出される」に訂正.

>> 714

ありがとうございます.
ということは根本的に間違えた考えではないと理解して,
コードを追い直しています.
0718716NGNG
書き込みの途中に継続を呼んでしまったようだ... ごめん m(_ _)m
0719デフォルトの名無しさんNGNG
>> 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 ではエラーとなり確認できません.
0720デフォルトの名無しさんNGNG
>>711
>シンボル名が変にならないようにする方法はこれから調べます.

そいつはC++を使ってる限り無理だ。関数の多重定義を実現するために、
シンボルには型情報がくっつくようになってる。
0721デフォルトの名無しさんNGNG
継続(continuation)のメモ
ttp://www.opengroupware.jp/~hoti/blog/Scheme
0722デフォルトの名無しさんNGNG
719 です.

>問題はこのprocedure自体を返すのか,evalった結果を
>返すのかの違いにあるのだと思いますが、「eval忘れ」
>がどこかにあるのでしょうか?
は間違いですね。
問題はこのprocedure自体を返すのか,呼び出した結果を
返すのかの違いにあるのだと思いますが、「呼び出し忘れ」
がどこかにあるのでしょうか?
の意味です。
0723708NGNG
>>720
なんと,,,そうですか.今ちょっと調べ疲れていたところでした.
どうもありがとうございました.
まあ lisp コードなんてすぐ修正できてしまうからいいんですよね!
0724デフォルトの名無しさんNGNG
>>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" が返却される。
0725デフォルトの名無しさんNGNG
訂正
719の中の置換したコードは
((call/cc (lambda (k) k)) (lambda (ignore) "hi"))
のつもりでした.

>>724
ありがとうございます.最終的に
((lambda (ignore) "hi") (lambda (ignore) "hi"))
に置換されるのがミソのようですね.
まだまだSchemerになれていないので,724をなぞって
ゆっくり考えます.ありがとうございました.
0726デフォルトの名無しさんNGNG
>>723
extern "C" {
ネコミミモード
};
0727716NGNG
おれが安易に「丸ごと置き換わると考えるととりあえずよいかもしれない」なんて書いちゃったのは良くなかった。ごめんなさい 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は忘れてください ^^;
0728デフォルトの名無しさんNGNG
スコープだけじゃないね。
(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))))
はちがうし。
あたかも置き換えたかのようにジャンプするというか・・・。
0729デフォルトの名無しさんNGNG
713です.
多くの丁寧な follow-up をありがとうございます.
call/ccはSchemeらしいところだと思うのですが
それだけ奥が深いですね.
何せ midnight programmer なものですから,
これから寝るまで頭をひねって考えます.
今後ともよろしくお願いします.
0730デフォルトの名無しさんNGNG
schemeの継続って、プログラムの最小限要素をくくりだすのはいいが
そのためにやたらコストの高いものを導入してしまったという感じがする。
Smalltalkでの何でもかんでもオブジェクトとメッセージに近いものがある。
継続そのものが便利なときもあるけど、なくてもほとんど困らない。
0731デフォルトの名無しさんNGNG
継続抽出は銀の弾丸です
0732デフォルトの名無しさんNGNG
ほんとにそうなら継続のある言語がとっくに天下をとってると思う。
0733デフォルトの名無しさんNGNG
悪い方が良い法則。
0734デフォルトの名無しさんNGNG
おまえらただ継続継続いいたいだけちゃうんかと。
継続なんて極力使わない方がいい。
gotoがよりパワフルにそしてわかりにくくなったものだから。
銀の弾丸どころかソフトウェアエンジニアリング的には狼男だ。
0735デフォルトの名無しさんNGNG
例外処理のような上手い使い方ならいいんだけどね
0736デフォルトの名無しさんNGNG
ちんちんかゆいーー!
0737デフォルトの名無しさんNGNG
gotoが悪ならthreadなんて巨悪だな
0738デフォルトの名無しさんNGNG
>>736
cut しろ
0739デフォルトの名無しさんNGNG
>>737
threadとgotoは比べるもんじゃないだろ。
threadは基本的に代えがきかない。
0740デフォルトの名無しさんNGNG
The Seasoned Schemerの継続の説明らしい章を読んでます。
で、質問なんですが、この本の中では継続を「call/cc」じゃなくて
「letcc」(schemeの場合)、「throw」「catch」(CommonLispの場合)で
説明してるんですけど、これらは等価なものなんですか?
0741デフォルトの名無しさんNGNG
>>740
shiroさんのなぜ Scheme には return がないのか
http://www.shiro.dreamhost.com/scheme/wiliki/wiliki.cgi?Scheme%3a%a4%ca%a4%bcScheme%a4%cb%a4%cfreturn%a4%ac%cc%b5%a4%a4%a4%ce%a4%ab
を読むとその辺がわかるかも。
0742デフォルトの名無しさんNGNG
continuationとgotoは比べるもんじゃないだろ。
continuationは基本的に代えがきかない。
0743デフォルトの名無しさんNGNG
はっきり言って、continuation≒gotoだよ。認めたくないだろうけどね。
gotoでcontinueもbreakもreturnも出来るじゃん、美しい!って悦に入ってるのが
schemer
0744デフォルトの名無しさんNGNG
だがそれがいい
0745デフォルトの名無しさんNGNG
>>742
おうむ返しだけだと馬鹿にしか見えませんよ。

continuationはやろうと思えばいくらでも書き換えられる。
書き換えたらフラグだらけになったり、
巨大な関数になったりしてして醜いから、使う、というものでしょ。
もちろんそういうときに使うのはいいけど、
できるときはwhileとかforとかmacroにしたほうがいいだろう。

threadはthreadを使わずに同じ機能を実現することが難しい。
特にthreadのどれか一つが死んだりしても他のthreadが監視しておいて
処理できる、という能力はエミュレートできない。
エミュレートだとスケジューリングがうまくいくように一単位の
処理時間をコントロールできないといけないし。
0746デフォルトの名無しさんNGNG
ケイゾクに恨みでもあるんですか?
0747デフォルトの名無しさんNGNG
色んな意味でコストがかかるところ。
0748デフォルトの名無しさんNGNG
>>746 ないけど?
0749デフォルトの名無しさんNGNG
threadだって高速に処理切り替えてるだけだから、
gotoで出来ないことはない。
0750デフォルトの名無しさんNGNG
スレッドと継続は全く別個の独立した概念であり、対立するものでもないのに何をムキになってるんだろう。


> 書き換えたらフラグだらけになったり、
> 巨大な関数になったりしてして醜いから、使う、というものでしょ

それこそ継続という概念が primitive なものであるということであり、scheme らしいところでは?
primitive なものさえあれば他の機能はそれらを組み合わせてできる。美しい。
例えば、コルーチン程度であれば call/cc で簡単に実現できる。
0751デフォルトの名無しさんNGNG
コルーチン程度しかできない、の間違いでしょ
0752デフォルトの名無しさんNGNG
Rubyの継続の実装はスレッドと同じだそうですよ
http://i.loveruby.net/ja/rhg/cd/continuation.html
0753デフォルトの名無しさんNGNG
>>749
gotoでどうやって
> 特にthreadのどれか一つが死んだりしても他のthreadが監視しておいて
> 処理できる、という能力はエミュレートできない。
するんだ?
そしてどうやって一つの処理単位がCPUタイムを食いすぎないことを保証するんだ?
> エミュレートだとスケジューリングがうまくいくように一単位の
> 処理時間をコントロールできないといけないし。

>>750
> スレッドと継続は全く別個の独立した概念であり、対立するものでもないのに何をムキになってるんだろう。
じゃああなたが>>737や>>749を説得して上げてください。
0754デフォルトの名無しさんNGNG
gotoさえ使えば、breakもcontinueもreturnもいらないのはもちろん、
スレッドも関数もいもいらない。こういう機能はgotoを組み合わせてできる。
美しい。
0755デフォルトの名無しさんNGNG
>>750
美しかろうがどうだろうが、
「継続を無闇に使うべきでない」という事実には変わりはないな。
0756デフォルトの名無しさんNGNG
アセンブラにすりゃただのジャンプ命令。
ジャンプ命令使わずにアセンブラでプログラム組めるわけが無い。
即ち、息をするようにgotoを使え。
0757デフォルトの名無しさんNGNG
引数つきgoto
0758デフォルトの名無しさんNGNG
〉〉753OSやリアルタイム制御の本みれば書いてあるよ。つーか知らないの?
0759デフォルトの名無しさんNGNG
ヘタレLisperと本物のプログラマを隔てるOSという一つの壁
0760デフォルトの名無しさんNGNG
>>736-738
Prologの話?
0761デフォルトの名無しさんNGNG
まだちんちんかゆいよーー!
なぜか皮が膨らんできてる・・・
0762デフォルトの名無しさんNGNG
>>751
ユーザモードのスレッドは、本質的にはコルーチンと同等だけど?
0763デフォルトの名無しさんNGNG
コルーチンって何?
0764デフォルトの名無しさんNGNG
>>763
http://www.google.com/search?hl=ja&lr=lang_ja&ie=SJIS&oe=SJIS&num=100&q=%83R%83%8B%81%5B%83%60%83%93
0765デフォルトの名無しさんNGNG
>>762
ユーザーモードのスレッドは必ずしもそうでないと思うけど、
ユーザーモードのスレッドライブラリはそうだね。で、それが何か?


話は変わって、
そもそもSchemeの継続ってプリミティブか?
単にCPSで書けばいいだけじゃないの?こっちはどんな関数型言語にもできるし。
0766デフォルトの名無しさんNGNG
機械語のライブラリを実行中に継続を取ってきても
きちんと動くように要請してるんじゃない?
0767デフォルトの名無しさんNGNG
>>765
なんでそこに CPS が出てくるのか意味がわからない
0768デフォルトの名無しさんNGNG
>>768
Continuation Passing Style のことだよ?
0769デフォルトの名無しさんNGNG
>>767 の言いたいことを推測。

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

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

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


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

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

> 個人的には、Schemeの継続は言語の実験をするための道具って
> 感覚が強いな。
同意。
0771デフォルトの名無しさんNGNG
やたら継続を美しいと賛美しているのは、つい最近大学の
講義で継続を知って嬉しくなってる厨房だよね?
0772デフォルトの名無しさんNGNG
>>771
はい。
0773デフォルトの名無しさんNGNG
四角いタイヤでも目盛がついていれば長さを測ったりできて便利かもしれんが、
それで高速道路を走るのは無理だ。
0774デフォルトの名無しさんNGNG
で?
0775デフォルトの名無しさんNGNG
ちんちんかゆいーー!
0776デフォルトの名無しさんNGNG
>>775
切っとけ。
0777デフォルトの名無しさんNGNG
>>770
だから?基底をなす機能しか使っちゃいけないなら、
ラムダだけ使えば?
理論上は統べての計算はラムダ式で可能なんだから、
0778デフォルトの名無しさんNGNG
継続がプリミティブだからエライと言い出した
のは継続厨房でしょうが
0779デフォルトの名無しさんNGNG
だからつかわなきゃいいじゃん
threadだろうがcall/ccだろうが理解してない
人間がつかうと危険なのは当たり前。
0780デフォルトの名無しさんNGNG
>>778
エライなんて誰も言ってないよ
0781デフォルトの名無しさんNGNG
>>777
基底をなす機能しか使っちゃいけないなんて誰も言ってないよ。

>>779
理解している人間が使ったって危険なんですが。
というか、誰が使っても危険なものだということを理解していない人間は
理解している人間ではないでしょうね。
0782ミミNGNG
>> 個人的には、Schemeの継続は言語の実験をするための道具って
>> 感覚が強いな。
>同意。
私も同意。
例外処理のような代替機能があれば十分だと思う。
0783デフォルトの名無しさんNGNG
どういう場合になにが危険といってるの?実装といっしょにあげてみてよ。
0784デフォルトの名無しさんNGNG
>>782
で、言語の実験で良い結果が得られたらその度に代替機能を実装してくの?
0785デフォルトの名無しさんNGNG
>>783
危険っぽいコード
(define go #f)

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

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


はわわ〜
0786デフォルトの名無しさんNGNG
>>784
パフォーマンスを上げたいなら専用化した方がいいからね。
限定的な継続にして万能な部分を切っていく。
VBのバリアント型みたいなものだよ。
0787デフォルトの名無しさんNGNG
>>784
良い結果がって言うよりさ、そもそも言語の設計で「良い悪い」を
判断するのって使ってみないとわからんわけじゃん。で、処理系
ネイティブに実装する方式だと、その処理系を使ってる人しか
試せない。だけどSchemeの場合、かなり凝ったことまで言語組み込み
のプリミティブを組み合わせで書ける。そしたら、R5RS準拠の
処理系ならどれでもその提案を試してみることができるわけだ。

こいういう場合に使われるcall/ccなんかは、むしろ提案する
言語機能の仕様記述なわけよ。ところが、Schemeの場合は
その仕様記述が動かせるプログラムになる。
0788!= 782NGNG
>>784
そう。実装してく。
whileやらbreakやらgeneratorやらに抽象化してそれを安全に使う。
call/ccはそれを作る道具であって、call/ccのスパゲッティを毎回
ほどいて、俺には解けるから危険じゃないとか言って喜ぶための
ものじゃないと思うね。
上手い抽象化を考えたりその抽象化を実装したりするのに頭をつかおう。
0789ミミNGNG
>>784
実用上の開発では言語実装にまで遡って設計の見直しを図ることは稀でしょう。

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

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

>>786
>パフォーマンスを上げたいなら専用化した方がいいからね。
>限定的な継続にして万能な部分を切っていく。
これに同意。
Scheme に継続しか用意しないというのは実用的ではないという感じがします。
0790デフォルトの名無しさんNGNG
「実用的な」制御構造がいずれも継続の上に(マクロで?)構築した
ライブラリとして書けるっていうのがSchemeの主張なんじゃないの?
0791デフォルトの名無しさんNGNG
話がループしているのは継続のせいですか?
0792デフォルトの名無しさんNGNG
じゃあ高速な継続の実装の仕方でも考えるかい?
0793デフォルトの名無しさんNGNG
>>791
gotoのせいです。
0794デフォルトの名無しさんNGNG
>>790
そう。
パフォーマンスとかが必要ならそれぞれの実装系においてライブラリ部分をCとかで実装していけばよい。
0795デフォルトの名無しさんNGNG
結局Schemeは非実用的ということですね
0796デフォルトの名無しさんNGNG
わざわざ去勢する必要もなかろう
0797デフォルトの名無しさんNGNG
CommonLispのマクロについての質問。
マクロはコンパイル時に評価を行う、ということは、コンパイルプロセスを
実行プロセスから分離することはできない、ということでOKでしょうか?
また、関数の中でマクロが定義されている場合、関数が呼び出される度に
マクロ展開(とコンパイル)が行われるのでしょうか?
0798デフォルトの名無しさんNGNG
どういう動作をすると思ってるの?
0799797NGNG
実行とコンパイルがインターリーブしていて、マクロの展開関数の中
から他の変数なんかも参照できる。その変数の値によって、展開の結果
が変わるかもしれない...というふうに"思って"います。

根本的に間違ってますか?
0800デフォルトの名無しさんNGNG
継続の話。

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

実際、おれの場合、大域脱出くらいでしか継続は使ったことないな。
0801デフォルトの名無しさんNGNG
>>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 的にはどうなっているんだろう?
0802デフォルトの名無しさんNGNG
重複定義でエラーが正解
0803デフォルトの名無しさんNGNG
>>801
その例は実行時までプログラムの意味が決まっていないよね?
そういうマクロはたとえ可能としても悪いマクロだと思う
(実際おれは不可能と思ってたし)
役に立つ場合って何かあるかな?
0804デフォルトの名無しさんNGNG
>>797
> また、関数の中でマクロが定義されている場合、関数が呼び出される度に
> マクロ展開(とコンパイル)が行われるのでしょうか?

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

>>801
xyzzy でもコンパイルすると clisp と同じ結果になりますね。
でもいまいちピンとこない結果だなあ。
(defmacro m () 20) は展開時には、つまりコンパイル時であれ関数定義時であれ、評価されませんよね?
だったら (m) は展開できない気がするんですが。勘違いしてる?
0805ミミNGNG
> (defmacro m () 20) は展開時には、つまりコンパイル時であれ関数定義時であれ、評価されませんよね?
リーダが読み取って、最適化された内部構造体に変換するときに、
ついでに defmacro を評価してしまうという実装はあり得ると思う。
(そんな処理系を見たことがある気がする。)

その場合、最後に出てきた m の定義によってオーバーライドされてしまうので、
上記のような結果になるのでは。
0806804NGNG
>>805
あーなるほど、それなら納得いきますね。
確かに普通それで問題ないでしょうし。
0807デフォルトの名無しさんNGNG
そういうマクロはエラーにして欲しいなあ。
eval介入するならともかく、使い道なんてないでしょ。
0808デフォルトの名無しさんNGNG
Gaucheはエラーになった
0809デフォルトの名無しさんNGNG
>>808
GaucheってSchemeでしょ?
Scheme的には>>801て文法的にありえんし…
mのスコープが意味不明。
0810デフォルトの名無しさんNGNG
>>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) が返ってきました。
……しかし、どうにも病的な例しか思い浮かばないなあ。
0811デフォルトの名無しさんNGNG
letがないものが条件コンパイルのイディオムとして使われて
てもよさそうだと思ったんだけど、そうでもないのかな?
0812797NGNG
コンパイル時の環境・値をキーワードにして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))
0813Ruby >>>>>>>>>>>>>>>SchemeNGNG
Scheme を駆使して、「普通のやつらの上を行け」るのは、(少なくとも現状では、そして恐らく永久に)ごく一部のプログラマであって、
普通のプログラマが少しでも「普通のやつらの上を行け」るのは、Ruby になるような気がしています。
http://jp.rubyist.net/magazine/?0002-WCNewsPaper#l7
0814デフォルトの名無しさんNGNG
結局のところ、CommonLispでマクロを安全に使うには、
(1)トップレベルで定義する。関数内では定義しない。
(2)同名のマクロの再定義はしない。
(3)スペシャル変数等の環境で動作が変わるマクロは書かない。
ということですか?
0815デフォルトの名無しさんNGNG
ものをちゃんと理解する、が一番じゃないかな。
まあ理解できないからこそ安全に〜とか言ってるんだろうけど。
0816デフォルトの名無しさんNGNG
>>815
それなりの指針を与えることは、有益だとおもうけどどうかな。
だれだって最初は初心者な訳なんだし。
0817デフォルトの名無しさんNGNG
>>816
指針としては、

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

って基本を叩きこめば十分じゃないか?まだあるかな?
0818デフォルトの名無しさんNGNG
>>816
> だれだって最初は初心者な訳なんだし。

これってよく使われるフレーズだけど全然言い訳になってないよな。
最初は初心者でも自力修得できる奴はなんぼでもいる。
0819デフォルトの名無しさんNGNG
>>813
おそらくはマクロ等を駆使することで、
「問題領域における問題の記述とコードが同一になる」 Lisp/Scheme すげえ!
って思うんだがどうよ?
0820デフォルトの名無しさんNGNG
>>817
>・ソースを短かくするために書け
これは同意できない。
結果としてソースが短くなるケースが多いとしても、ソースを短くすることは
マクロを書く目的にはなり得ません。
0821デフォルトの名無しさんNGNG
あんたにはならなくても俺はなるな
0822デフォルトの名無しさんNGNG
結果として短くなるのと、短くするのを目的として使うことを混同してませんか?
0823デフォルトの名無しさんNGNG
>>818
わからないことを責めてはいけないとおもう。
わかろうとしないことだとしてもそうだと思う。
そういう人を取り込むことが言語のすそのを広げることになるんじゃないかな。
0824デフォルトの名無しさんNGNG
>>821, 822
ソースコードの性質によるのかな〜と思うけど、どうかな。

長く、広く使われるコードであれば、直感にあう抽象化を
するためにマクロを使うべきだろう。
けど、テストコードなんかの場合はとにかく楽をするために
マクロを使っても良いように思う。
0825デフォルトの名無しさんNGNG
>>813
言語に「上下」があるわけではないと思うけどなぁ。

俺は ruby も好きだけど、scheme で書いてる時とは気分が違うよね。
なんつうか、ruby は relax しながら書くけど、scheme だと、集中して
研ぎ澄まされてく感じがする。抽象的だけどさ。
0826デフォルトの名無しさんNGNG
(DQNニレススンナヨ)
0827デフォルトの名無しさんNGNG
>>813
いいんだよそれで。「普通のやつら〜」が言ってるのは競争の激しい
ベンチャー企業は最大限に生産性をあげないと生き残れない、そのために
最強の言語を使うべきだって言ってるんであって、その他大勢が
何を使おうが知ったこっちゃない。あの文章は生きるか死ぬかの極限での
サバイバル術について語ってるんだ。そんな環境に置かれていないなら、
好みで言語を選べばいいのさ。



0828デフォルトの名無しさんNGNG
普通のプログラマにはjavaをお薦めします
0829デフォルトの名無しさんNGNG
ノーマルプログラマにお薦め→java
アブノーマルプログラマにお薦め↓
0830デフォルトの名無しさんNGNG
C
0831デフォルトの名無しさんNGNG
この掲示板は何言語で運営してるの?
0832デフォルトの名無しさんNGNG
>>820, 822
817 だけど(!= 821 ね)
煽りじゃなくて、どんな目的でマクロ書くのか教えてくれないか?
おれはマクロに関してはソースを短くする事しか考えてないんだけど…
あ、「短く」じゃなく「明快に」、と格好良く言えば伝わるかな?

>>824
おれはテストコードは逆にマクロつかわないなぁ
テストコードのテストなんてしたくないから
コピペでも良いから単純に書く、どうせテストなんだし
0833デフォルトの名無しさんNGNG
>>832
私の場合:
 * with-なんとか系 --- 最初と最後にお決まりの文句がある処理とか
 * 関数のインターフェイス ---
(foo-format t "~A" obj1 "~A" obj2 ...) とやりたい.
0834デフォルトの名無しさんNGNG
Ruby!!!!!!!!!!!!!!!!!!
0835デフォルトの名無しさんNGNG
>>832
820でも822でもないですが
イディオムや式に名前を付けるとき。短くなるとは限らない。
0836デフォルトの名無しさんNGNG
>>835
確かに短くても慣れてないイディオムを包むマクロは書くことあるけど
(そしてその名前が長い時もある)
何回も使えば少なくとも行数は短かくなる気がするけど…
(本当はタイプ量も少なくしたいけど補完があるから気にしない場合はある)
良い例がありますか?
0837デフォルトの名無しさんNGNG
マクロの例は,いろんなプログラムのソースがヒントになるなと思ったよ.
名前は忘れたけど数値計算のやつでは,型チェックをやってた.
ソースを見ると,その関数の引数の型が一目瞭然になってるの.
0838デフォルトの名無しさんNGNG
ソースのバイト数を減らすってのもいいけど
(例えば call-with-current-continuation → call/cc, multiple-value-bind → mvbind など),
重要なのは定型的コード内のパターンを抽出して構文要素数を減らすことだぜ?
ただ,inline関数で実現できるならその方がいい.
"On Lisp" を読めば抽象化手段としてマクロを使うべきかどうかの判断規準(の一例)が示されてるけど...
0839デフォルトの名無しさんNGNG
cgiにschemeが使える無料鯖ってあるの?
0840デフォルトの名無しさんNGNG
>>838 が正しいな、おかげですっきりしたぜ
0841デフォルトの名無しさんNGNG
さんざん既出だがSchemeの基本構文要素なんて10個に満たないが、
全く不便に感じないのは強力なマクロの記述能力があるからだよ。
処理系がI/Fを開放してればマクロを通してそのままマシンコードに落とせるし、
コンパイラとマクロの間には区切りがない。
LISPは本来処理系のコンパイラが貧弱でも後付でカバーできる程の能力を
秘めているが、あまりそれを認識してる奴はいないみたいだな。
ユーザーにスキルがあれば自力でinline-expandやlambda-liftingの様な
プリコンパイルが簡単に追加できる。
コアの作りこみを最小限とすれば新しい処理系はすぐに完成する。
人間で言うと脳や神経だな。骨格や肉付けはすべて後回しでいい。
コアを何度も作ってる奴は、残りをすべて使い回しが利くS式で記述する筈だ。

だからGaucheの様なCでなんでもかんでも書く方針はちょっといただけないな。
確かに労せず速い処理系になるだろうが、それは処理系固有のモノになってしまい、
LISPの自己拡張性を否定しかねない。
どのみちブートストラップの真似事してるんだからVMに渡すプリコンパイラぐらい
Scheme自身で書いてみろよ。パフォーマンスにさほど違いはないから。
と、Gaucheのソース流し読みして思った次第。
0842デフォルトの名無しさんNGNG
I/Fって何?
0843デフォルトの名無しさんNGNG
それは処理系固有のモノになってしまい、LISPの自己拡張性を否定しかねない。
ってどういう意味?
他の処理系でもマクロで拡張するんなら処理系固有とか関係なく思えるが。
0844デフォルトの名無しさんNGNG
>>841
Gauche開発の動機と目標を知っててあえて言ってる?
0845デフォルトの名無しさんNGNG
>>844
これか? http://www.shiro.dreamhost.com/scheme/gauche/memo-c-j.html
0846841NGNG
>>842 ぐぐれ

>>843 処理系に固定化され、固定化されたコードはそれ以上進化する余地なくなるということ。

>>844-845
そのリンクの文章のことではなかったけど、その中から異論を唱えると、

>実行時に、その言語のための環境(スクリプトライブラリ、初期化ファイルなど)を
> フルセットで持てるとは限らない。 最悪の場合、アプリケーションはそのバイナリ
> 単体で動作することが要求される。

これは単にアイデアが枯渇しているだけだろう。
実行ファイルに環境を埋め込む手段はいくらでもあるし、さらにその上に
環境の永続化という手段もある。

>アプリケーションの実行の主体はC/C++で書かれたコードで、
> その中から頻繁にちょっとしたリスト処理や文字列処理なんかが呼び出される。

これはevalそのものやVM、マシンコードの入り口を用意していれば済む事。
それに結局GCを伴うので、現実的には外部から頻繁には呼び出せず、一括して呼び出す方針になりがち。
そもそも外部のコンパイラが必要な時点でプロダクション環境とやらには論外だろう。

>むしろ、 memqなんて基本的なパーツはCで書いとくべきなんだ。

memqの様なすぐ代替が利く極端に小さいパーツならこの手も有効だろうが、
少しでも大きな処理になるとこの思想は破綻する。作者もそれはわかってるみたいだが。
結局実際は実装が二極化し、複雑性が増加しただけだろう。
組み込みスタブ関数郡のメンテナンス性の悪さを見ればわかる。

こんなところか。
0847デフォルトの名無しさんNGNG
ぐぐってもわからんぞ。
0848デフォルトの名無しさんNGNG
じゃあ、あんたがSchemeの処理系書いて配ればいい。
0849デフォルトの名無しさんNGNG
処理系に固定化され、固定化されたコードはそれ以上進化する余地なくなるということ。
進化させたかったら処理系に手をいれればいいじゃん。
0850デフォルトの名無しさんNGNG
>>848
公開が面倒なだけでそういう処理系は数年前に作ったよ。

>>849
それは処理系の完成度が低いと暗に示しているにすぎないだろ。
商用にするなら論外の提案。
顧客毎に固有化して、いったい誰がメンテするんだ?
0851デフォルトの名無しさんNGNG
公開してなければただの妄想言語

顧客ごとの固有化はマクロを使えばいいだろ。
0852デフォルトの名無しさんNGNG
841は組み込み系とかはやったことないんだろうなぁ
0853名無しさん@お腹いっぱい。NGNG
GaucheがCでの実装を多用しているのは、現バージョンでの実用性を考えると仕方のない部分が多いのではないだろうか。

VMでは各インストラクションごとにテーブルを使った間接分岐が行われるが、この時、ほぼ毎回分岐予測を失敗することになる。(PC用で、これの分岐予測をうまく行ってくれるプロセッサーは無いと思う)
今のプロセッサーでこのペナルティーはでかすぎる。1ワードのデータのLOADやPUSHを行うたびにパイプラインがフラッシュされるんだから...
つまり、速度を出すにはVMのインストラクション数を減らすことが重要ということになり、そのためにCで書く部分が多くなるといったところではないだろうか。

根本的な解決にはネイティブコードに落とす必要があるが、これとインタラクティブな環境を両立するのは難しい。
商用のChez Schemeならそれが出来ているが、個人が作っている処理系でそれが出来ていなくとも、あまり乱暴な言葉遣いは良くないと思う。

真面目な開発者ならネガティブな意見は大歓迎だと思うし、それは遠慮なく伝えていいと思う。
変な信者のラブレターよりよっぽと嬉しいだろう。でも礼儀は忘れないでほしい。
0854824NGNG
>>832
へええ、おもしろい。
私もテストコードにはややこしいマクロはかきませんが、
いまいち自然じゃない、長くは覚えていられないような
展開をするマクロをかくことはあります。
以下の2つがその主な理由です:
1) テストはだいたい1ファイルに閉じてるので読めばわかると思う
2) テストは繰り返しや比較が多いのでなるべく自動化したい
0855デフォルトの名無しさんNGNG
>そのためにCで書く部分が多くなるといったところではないだろうか。
話がつながってない気が
0856デフォルトの名無しさんNGNG
>>855
「VMで実行するインストラクション数を減らすために処理系やライブラリー関数をSchemeでなくCで実装する」を意図しておりました。
説明がへたですまぬ。

0857850NGNG
>>851
うぷしてみたよ。
ttp://syobon.zive.net:85/src/syobon10968.zip.html
サンプル読めば簡単な窓ぐらいは作れるかもしれない。
0858850NGNG
失敗した。
syobon10969.zipね。
0859デフォルトの名無しさんNGNG
schemeのプリミティブを使ってマクロを組み立てれば強力な記述力がある
構文を手にできるというのは別に誰も反対していないと思う。
しかしいくつか問題があって、一つはそのような構文を作るのに多用する継続の
利用コストが小さくないこと。
もう一つは共通語彙が貧弱なこと。SRFIで整えられてきてるけど、
各自で構文を作るのが実現できることと、それが実用上利益になることとは別問題。
それにSchemeコアが万能というわけじゃない。SRFIの多くは
結局使い勝手のために処理系の拡張を必要とするものが多い。

だから理念としてはScheme好きだけど実際に使うのはCommon Lispだったりする。

0860デフォルトの名無しさんNGNG
本人やる気ないなんて言わずに発展させていってくれよ。
面白そうじゃないかコレ。
0861デフォルトの名無しさんNGNG
本人にやる気がないのなら他の人が発展させていけばいい。
0862デフォルトの名無しさんNGNG
>>850
ソースくれよ。
0863デフォルトの名無しさんNGNG
やーだよ
0864デフォルトの名無しさんNGNG
が〜ん。
Gaucheが実行環境の永続化(?)をサポートするのをまとう。
構想はあると聞いてるので...
0865デフォルトの名無しさんNGNG
おい、このスレからチャレンジングな Scheme 実装が生まれようとしてるのか?!
面白くなってきたと思わないか?おまいら!
0866832NGNG
>>854
なるほど確かにマクロでもそのファイルだけで閉じてれば良いかも
でもテストコードに関しては、例え繰り返しとかあっても抽象化する必要は無い、
即値も平気で書いて ok!とも思うけど
それにしても Lisp ほどテストがやりやすい環境も無い!
何たって関数単位で書いたらすぐ試せるし
0867デフォルトの名無しさんNGNG
>>857
実行速度が結構出るね。
cygwin上のgoshよりほとんどのケースで速かったよ。
compiled-closureってことはeval前にコンパイルだよね。
永続化も説得力のある代物でした。
正式に公開したらかなりいけてますよ。
0868デフォルトの名無しさんNGNG
Lisp Machineで作業しているところのビデオ。既出だったらゴメソ。
http://lemonodor.com/archives/000103.html
http://lemonodor.com/archives/000441.html

これを見て、「Lisp Machineでは、コンパイラのエラーメッセージでさえオブジェクト」
という意味がすこしわかったよ。
0869デフォルトの名無しさんNGNG
>>850 再うpきぼんぬ
0870デフォルトの名無しさんNGNG
低レベルな質問で済みません。
CLISP で fork(2) みたいに clisp のプロセスイメージをコピーするのってどうやれば良いので
しょうか? fork(2) して子プロセスで S 式を実行し、結果を親プロセスとやり取りするような
プログラムを書きたいのです。ext:run-program で CLISP 自体を実行してやるのが普通なので
しょうか?

CMUCL ではこんな風に出来る(出来た?)らしいです。
http://cl-cookbook.sourceforge.net/os.html#fork-cmucl
0871デフォルトの名無しさんNGNG
>>857
再うp!再うp!再うp!
0872デフォルトの名無しさんNGNG
lispでbottom upプログラミングしてると確かに
綺麗になるんですけど、他人には読めないコードに
なったりしません?
他人に読めないのは綺麗じゃねーって言われるかも
しれませんがやはりそんな感じがします。

抽象的なロジックでも、ほとんど組み込みのリスト操作や
map操作で実現できてしまうのが原因だと思うのですが、
(他の言語だといちいち名前をつけて抽出することになる)
皆さんはそういうこと感じませんか?
0873デフォルトの名無しさんNGNG
>>872
bottom upの意味が間違ってないか?
bottom upはロジックや定型処理を抽出してツールを
作ってそのツールを用いて本体を組むんだが。
そのツール(関数やマクロ)には当然名前がついている。
組込みのリスト操作やmapが生ででてくるのはbottom upとはまた別。
0874デフォルトの名無しさんNGNG
LISP 〔原書第3版〕 1巻 を読んでみたいんですが
手に入れる方法ってありますか?
店頭在庫ってまだあるんでしょうか?
0875デフォルトの名無しさんNGNG
大学の図書館には転がってるだろ。
0876デフォルトの名無しさんNGNG
>>874 漏れも読みたい!!
>>875 学生じゃないもん!!
0877デフォルトの名無しさんNGNG
学生でなかったら別に読まなくてもいいんじゃないの?

池袋のジュンク堂で2巻は見た。
実は俺も読みたいので、引きこもりをやめて学生になる春まで待つつもり。
0878デフォルトの名無しさんNGNG
工業系の図書館に普通においてあるぞ
0879デフォルトの名無しさんNGNG
>>876
それって,カバーを外すと緑色で,ピラミッドみたいなのが彫ってある本ですか?
まだ Lisp が書けなかったとき,古い本なのにオブジェクトシステムが
載ってて凄い本だと思いました.
郊外の学部の図書館 (うちの大学なんだけど) なら入口でカードが必要なかったりします.
0880デフォルトの名無しさんNGNG
Allegro CL 7.0出荷age

相変わらずパンピーには買えない値段なのかな...
0881デフォルトの名無しさんNGNG
C#みたいにGUIやWEBを組めますか?
0882デフォルトの名無しさんNGNG
GUIビルダもサーブレットコンテナもありますがなにか?
0883デフォルトの名無しさんNGNG
The Revised R6RS Status Report
ttp://www.schemers.org/Documents/Standards/Charter/2004-10-13.pdf
0884デフォルトの名無しさんNGNG
正直、Schemeは今のままでいいと思う。
0885デフォルトの名無しさんNGNG
まあ、srfi もあるしね。
0886デフォルトの名無しさんNGNG
モジュールの標準化は激しいバトルになるだろうな〜 できるんかいな?
0887857NGNG
>>869
一部不具合を修正
ttp://syobon.zive.net:85/src/syobon11901.zip.html
0888デフォルトの名無しさんNGNG
moduleとobject systemは、srfiかs6rsかどっちかには入ってほしい...
でも、886の言うとおり激しいバトルになりそうな分野なので期待薄か
0889デフォルトの名無しさんNGNG
そのあたりは普通にやろうとしても一筋縄でいかない部分もあるしね
ましてやRxRSとなると…
0890デフォルトの名無しさんNGNG
PLTかbiglooのを丸々取り込んじまえばいいんだよ。
デザインに関しては、この二つが抜けてるから。
0891デフォルトの名無しさんNGNG
どっちのを取り込むの?
その設計で本当にいいの?
そもそも取り込む必要あるの?
等々…
0892デフォルトの名無しさんNGNG
http://www.schemers.org/Documents/Standards/Charter/2004-10-13.pdf

> module system
> A module system will definitely be part of R6RS. We have dis-
> cussed this topic extensively and are now converging on a spe-
> cific proposal

> object-oriented programming
> Issue left for R7RS
0893デフォルトの名無しさんNGNG
LISP 1 図書館で複写してもらおうと思ったけど
1枚25円かよ・・・
たけーorz
0894デフォルトの名無しさんNGNG
(define x 'foo)

(display '(x))
-->(x)#<undef>
(display (list x))
-->(foo)#<undef>

クォートって手続きlistの単なるシンタックスシュガーですよね
にも関わらず前者で変数名がプリントされちゃうのは仕様ですか?
writeやcons(とドット対)も試したんですけど、同じ結果です。(gaucheにて)
0895デフォルトの名無しさんNGNG
> クォートって手続きlistの単なるシンタックスシュガーですよね
この時点で間違い。
0896デフォルトの名無しさんNGNG
はあ?
0897デフォルトの名無しさんNGNG
>>894
(quote x) => X
(list x) => unbound variable `X'.

まともな入門書を読みたまえ...
0898デフォルトの名無しさんNGNG
ゴメンナサイ
0899デフォルトの名無しさんNGNG
(find (lambda(x)(equal? 'b x)) '('a 'b 'c))
#f
(find (lambda(x)(equal? "b" x)) '("a" "b" "c"))
"b"

なぜ前者は#fになるんでしょうか?
0900デフォルトの名無しさんNGNG
シンボルbとリスト(quote b)を比べてるから。
0901デフォルトの名無しさんNGNG
>>900
理解できました。ありがとう。
0902デフォルトの名無しさんNGNG
NOW Available Allegro CL 7.0
普通にライブラリ増えた感じだね
Allegro Prolog だけは謎だけど
0903デフォルトの名無しさんNGNG
vism
0904デフォルトの名無しさんNGNG
>>902
> Allegro Prolog だけは謎だけど
Franzって基本的に顧客ドリブンだから、「Prologホシイ」って
客がいたんじゃないの?
0905デフォルトの名無しさんNGNG
Franzて従業員何人ぐらい?
商売成り立ってる?
0906デフォルトの名無しさんNGNG
製造はカナーリ少人数でやってそうなイメージ
0907デフォルトの名無しさんNGNG
matz も書いていたけど言語ビジネスで
食っているのは MS くらいじゃないか。
0908デフォルトの名無しさんNGNG
MSのは言語ビジネスじゃなくて殿様ビジネス
0909デフォルトの名無しさんNGNG
言語とOS、セットにならないとまともな商売にならないってことだろうねえ
本当はそこにハードも一緒だったはずなんだけど、MSは特異な例ということで。

そこでLISPマシンですよ!!w
0910デフォルトの名無しさんNGNG
Sun とか Apple も MS 同様に OS + 言語 ( もしくは Office スイート ) で
殿様ビジネスできたか、というと違うのでやはり能力の違い。
0911デフォルトの名無しさんNGNG
Bolandはそこそこがんばったじゃないか。
某国コンパイラ無料公開した直後から怪しくなってきたが。
やっぱいくらなんでも無料はまずかったんじゃないか?
オープンソースや無料で競い合ってるうちにITバブル崩壊。
1000円でも金取るべきだった。
0912デフォルトの名無しさんNGNG
ボーランドも開発環境まで全部揃えて真っ向勝負かけたのが失敗だったんだよ。
コンパイル早くて、コンパクトで高速なコード吐くコンパイラ勝負してりゃいいせんいってたと思うんだが。
0913デフォルトの名無しさんNGNG
ライブラリももうちょっと充実してればなぁ。さすがにOSメーカーには敵わんか。
0914デフォルトの名無しさんNGNG
教授が英語で宿題出しやがったんだけど。。。
これ、解ける人いたらどういう問題か教えてくれんか?
you must write to primary functions:


(defun evaluate (expression a b) (....))
This function takes any lisp expression and evaluates it
with the stipulation that the values passed in through a and b are mapped to x and y,
so that if the expression uses the values x and y, the values passed in through a and b will be used in their place.

(defun mutate (expression) (....))
This function will take a mathematical expression,
change it according to random rules, and return the resulting
new "mutant" expression. Valid input for the function is
the list (+ x y) or any expression output by a properly implemented mutate function.


Modifying Mathematical Expressions in Lisp
tips:

(random 1.0) ;; generates a random float between 0 and 1
(random 3) ;; generates a random int less than 3 (0, 1, or 2)



0915914(続き)NGNG
rules:

operand rule (rule 1):
20% the operand will become x
20% the operand will become y
60% the operand will be a random float in [0,1]

operator rule (rule 2):
30% of the time the operator will be: +
30% of the time the operator will be: -
30% of the time the operator will be: *
10% of the time the operator will be: expt

mutation:
an expression will mutate exactly in one place
20% the operator
40% the first operand
40% the second operand

if an operand is itself an expression, then the mutation
will recurse down that branch to select the location of mutation


if an operand is selected it will mutate according to the following rules
60% the operand will mutate according to rule 1
40% the operand will expand
the new operator will be selected according to rule 2
the first operand will be identical to the original operand
the second operand will be selected according to rule 1

0916914(続き)NGNG
if an operator is selected the possibilities are:
80% the operator will mutate according to rule 2
20% the operator will colapse into an operand according to rule 1

if the expression is a single value...
0917デフォルトの名無しさんNGNG
ランダムに変えて評価しろって問題じゃない?
0918デフォルトの名無しさんNGNG
宿題の丸投げですか
0919デフォルトの名無しさんNGNG
問題文を読む限りそれほど難しいことを言ってるわけじゃないので
落ち着いてよく読め。
0920デフォルトの名無しさんNGNG
>>919
問題文を読むのに難儀している模様。
0921デフォルトの名無しさんNGNG
この英語じゃ無理も無いと思われ...
mutateは変数にxとyを使った式を適当に乱数でいじくって出力。
それをevaluateに食わせて計算をするってことかな。
遺伝的アルゴリズムでもやっとるんか?
0922デフォルトの名無しさんNGNG
>     20% the operator will colapse into an operand according to rule 1
これの意味がわからん。
     20% the expression will colapse into an operand according to rule 1
ということか?
0923デフォルトの名無しさんNGNG
collapse
0924デフォルトの名無しさんNGNG
で、この問題のどこが分からんのだ?
0925デフォルトの名無しさんNGNG
とりあえず GA ってのは置いといて
>>914 みたいな、
「確率的に分岐する処理を格好良く書けるマクロを書け」
って問題にして皆で考えないか?
0926デフォルトの名無しさんNGNG
>>925
素直に考えるとこんな感じになるのかなあ。

(pcase
(0.3 expr ...) ;; 30%の確率でこの節を実行
(0.6 expr ...) ;; 60%の確率でこの節を実行
(else expr ...)) ;; 残り(10%)の確率でこの節を実行

これならそんなに難しくないような。もっと格好いい書き方を
考えてる?

0927914NGNG
みなさんありがとうです
教授も教授なんですが結構まじめに授業やってくれんくて

それで宿題ポンと出すんで中々難しいんだわつД`)
>>921 さんの説明だとなんとなく意味がつかめたっす

>>925 >>926
みんなでこの問題考えられたら嬉しいんすけど、
俺も案出してくんでよろしくおねがいします。
0928デフォルトの名無しさんNGNG
>>927
おまえが授業聞いてないだけだろ
失せろ
0929デフォルトの名無しさんNGNG
>>926
シンプルイズベスト、だね
他に格好良いのとかあるのか?
>>928
まあまあ、もはや問題自体は別にどうでも良いだろw
0930デフォルトの名無しさんNGNG
「計算機プログラムの構造と解釈」(和訳版)を読んでいるのですが、
1.2.4 べき乗の説明で、fast-exptの増加の程度は(p25の注釈37によると)
「2を底とするnの対数に、nの2進表現での1の数を足して1を引いたもの」
と説明があります。
この説明中の 『nの2進表現での1の数』 とはどのような数なのでしょうか?
0931デフォルトの名無しさんNGNG
1 less than the log base 2 of n plus the number of ones in the binary representation of n.
0932デフォルトの名無しさんNGNG
>>914
とりあえずevaluate作ってみたよん。
手元にLispがないからSchemeになってまふ。
オペランドは2つに固定ね(美しくないけど解りやすいから)

(define *operator* `((+ . ,+) (- . ,-) (* . ,*) (expt . ,expt)))

(define evaluate-1
(lambda (op opr1 opr2 a b)
(apply (cdr (assoc op *operator*))
(list
(cond
((eq? opr1 'x) a)
((eq? opr1 'y) b)
(else opr1))
(cond
((eq? opr2 'x) a)
((eq? opr2 'y) b)
(else opr2))))))


(define evaluate
(lambda (expression a b)
(let ((op (car expression))
(opr1 (cadr expression))
(opr2 (caddr expression)))
(evaluate-1 op (if (pair? opr1) (evaluate opr1 a b) opr1) (if (pair? opr2) (evaluate opr2 a b) opr2) a b))))

; (evaluate '(+ 4.1 (- y (* x 2.1))) 2.3 3.3) -> 2.5699999999999994
0933デフォルトの名無しさんNGNG
>>930
ビットが立っている数だろ?
100101(2) ⇒ 3
0934デフォルトの名無しさんNGNG
残りのmutateだよん

(define mutate-operator
(lambda ()
(let ((r (random 100)))
(cond ((< r 30) '+) ((< r 60) '-) ((< r 90) '*) (else 'expt)))))

(define mutate-operand
(lambda (operand)
(let ((r1 (random 100))
(r2 (random 100)))
(cond
((or (< r1 60) (null? operand))
(cond ((< r2 20) 'x) ((< r2 40) 'y) (else (random 1.0))))
(else (list (mutate-operator) operand (mutate-operand '())))))))
0935934NGNG
(define mutate
(lambda (expression)
(let ((op (car expression))
(opr1 (cadr expression))
(opr2 (caddr expression))
(r (random 100)))
(cond
((< r 20)
(list (mutate-operator)
(if (pair? opr1) (mutate opr1) opr1)
(if (pair? opr2) (mutate opr2) opr2)))
((< r 60)
(list op
(if (pair? opr1) (mutate opr1) (mutate-operand opr1))
(if (pair? opr2) (mutate opr2) opr2)))
(else
(list op
(if (pair? opr1) (mutate opr1) opr1)
(if (pair? opr2) (mutate opr2) (mutate-operand opr2))))))))
; (mutate (mutate (mutate (mutate '(* (+ x y) (- x y)) )))) --> (+ (* 0.8420 0.1857) (- (+ x x) 0.9704))
>20% the operator will colapse into an operand according to rule 1
これの意味は不明なのでいれてないよん。
0936デフォルトの名無しさんNGNG
(list (mutate-operator)
(if (pair? opr1) (mutate opr1) opr1)
(if (pair? opr2) (mutate opr2) opr2)))
とかって
(list (mutate-operator) opr1 opr2))
にすると思ってた。
0937デフォルトの名無しさんNGNG
>>930,931
原文はなんてことないのに日本語訳だとわかりにくいですねえ。

0938デフォルトの名無しさんNGNG
みんなえらいな
助け合いってのが心に染みたよ
0939デフォルトの名無しさんNGNG
>>935
>20% the operator will colapse into an operand according to rule 1

そのoperatorを含む式が一つのoperand(x,y,定数のどれか)になる
ってのが対称的で美しい気がする。

operandがexpressionになるって規則もあるしね。
0940flatline@Vim%Chalice ◆r6EONKKhcc NGNG
おはようございます.
On Lispの邦訳がとりあえず第25章まで終りました.ご賞味下さい.
っ [ ttp://user.ecc.u-tokyo.ac.jp/~g340299/onlisp_j.pdf ]
あとパッケージについてのappendixが残っているのと,全体的な訳の見直し,注の整備,
見栄えの向上,HTMLやtexinfoへの変換(←やるかどうか怪しい)ですかね...

なお↑のサイトは私が来年4月に工学部に進学してまもなくすると
(移行措置も何もなく)一夜にして移転しますんで,ミラー置いておきますね.
っ [ ttp://www.komaba.utmc.or.jp/~flatline/onlisp_j.pdf ]
まだ工学部生としての学生証番号が決まってないので,
移転先がどういうアドレスになるかはまだ不明です.
0941デフォルトの名無しさんNGNG
>>940
すげーな。一人でやってるのか?これってどのぐらい時間かけてるの?
一日何分ぐらいやってる?
0942デフォルトの名無しさんNGNG
flatlineさんおつかれ。よくやったね。
後で印刷して、ありがたく読ませてもらうよ。
0943デフォルトの名無しさんNGNG
お疲れさまです。早速読んでみます。
0944デフォルトの名無しさんNGNG
>>940
おつかれさま!
texinfoホスイ
0945flatline@Vim%Chalice ◆r6EONKKhcc NGNG
>>941 メインは私ですが様々な方からいただいた指摘を取り込んであります.
かかった期間は2年弱. 数日にいっぺん,1,2時間ずつやってたかな?
;; 自分で本を書くのに比べれば微々たる労力,とも言えますが...

>>942 Appendixがないのと,誤訳が残ってそうなのは覚悟しといてください.
紙にしちゃうと読みやすいけど更新に追随し辛いですよね. 今後はChangeLogでもつけようかな?
あと,印刷するには余白が狭過ぎかもしれません... いずれ直します.

>>943 どうもです.何か気付いたら教えてください.
0946flatline@Vim%Chalice ◆r6EONKKhcc NGNG
>>944 モウチト待ッテ (´Д`;)
0947デフォルトの名無しさんNGNG
>>flatline
乙!喜んで読ませてもらう!
0948デフォルトの名無しさんNGNG
恭一また臭いこといってんな
0949デフォルトの名無しさんNGNG
ごめん誤爆した
0950デフォルトの名無しさんNGNG
そういえばgaucheのMinGWへのポートは結局どうなったの?
0951デフォルトの名無しさんNGNG
みなさんedってつかってますか?
clispでedをディスアセンブルしてメモ帳以外のエディタを使おうと思ったのですが、うまくいかないですよ。
0952ミミNGNG
>>951
ディスアセンブル?
EDITOR 環境変数を変更するか、*EDITOR* グローバル変数を変更すればいいと思うんだけど。
0953デフォルトの名無しさんNGNG
Scheme入門(数学ネタ
ttp://www.altum.jp/math/exp2a/
なかなか面白いので晒しage
0954デフォルトの名無しさんNGNG
たぶん大学のサーバーに置いてあったころに見たな。
0955デフォルトの名無しさんNGNG
Gaucheでpsd使われてる方いますか?
0956デフォルトの名無しさんNGNG
LisperはGUI組む必要があるときどうしてますか?
CLIMはACLだと別売りみたいだし、LispWorksのドキュメント見るとobsolete扱いで
CAPI使え、みたいなこと書いてあるんで何がデファクトなのかよ〜わからん。
ウェブアプリケーションにしちゃうもん?
0957デフォルトの名無しさんNGNG
GUIイラネ
0958デフォルトの名無しさんNGNG
ですね
0959956NGNG
GUIイラネ、で済めばいいんだけどさ(実際漏れもEmacsからほとんど外に出ないし)、
仕事でLisp使ってブツを作り上げておっさん連中にデモ・プレゼンするとき困らない?
Emacsのバッファで作業してるの見せてもおっさんには説得力ないんだよね
(でも予算の使い道の決定権を握ってるのは奴らだ)。
折角何の前例もないところにLispを使うという無茶を通して邪魔されないで済んでるので
できれば余計な横槍を入れられないように防衛線を張っておきたいのでし。

個人で使って自己満足してるだけならこんなこと気にする必要もないんだけどね。
0960デフォルトの名無しさんNGNG
>>959
>>15なんていうのはあるけれど。
0961デフォルトの名無しさんNGNG
ウェブアプリにできるような物ならウェブアプリでいいんじゃない?
0962デフォルトの名無しさんNGNG
>>952 *editor*変えたらうまくいきました。今まで何やってたんだ俺…

GUIかどうかは微妙だが、xyzzyでヒルベルト曲線を書くデモを見たときはちょっとビビった。
0963デフォルトの名無しさんNGNG
>>956
WWWアプリが一番楽なアプローチだけど
それができなきゃ自分でGUIライブラリのbindingsを書くしか。
0964956NGNG
やはりウェブアプリに落ち着いちゃいますか。もしくはFFIで外界と接続する、と。
そのわりには307にレスつけてる人が少ないのを見ると、Lisperは必要なモノは自分で
自作しちゃうのかなぁ、やっぱり。
0965デフォルトの名無しさんNGNG
>>956-964
つまりLispはVisualBasicやVisualC++のかわりにはなりえないっていう結論になるの?
0966デフォルトの名無しさんNGNG
   ∩___∩   ?     
   | ノ\     ヽ        |
  /  ●゛  ● | ?      |
  | ∪  ( _●_) ミ       j
 彡、   |∪|   |   
/     ∩ノ ⊃  ヽ  
(  \ / _ノ |  |
.\ “  /__|  |
  \ /___ /
0967デフォルトの名無しさんNGNG
>>964
自作しちゃうので世に出てこなくてコミュニティが発展しないってのは
Lisperたちの問題としてよくでてくるよね。

>>965
(よくいる)Lisperのそういう作り込みを基本的に必要としてないってことかなぁ。
でも、垣根を下げるためには、そういう作り込みって重要よね。

0968デフォルトの名無しさんNGNG
動きが必要なら比較的良く使うのは OpenGL バインディングかなぁ…
ショボくていいなら Tk インターフェースを良く使う.でも最近だと Web で
DHTML つかうのがお手軽かもしれん.
プレゼン資料ならデータを他のツールで可視化(GNU Plot とか GraphViz とか)
よくやるなぁ.
0969デフォルトの名無しさんNGNG
>>967
逆だよ。
ブラックボックスはダメ。
0970デフォルトの名無しさんNGNG
仕様が公開されてればブラックボックスだろうが別にかまわないが
0971デフォルトの名無しさんNGNG
出来が良けりゃブラックボックスで良い
糞コードしか書けない奴はブラックボックスじゃなくてもいいけどな
0972デフォルトの名無しさんNGNG
Dr.Schemeはいかがでしょう?
0973デフォルトの名無しさんNGNG
なんかハリボテ感が強い>Dr
もうちょっとスマートにまとまらないのかな
GUIも独自とかじゃなくてScheme/tkとかwxSchemeとか
0974デフォルトの名無しさんNGNG
widestudioなんかは既にたくさんのOSと言語に対応している状態なんだから、
比較的楽にlispにも対応できる柔軟性を持ってそうに思えるんだけど、どうなんですかねぇ?
0975デフォルトの名無しさんNGNG
シェルスクリプトで書かれたLISPインタプリタとかってありますか?
0976デフォルトの名無しさんNGNG
>>975
シェルは分かりませんが、awk ならあります。
awklisp っってヤツね。
>>7 を見てね。
0977デフォルトの名無しさんNGNG
>>976
あ、これなかなか面白いです。どうもです。
0978デフォルトの名無しさんNGNG
ECLってどうですか? 使ってる人いますか?
0979デフォルトの名無しさんNGNG
scheme処理系では一般的に日本語(というかSHIFT-JIS)の扱いってどうしているんでしょうか。
SRFIで定義しているようなやつはCとかで書くのか、
それとも他のASCIIを扱う関数から定義しているものなのか…。
実際にSJIS使ったサンプルとかもあれば…。SRFIでは良くわかりませんでした。

今勉強がてらに使ってるやつでは例えば(string-ref "あかさたな" 0)とかするとエラー終了したりしてます。
ここで"あ"って返して欲しいんですが。
0980デフォルトの名無しさんNGNG
comp.lang.schemeよりコピペ。Scheme処理系のunicodeサポート。

1) Gauche: unarguably best Unicode support, including native
read/write syntax for strings, chars, regexps & char-sets; support for
SRFI-13 & SRFI-14; charconv libraries and extensions to I/O procedures
to specify encoding for ports, including auto-detection of Japanese
encodings.

2) PLT >= v299: native Unicode support; regexps and SRFI-13 are
Unicode-aware, SRFI-14 is not; port encodings assumed UTF-8.

3) Gambit: native Unicode support, no regexp or SRFI support, encoding
for files and terminal is fixed at startup time and limited to Latin-1
or common Unicode encodings (UCS-2, UCS-4 or UTF-8).

4) SISC/Kawa/Jscheme: leverages Java Unicode support; SISC has Unicode
aware SRFI-13, Unicode unaware SRFI-14, the others have neither;
encoding is determined by default by locale, but SISC and Kawa provide
port encoding procedures; Java uses UTF-16 internally which may cause
complications with surrogate pairs.

0981デフォルトの名無しさんNGNG
7) Chicken: characters are allowed within the full 21-bit Unicode
range, however by default the non-ASCII characters have no read/write
syntax. I have a unit almost ready for release that leverages this
and assumes UTF-8 encoded strings/ports to provide full Unicode
support, including regexps, SRFI-13 and SRFI-14. Chicken has an iconv
interface, and I also have a unit with a more friendly interface such
as (with-input-from-encoded-file enc file thunk).

8) MIT-Scheme: Unicode chars strings are disjoint types; 'alphabet'
type as Unicode-char alternative to char-sets; Unicode string ports;
no port encoding utilities.

9) Bigloo: Unicode strings and characters are disjoint types; no port
encoding utilities.

10) Chez/Elk/Guile/Inlab-Scheme/Rscheme/SCM/Stalin/Stklos: nothing.
0982デフォルトの名無しさんNGNG
どなたかそろそろ、次スレを立てていただけないでしょうか?
0983デフォルトの名無しさんNGNG
次スレ
http://pc5.2ch.net/test/read.cgi/tech/1100229366/l50
0984デフォルトの名無しさんNGNG
>>7にあるawklispに含まれていたperlispですが、
これはPerl4での動作することを想定して書かれていました。
なのでリファレンスやレキシカルスコープ変数はまったく使われておらず、
コードも煩雑なものとなっています。

Perl5でLISPインタプリタを実装した例などはありますか?
自分で勉強して書けと言われそうですが・・・
0985デフォルトの名無しさんNGNG
>>984
こっちのほうが分かりやすいかも。awk と sh で書いてあります。参考までに。
http://www-2.cs.cmu.edu/afs/cs/project/ai-repository/ai/lang/lisp/impl/awk/
0986ミミNGNG
>>973
DrScheme の GUI (MrEd) は wxWidgets の初期のバージョンから
派生したものらしいよ。
0987本田NGNG
>>956
>Lisp-Tk
http://www.cliki.net/Lisp-Tk

>ウェブアプリケーションにしちゃうもん?

>CL-HTTP
http://www.ai.mit.edu/projects/iiip/doc/cl-http/home-page.html
流行としてはGUIよりアプリケーションサーバーだと思う。
0988デフォルトの名無しさんNGNG
>>980-981
どうもありがとうございます。
やはり多国語を扱えるような処理系はネイティブでサポートしているのが多いんですね。
処理系のソースは持っているので自分でなんとかしてみます。
0989デフォルトの名無しさんNGNG
LISPでWEBサービスってできるの?
0990本田NGNG
>>989
>db-sockets
http://www.cliki.net/db-sockets
こんなの使えば、HTTPも処理できるプログラム書けるはず。
0991デフォルトの名無しさんNGNG
>>990
そうなんだ。ありがとう^^
0992デフォルトの名無しさんNGNG
>>989
kahuaとか
0993デフォルトの名無しさんNGNG
WebサービスってGoogleみたいにSOAPとか使うやつのことだろ
0994デフォルトの名無しさんNGNG
>>993
そういう規格もありますねー にゃんにゃん
レス数が950を超えています。1000を超えると書き込みができなくなります。