CommonLisp Scheme Part11at TECH
CommonLisp Scheme Part11 - 暇つぶし2ch2:デフォルトの名無しさん
04/08/02 23:14
□参考リンク□

日本Lispユーザ会(日本語)
URLリンク(jp.franz.com)
ここにかなりの情報があります。
URLリンク(jp.franz.com)
削るとAllegro Common Lispのページへ

プログラミング言語Scheme(日本語)
URLリンク(www.sci.toyama-u.ac.jp)
Schemeの人はまずここを見ましょう。

Lisper への道(日本語)
URLリンク(www.geocities.co.jp)
判りやすいLISP入門サイト。

Schemeへの道(日本語)
URLリンク(www.stdio.h.kyoto-u.ac.jp)
ここはschemeの入門サイト。


3:デフォルトの名無しさん
04/08/02 23:15
慶応の授業のページ・記号処理プログラミング 2001
URLリンク(buri.sfc.keio.ac.jp)

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

Scheme Hash(英語)
URLリンク(okmij.org)
S式でXMLを使える様にするSXMLなど

John McCarthy's Home Page
URLリンク(www-formal.stanford.edu)
LISPの生みの親、J・マッカーシーのページだそうです。

Association of Lisp Users
URLリンク(www.alu.org)
米国のLispユーザ会

4:デフォルトの名無しさん
04/08/02 23:16
□SICP関係□

SICP(英語)
URLリンク(mitpress.mit.edu)
「計算機プログラムの構造と解釈」の原書です。
全てオンラインで読めます。

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

SICPの回答集
URLリンク(www.melt.kyutech.ac.jp)
URLリンク(pluto.aurorasd.co.jp)
URLリンク(www.ipl.t.u-tokyo.ac.jp)
URLリンク(www.sampou.org)

5:デフォルトの名無しさん
04/08/02 23:16
□その他□

Schemeで書かれた正規表現ライブラリ
URLリンク(www.cs.rice.edu)

幻の「入門Scheme」
URLリンク(www4.ocn.ne.jp)
オンラインで読める

各種scheme処理系をcygwin上からビルドする方法など。
URLリンク(www.geocities.co.jp)

Bit - Implantation compacte de Scheme
URLリンク(www.iro.umontreal.ca)
mini-schemeよりも小さい(?)bytecode変換系

Lisp 言語処理系: CAMPUS LIsP, Lemon version
URLリンク(aten.aial.hiroshima-u.ac.jp)
Cコードによるわずか1000行の実装

Cliki
URLリンク(www.cliki.net)
CommonLispのプログラムがたくさん紹介されているのでここを当たるべし。

6:デフォルトの名無しさん
04/08/02 23:17
encyCMUCLopedia
URLリンク(www.isr.ist.utl.pt)
cmucl以外でも有益なはず

CMUのLisp Repository
fURLリンク(ftp.cs.cmu.edu)
新旧様々なプログラムが置いてある

Tiny CLOS Tutorial
URLリンク(home.adelphi.edu)

Schemix
URLリンク(www.abstractnonsense.com)
Linuxのkernelへのパッチで、/dev/として扱えるTinyScheme

Bibliography of Scheme-related Research
URLリンク(library.readscheme.org)
Scheme関連の論文リンク集

7:デフォルトの名無しさん
04/08/02 23:31
その他よさそうなリンク

awkで書かれたわずか500行のLispインタプリタ
awklispを読めばLispが理解できる
URLリンク(www.accesscom.com)

Emacs Lisp 2
スレリンク(tech板)

* Hotdog Scheme URLリンク(rover.cs.nwu.edu)
 MS が金出してたみたい
* Bigloo URLリンク(www-sop.inria.fr)
 CLR 用のコードを吐けるようになったらしい

継続

なんでも継続
URLリンク(www.shiro.dreamhost.com)
Schemeへの道:継続
URLリンク(www.stdio.h.kyoto-u.ac.jp)
継続の使い方
URLリンク(www.geocities.co.jp)
継続の使用法
URLリンク(www.ice.nuie.nagoya-u.ac.jp)
CPS(継続渡しスタイル)の説明
URLリンク(www.csl.sony.co.jp)
Kahua: 継続ベースのアプリケーションサーバー
URLリンク(www.kahua.org)


8:デフォルトの名無しさん
04/08/02 23:32
仕様関係)
CLtL2: Common Lisp the Language 2nd edition
URLリンク(www-2.cs.cmu.edu)
CLHS: Common Lisp Hyper Spec
URLリンク(www.ai.mit.edu)
R5RS: Revised(5) Scheme(ja)
URLリンク(www.sci.toyama-u.ac.jp)

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

小さい実装)
SECDR-Scheme: SECD machine model に基づく実装
URLリンク(lily.fan.gr.jp)
Minischeme: 1 ファイルに凝縮された Scheme 処理系
URLリンク(tinyscheme.sourceforge.net)
TinyScheme: Minischeme を色々弄ったもの
URLリンク(tinyscheme.sourceforge.net)
KI-Scheme, AM-Scheme, etc...
URLリンク(www.nifty.com)
LispMe: Palm 上で動く Scheme 処理系. これも SECD virtual machine.
URLリンク(www.lispme.de)


9:デフォルトの名無しさん
04/08/02 23:35
LISP Scheme Part9 (html化)
URLリンク(ruku.qp.tc)

独習 Scheme 三週間
URLリンク(www.sampou.org)
Schemeの教科書

よろずや
URLリンク(www.geocities.co.jp)
lispの実用的な情報が色々。


10:デフォルトの名無しさん
04/08/03 23:01


11:デフォルトの名無しさん
04/08/03 23:41
WindowsXPでschemaをやりたいのですが、XYZZYのような手軽
な処理系はありませんか?

12:デフォルトの名無しさん
04/08/03 23:47
>>11 URLリンク(www.drscheme.org)

13:デフォルトの名無しさん
04/08/05 04:26
>>11
lambdaがエラーになる・・・なぜに

14:デフォルトの名無しさん
04/08/05 04:42
>>13
Dr.Scheme?
Language -> Choose Language で
Standard R5RS を設定すれば lambda 使えるよ

15:デフォルトの名無しさん
04/08/06 05:12
>>11
対話環境なしでいいなら Handy Scheme なんかどう?
とりあえず、お手軽です。

URLリンク(www.geocities.jp)




16:デフォルトの名無しさん
04/08/06 10:27
>>15
簡単に窓を開けるみたいですね.
それなら FFI を実装してくれると,計算ものを他人に使ってもらうときに
ピッタリの解になるのですが.

17:デフォルトの名無しさん
04/08/09 11:08


18:デフォルトの名無しさん
04/08/09 14:46
保全

19:デフォルトの名無しさん
04/08/10 23:47
WiLiKi 荒らされてる……んだよね、あれは。

20:デフォルトの名無しさん
04/08/11 00:40
まさかWiLiKiを荒らすような奴がいるとは思わなかった。
よほど心が腐っていると思われる。

21:デフォルトの名無しさん
04/08/11 02:16
何かあったの?

22:デフォルトの名無しさん
04/08/11 10:33
WiLiKiがどのように荒らされたのか、差し支えない範囲で教えてください。
CLikiもたまに「バカ、アホ、氏ね」みたいな荒らされかたをすることがあるよね。

23:デフォルトの名無しさん
04/08/11 12:18
トップページの履歴見てみなよ。大幅な書き換えがあるから。 >>22

24:デフォルトの名無しさん
04/08/11 12:53
あんがと。確認しました。

25:デフォルトの名無しさん
04/08/11 19:39
こういう分かりやすいのより、本人にそのつもりが無いのに
結果としてグチャグチャにひっかきまわす輩の方がタチが悪いなぁと思う今日このごろ。
自覚が無いから学習もしないし。

26:デフォルトの名無しさん
04/08/11 20:12
またそのはなしか

27:デフォルトの名無しさん
04/08/11 23:28
formに、Lispのタームとしての定訳はありますか?
片仮名でフォームとするのが一般的でしょうか。
迷訳^H^H名訳で有名なSICPでは何と書いてあるのかとか、
Lisp全盛の頃の本では何になっているとかも知りたいですが。


28:デフォルトの名無しさん
04/08/12 00:05
Lisp全盛っていつよ?

29:デフォルトの名無しさん
04/08/12 00:21
WiLiKiの件はWinAPIのとこでど素人っぷりを晒している気の毒な人に
叱咤してるのがそれかなと思ったら、しょ~もないことする奴が居るんだね~。
あきれたもんだ。

>>28 は第5世代コンピュータとか、その辺りじゃないの?

30:デフォルトの名無しさん
04/08/12 00:42
形式

31:デフォルトの名無しさん
04/08/12 09:43
symbolicsとかの lisp machineがあったころじゃ、lisp全盛期って。
とはいうものの、日本ではそんな栄えてなかったから定訳はないとか。


32:part10 の >>968
04/08/12 20:38
part10 の >>988

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

とりあえず色々なところに gnuwin32 の libiconv を置いてみましたが,
できませんでした.
impnotes.html が言う「libiconv のインストール」とは,windows では
どういうことになるのでしょうか.

33:968じゃないけど
04/08/12 21:47
>>32
libiconvを適当なディレクトリにインストールし、そのディレクトリを
指定してコンパイルしなおすってこと。
sourceforgeやcygwinで配ってるバイナリだと日本語は使えないよ。

34:デフォルトの名無しさん
04/08/13 04:37
S式を捨ててM式やそれに似た構文を採用した言語もLispと呼んでいいなら
Lispの全盛期は現在 (苦しいか)

35:デフォルトの名無しさん
04/08/13 07:05
M式の言語って具体的には何ですか?

36:デフォルトの名無しさん
04/08/13 20:53
>>35
M式をさらにヘンテコな構文にしたLisp方言:
Perl、Python、Ruby...

37:32
04/08/13 21:47
>>33
そうですか...orz

minGW でも build できればいいのですが.

38:デフォルトの名無しさん
04/08/13 23:19
日本での全盛期はELISとTAOの頃です

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

40:デフォルトの名無しさん
04/08/14 03:56
いつまでたってもマイナーなのは変わらんけどね

41:デフォルトの名無しさん
04/08/14 10:04
猿でも分かる guile プログラミング
~ unix tool イージー拡張プログラミング ~

見たいな tutorial があると助かるんだけどな~。
Scheme の知識は前提にしてていいから。

42:デフォルトの名無しさん
04/08/15 01:30
>>40
10月に月刊 Lisp Magazine が創刊されるから
メジャーになるんじゃない?



43:デフォルトの名無しさん
04/08/15 13:40
>>42
マジ?w

44:デフォルトの名無しさん
04/08/15 15:43
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 にしたいです.どのようにすればよいのでしょうか.

45:デフォルトの名無しさん
04/08/15 17:18
(setf a (atan 1.0)) ではどう?

46:44
04/08/15 20:20
>>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 だけのソースにできるのでしょうか.

47:デフォルトの名無しさん
04/08/15 21:01
それはリード時にdouble floatにするだけでしょ。

48:デフォルトの名無しさん
04/08/15 21:04
URLリンク(www.geocities.jp)
scheme + HSPって感じだな。

49:デフォルトの名無しさん
04/08/15 21:54
librep みたいなのの Windows 版になれば便利かも

50:44
04/08/15 22:08
>>47
ごめんなさい.よく意味が飲み込めません...
ソース内のリテラルには効果無しですか? ちゃんと変わっているようにも見えますが...

数値計算をさせている方々は,どんな方針で float を扱っているのでしょうか.
single-float ではちょっと足りない感じはありませんか?
処理系依存なところが多くてどうしたらいいか途方に暮れています.

51:デフォルトの名無しさん
04/08/15 22:22
>>48 今、回線が細くてソース下して読む気にならないんで、ソース読んだ人
いたら教えてください。

Tiny Scheme 派生ということなんですが、文字列の長さ制限はどうなってます
か。


52:デフォルトの名無しさん
04/08/15 22:30
>>46
規格を調べてないから間違ってるかもしれないけど
(atan) とかの関数が返すfloatの精度は処理系依存だったような気がする。
この点は、>>45 がうまくいっているなら大丈夫として、

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

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

53:44
04/08/15 23:56
>>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) しようとするとコンパイルが通らないのです.
簡単なテストではうまくいくのですが.

54:デフォルトの名無しさん
04/08/16 02:08
>>42
ソースきぼんぬ。

55:デフォルトの名無しさん
04/08/16 02:33
月刊 Lisp Magazine
創刊号の付録は lambda closure の実装
9号まで集めると簡単に最適化 Lisp コンパイラが組めます。

その他、継続号を入手するのが困難な季刊 Schemer (予定)とか、
必要な時にだけ発行される Haskell User (未定)とか。

56:デフォルトの名無しさん
04/08/16 03:22
> 必要な時にだけ発行される Haskell User (未定)とか。

lazyだけにいつまで待っても出ないヨカーン


57:デフォルトの名無しさん
04/08/16 10:04
読者が読むまで記事が書かれません


58:デフォルトの名無しさん
04/08/16 11:44
>>51
#define LINESIZE 1024
char linebuff[LINESIZE];
char strbuff[256];




59:デフォルトの名無しさん
04/08/16 21:46
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄」
―――――――‐┬┘
                        |
       ____.____    |
     |        |        |   |
     |        | ∧_∧ |   |
     |        |( ´∀`)つ ミ |
     |        |/ ⊃  ノ |   |  J ←さじ
        ̄ ̄ ̄ ̄' ̄ ̄ ̄ ̄   

60:デフォルトの名無しさん
04/08/16 21:56
>>55 月刊 Lisp Magazine か Lisp Wizard 探訪 とかやってくれんかなぁ
今どこで Lisp が使われているか本当に知りたいよ





61:デフォルトの名無しさん
04/08/16 22:32
昔、bitにはLispの連載があったよなぁ。。


62:デフォルトの名無しさん
04/08/16 22:51
Good Old Days
λ...

63:デフォルトの名無しさん
04/08/16 23:24
Gauche-devel-jpのshelarcyがいたい。
webも痛い。URLリンク(page.freett.com)

64:デフォルトの名無しさん
04/08/17 00:35
ウォチは板違いってテンプレに書いておいた方が良さそうだな

65:デフォルトの名無しさん
04/08/17 00:41
結局、月刊 Lisp Magazine はネタですか?
残念。

66:デフォルトの名無しさん
04/08/17 00:41
>>64
やってんのは一人だろ、どうせ。何のつもりか知らんが。

67:デフォルトの名無しさん
04/08/17 14:41
Lisp関係ないじゃん

68:デフォルトの名無しさん
04/08/17 21:57
>>63
あれは誰かがサクっと書いて「ほれ。」と出して黙らせるしかないんじゃないかな。
放置が一番でしょう。
川合さんのメールは似たような奴を相手にしたら使えそうなので、
それを引き出したという点では価値があるといえる(w


69:デフォルトの名無しさん
04/08/17 22:59
あれは単に匙を投げられただけでわ

70:デフォルトの名無しさん
04/08/18 04:06
R*RSでは伝統的なマクロ(不健全なマクロ)をサポートする気はないのかな?
もうすでに却下されているのかな?

71:デフォルトの名無しさん
04/08/18 10:32
>>70
一体何のために?


72:デフォルトの名無しさん
04/08/18 12:50
hygienic の対義語が不健全か。その表現いいねー
(defmacro sekusu (timpo mamco)
`(insert ,(if (hokei-p timpo) ...
とかやっちゃうわけだ。ハァハァ

73:デフォルトの名無しさん
04/08/18 17:14
Scheme の健全マクロを学ぶのに、おすすめのページはありますか?


74:デフォルトの名無しさん
04/08/18 18:33
>>73
ないよ

75:デフォルトの名無しさん
04/08/18 19:08
>>73
とりあえずブックマークにこんなの入ってた。
URLリンク(home.comcast.net)

76:デフォルトの名無しさん
04/08/18 19:47
>>73
前スレ(Part 10)の786にも書いたんだけど、
Schemeの健全マクロについては、

・日本語

オンラインで読める文献は >>5 に出てる「入門Scheme」以外にないと
思う。pdf ファイル。
#URLリンク(www4.ocn.ne.jp)

書籍だったら、『プログラミング言語SCHEME』R.ケント ディヴィグ (著)
URLリンク(www.amazon.co.jp)


・英語

上の本の原書(英語版)がオンラインで読める。
URLリンク(www.scheme.com)

77:デフォルトの名無しさん
04/08/18 23:27
>>76
よっぱど英語を見たくないのでもなければ、下の英語のがおすすめ。
わかりやすいよ。



78:デフォルトの名無しさん
04/08/19 00:27
Dr.Schemeって機能限定されてない?
defstructとか使えないような気がする・・・

79:デフォルトの名無しさん
04/08/19 01:40
「機能限定されてる」んじゃなくて、「機能拡張されてない」んでしょ
defstruct は srfi なんだから

80:デフォルトの名無しさん
04/08/19 02:32
The Little Schemer の9章を解説してるwebページはないですかね?
もしくは理解するのに役立つwebページ、本でもいいですが…。

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



81:デフォルトの名無しさん
04/08/19 06:26
lambdaで関数定義ってことはY combinatorかなあ。

82:デフォルトの名無しさん
04/08/19 08:46
昨日の某大学の院試でSchemeの問題が出たんだけど…

できませんでした。orz

83:デフォルトの名無しさん
04/08/19 10:29
>>80
あれは Y Combinator の説明なんだけど、はっきり言ってわかりづらい。
私は旧版の日本語訳『Scheme手習い』しか読んでないんだけど。

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

とりあえずこんなページをどうぞ。
URLリンク(i.loveruby.net)

あと、このスレの Part 9 の 422 から、lambda だけで再帰する方法に
ついて議論がある。個人的にはそこがとても参考になった。
そこを見ながら、自分でいろいろコードを書いてみて、Y Combinator が
なぜこういう形でなければならないのか、納得できるまで追及した。

84:デフォルトの名無しさん
04/08/19 12:44
>>82
ツバメの大学ですか?
いや,まあ俺も(ry

85:デフォルトの名無しさん
04/08/19 16:13
>>80 この説明はどうですか?
URLリンク(otoha.dyndns.org)

86:デフォルトの名無しさん
04/08/19 23:34
(sort lst #'< :key #'car)

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

(position-if #'この中で一番大きい lst)
みたいなことをやりたいのです.

87:デフォルトの名無しさん
04/08/19 23:44
>>86
効率悪いけど、こんな感じじゃダメですか。
(let ((x '(1 2 3 4)))
(position (apply #'max x) x))


88:86
04/08/19 23:53
>>87
ダメじゃないです.ただ,良く使われそうな操作なので,
みなさんなら最も短くて効率の良い方法をご存じかと思ったんです.

max が返すものは,元の要素と eq なんですよね.

89:デフォルトの名無しさん
04/08/20 00:31
(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))))))

90:デフォルトの名無しさん
04/08/20 00:44
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


91:90
04/08/20 00:48
10分以上遅れて結婚とは…orz

92:デフォルトの名無しさん
04/08/20 02:21
マスターするならCommonLispとSchemeどっちがいい?

93:デフォルトの名無しさん
04/08/20 02:34
どっちも趣味

94:デフォルトの名無しさん
04/08/20 06:53
>>93
どっちも優雅で知的で、極めるまでは時間が
かかるけど学ぶことそのものが楽しみつつ行
なえる素晴しい言語って意味?

それともどっちも金にならないオタク言語で
ちょっとした満足感は得られるけど世間では
何の評価も得られなくて非生産的って意味?


95:デフォルトの名無しさん
04/08/20 10:29
Lisp の実装によくある、car 部のお隣(物理的な隣のメモリ)に
直接 cdr 部を置くことで、(car . cdr) を4+4 = 8バイトで表す技法が理解できません。

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

どうしてこんなのでちゃんと動くんですか?
誰か詳しい人教えてください。


96:デフォルトの名無しさん
04/08/20 11:16
>>95
アドレスのLSBから数ビットをタグに使う

97:95
04/08/20 11:39
いや、タグの話ではなくて。。。

例えば、 単純な (1 . 2) というペアだけならば話は分かるが、
(1 2. 3) となった場合とか、((1 .2) 3 4 . 5) となった場合とか、
どうして >>95 で良いのかが分からん。


98:デフォルトの名無しさん
04/08/20 11:50
どこがダメになりそうだと思うのですか?

99:95
04/08/20 12:30
例えば、ヒープを8バイト(セル2つ分)単位で確保して、

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

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

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

つか、上のような8バイト単位でメモリを切り取っていく
意味が良く分かっていないと思う(メモリの圧縮(=節約)の為
だという事ぐらいは分かるのだが)。


100:デフォルトの名無しさん
04/08/20 12:33
4バイトがセルへのポインタになったり即値になったりする様子がイメージできないのでは?

101:デフォルトの名無しさん
04/08/20 12:48
>>96
>>99の例でいうと, car部は 0x5670**** へのポインタとみなされて
cdr部は0x5674**** へのポインタとみなされるってことでいい?

>>100
即値の場合も即値へのポインタじゃないの?

102:デフォルトの名無しさん
04/08/20 12:55
即値は即値ですよ。ふつうヒープ上に配置したりはしません。

103:デフォルトの名無しさん
04/08/20 13:01
えーと、いわゆるcdr codingの話じゃなくて、consセルを
ポインタ2つ分きっかりで表す話をしてるんだよねぇ?
それならどこがどうわからないのかわからないんだけど。
基本はcarもcdrもポインタでそ。

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

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



104:デフォルトの名無しさん
04/08/20 13:03
CONSセルの値って全てがポインタだと思っていた。
即値が入ってる場合があるの?

URLリンク(www.shiro.dreamhost.com)
> # 動的型付け。Lispでは全ての変数は実質的にポインタだ。変数ではなく
> 値の方に型が付いており、代入や束縛は実質的にポインタのコピーで行われ、
> ポインタが指されるものには作用しない。

105:104
04/08/20 13:07
おや、すでに解答が>>103に書かれていた。
リロードすればよかった。スマソ。

106:95
04/08/20 13:42
>>100
>4バイトがセルへのポインタになったり即値になったりする様子がイメージできないのでは?

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

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

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

アドレス 0x12345678 になるならば話は分かるけど、
そうではなさそうだし・・・


107:デフォルトの名無しさん
04/08/20 13:44
Cのポインタの理解ができていないだけのような気がしないでもない。

108:95
04/08/20 14:06
>>107
そうなの?

それとついでに、セルを確保する際に、
必ず8バイト(セル2つ分)単位で
メモリを切り取っていくという点も。


109:デフォルトの名無しさん
04/08/20 14:10
>>95
ど素人っぽいけど
その辺の話題は過去スレで散々がいしゅつだから、
過去ログさらっと流し読みしてみれば?
幸い全部残ってるし。

110:デフォルトの名無しさん
04/08/20 14:13
>>106

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

そのポインタが下位2ビットは使ってないことわかる?
例えばその2ビットをフラグとみなして識別に使ったりする。

111:デフォルトの名無しさん
04/08/20 14:15
>>106
あーそうか、ポインタまるで理解してないね。
そういう事知ろうとする前に、C言語でもやったら?

112:デフォルトの名無しさん
04/08/20 14:19
そもそもこの場合、0x12345674 は cons cell を表わす値としてありえないだろう。
cons cell が 8バイトアラインメントなんだから。
ありえない値の cdr なんて取れるはずがない。

113:95
04/08/20 14:20
>>110
>なるよ。

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

ここで + 演算ではなく | 演算をしているでしょ?
それではどうやってもならないと思うし、
また >>108 の回答にもなっていない。


114:名無しさん@Emacs
04/08/20 14:36
8バイトで align されてるってことは
 a % 8 == 0
ってことだ。
この場合は 0<=i<7 の i に対して、a+i == a|i が成り立つ。
だから + でも | でもよい。


115:デフォルトの名無しさん
04/08/20 14:42
もしかして (1 2 . 3) が

0x12345670 1
0x12345674 2
0x12345678 3

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

0x12345670 1
0x12345674 cons 0x12345678

0x12345678 2
0x1234567c 3

だよ。 cdr-coding だと話は別だけど、今時 cdr-coding なんてやらないし。

116:デフォルトの名無しさん
04/08/20 14:45
long一発で初期化できるというヨロコビはあるかも。通常の2倍の速さでコンパクションできるとか。
(コンパクションの必要があるかどうかは知らんけど)

117:95
04/08/20 15:18
>>115
>0x12345670 1
>0x12345674 cons 0x12345678
>
>0x12345678 2
>0x1234567c 3
>
>だよ。

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

ところで、cdr-coding ってなんですか?


118:デフォルトの名無しさん
04/08/20 15:22
>>117
>でもそれでは余り8バイト単位で確保する意味が無いですね。

でも高速化の為なら意味があるか。
それだけ為なのかなぁ?


119:デフォルトの名無しさん
04/08/20 15:35
何バイト単位が最適だと思ってるの?

120:95
04/08/20 15:41
>>119
4バイト


121:デフォルトの名無しさん
04/08/20 17:21
ポインタに4バイト使うなら、consセルは8ビットいるよ。

122:デフォルトの名無しさん
04/08/20 17:22
8ビットじゃなかった。8バイトだ。

123:デフォルトの名無しさん
04/08/20 17:27
>>120
…まあ落ち着け。
cons セルはバイナリ・ツリー(二分木)のノード(節)だ。
一つの節から生える枝は必ずcar, cdr の 2本だから、
一つの cons セルは2本分の枝のアドレスを保持する必要があるんだよ。
だから 4バイト × 2 で8バイトが必要になる。

124:デフォルトの名無しさん
04/08/20 17:35
>>120
あとな、この辺の図も見ておけ。
cons セルがどうしてポインタを2つ持つのか、いやおう無しに分かるから。
URLリンク(www.stdio.h.kyoto-u.ac.jp)


125:デフォルトの名無しさん
04/08/20 17:56
>>117
それをみんなずっと言ってたんじゃないかあぁぁぁぁ・・ぁぁぁぁ・・・・・・


126:デフォルトの名無しさん
04/08/20 18:05
単にconsセルを理解してないだけだろ。

127:95
04/08/20 18:59
いや、どうも。。。

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

例えば >>115 のように、cdr となるセルを
(物理的に)隣のメモリに配置することが出来て、
それを cons 表現の(内部的に)特殊な表現として扱えれば、
本来であれば (car . cdr) を表現するためには
3つのセルを使用しなければならないところを、
たった2つのセルで表現できてしまう。
ていうか、セル1つの表現が4バイトあればほぼ事足りてしまう。
(勿論再帰などの問題があるので、通常のポインタ2つ丸々
使用する例外的な表現も許すようにしておけばよい)
Lisp で使うセルの大半は cons なので、
こういうのは結構お得な発想だと思っていたけど?


128:デフォルトの名無しさん
04/08/20 19:06
>>127 それをcdr-codingっていうんだよ。
URLリンク(www-2.cs.cmu.edu)



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

130:デフォルトの名無しさん
04/08/20 19:35
>>128
へーなるほど。。。

勉強になりました。


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

普通、「セル」といったら「cons cell」のことで、
(A . B)
のペアを1つのセルと数えると思うんだが

132:デフォルトの名無しさん
04/08/20 20:13
>>127
>結局のところ cons セルを "ナイーブに" 実装するだけだったら
>ポインタを2つ積めば良いのは分かっているんだけど、

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

リスト遊びから読み直せ。

133:デフォルトの名無しさん
04/08/20 20:24
>>131
それだ!
>>127 とか、読んでも意味が分からんかったんだけど、
95氏は 変数(ポインタ)一つのことを1つのセルと呼んでいるんだ。

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

あと、95氏は、彼の読んでいるコードは、何らかの最適化がされているということを
前提に考えているみたいだけど、それって思い込みなのじゃないか?
実際は、普通(ナイーブ)に2つのポインタのペアとしてコーディングされてるんじゃ
ないのか?>>115-117を見てると、そうとしか思えん。

134:デフォルトの名無しさん
04/08/20 20:27
ポインタ一つをセルと呼んでるとしても、
>本来であれば (car . cdr) を表現するためには
>3つのセルを使用しなければならないところを、
>たった2つのセルで表現できてしまう。
は理解不能。
なんで3つもいるの?

135:95
04/08/20 20:33
>133
>95氏は 変数(ポインタ)一つのことを1つのセルと呼んでいるんだ。

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

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

そう、「それ」が分かったんです。
単なる思い込みで、そのコードが所謂 "CDR-cording" をしていると
ばっかり思っていたので・・・


136:デフォルトの名無しさん
04/08/20 20:36
じゃあ95はポインタを二つ使うconsセルについては理解してるんだな?

137:デフォルトの名無しさん
04/08/20 20:55
>>135
>「メモリセル」とか言わない?
言うけど、Lispスレではすっごく紛らわしいよ。実装寄りの言葉を使いたいのは
分かるけど、なら「メモリセル一つ(cons セルにあらず)」とか書いて欲しいよ。
でなきゃ素直にポインタと書くとか。

> そう、「それ」が分かったんです。
うー、だったらはっきりそう書いて欲しかった。じゃあもう完全に分かったのね?
cdr-codingとかを除いて。
だけど、>>134とか見ると不安なんだけど。何に3つのポインタが必要なの?

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

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

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

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

一体、ここでいう「セル」は何を指しているんだ?

139:95
04/08/20 21:12
>>137
御心配かけて誠にスミマセン。

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

これでどうでしょ?


140:デフォルトの名無しさん
04/08/20 21:15
pairってなんだ・・・??
頼むからもうちょっと説明をしてくれ。

141:95
04/08/20 21:22
そんなに「セル」って言葉の使い方、変なのかな・・・
>>128 で紹介されていた葱メロンの FAQ でも、
それっぽい使い方をしているみたいだけど。
pair って単語も、ちゃんと >>128 に出ているし。


142:デフォルトの名無しさん
04/08/20 21:26
自分用語を使わず、面倒でもまわりくどい言い方で説明してくれyo。
あまりにも言葉足らずで、その単語が本当に本来の意味で使われているのかどうかすら判断できない。

143:128
04/08/20 21:33
用語には文脈ってもんがあるんだからさぁ。
Lisp界では、文脈無しで「セル」って言ったら
「consセル」=「pair」=「carポインタとcdrポインタの対」
と思われるだろう。まあ、>>95 がそう思わないとしてもだ、
ここは曖昧さを避けるために区別できるような言葉を使っては
くれまいか。

>>128 で紹介した文書には確かに「CAR cell」「CDR cell」
という言い回しが出てくるが、それはCDR codingの説明の
文脈であるって前提で、しかも最初に「CAR cell」「CDR cell」
と修飾して使ってるから意味が通るんじゃない。
個人的には、「slot」と言った方が混乱が避けられると思うがね。


144:デフォルトの名無しさん
04/08/20 21:49
>>139
> pair と car と cdr。計3つ。
> これでどうでしょ?

了解。安心しますた。

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

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

あなたも、聞きたい答えを得るのに、たくさん説明しなきゃならなくて
大変でしたね。お疲れ様。

145:95
04/08/20 21:50
>>142
>自分用語を使わず、面倒でもまわりくどい言い方で説明してくれyo。
む~。難しいですね。とりあえずやってみます。

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

>「セル」がconsセルのことを指しているのなら4バイト=ポインタ1つでは足りないし。
それを無理やり足りさせてしまう技法を "CDR-cording" と呼ぶそうです。


146:デフォルトの名無しさん
04/08/20 21:51
>>143
>個人的には、「slot」と言った方が混乱が避けられると思うがね。
なるほど、でも slot というとまた別のイメージが・・・
この手のものをあらわす正式な用語ってないんですか?

>>144
いえいえ、どういたしまして。


147:デフォルトの名無しさん
04/08/20 22:43
で、結局 >>127 の中で用いてる「セル」は「consセル」なの?「メモリセル」なの?どっちなのよ

148:デフォルトの名無しさん
04/08/20 23:20
もういいだろ

149:デフォルトの名無しさん
04/08/20 23:25
(gc)

150:デフォルトの名無しさん
04/08/20 23:27
(exit)


151:デフォルトの名無しさん
04/08/20 23:29
なんだ
うやむやにして終わりか

152:デフォルトの名無しさん
04/08/20 23:39
>>147
これはメモリセルと断言できると思うよ。実装の話をしてるわけだし。

153:デフォルトの名無しさん
04/08/20 23:50
(1 . 2) を表現するために必要なメモリセルは二つだと思うんだけどなんか間違ってる?

154:デフォルトの名無しさん
04/08/21 00:08
>>153
実装次第。


155:デフォルトの名無しさん
04/08/21 00:27
>>154
や、CDR-cording とやらを使わない普通の実装でもよ。
普通の実装の場合でもアトムならポインタ使わないでしょ。リストの時だけ使う。
常にポインタ使う実装もあるのかもしれないけどさ。

156:デフォルトの名無しさん
04/08/21 00:38
(1 . 2) をあらわす即値を用意すればいいのでは。

157:デフォルトの名無しさん
04/08/21 00:42
>>156
それには何バイトいるの?

158:デフォルトの名無しさん
04/08/21 00:44
>>157
実装次第。

159:デフォルトの名無しさん
04/08/21 00:51
>>158
156のテクニックは必要な領域を減らすことができるの?

160:デフォルトの名無しさん
04/08/21 01:19
もういいだろ!

161:デフォルトの名無しさん
04/08/21 01:26
(gc!)

162:デフォルトの名無しさん
04/08/21 01:35
釣られすぎー


163:デフォルトの名無しさん
04/08/21 03:09
xyzzy とかで lisp-interaction-mode だと
自動的にLispのインデントをしてくれますよね?
でも、*.l を開いた後、自動インデントにならないのです
*.l のときは、Lisp用のインデントをしてくれるように
設定したいのですが、方法をご存知の方いませんか?
ググって調べたいのですが、何で調べたらよいのかも
よくわからないのです。

164:デフォルトの名無しさん
04/08/21 03:15
describe *auto-mode-alist*

165:デフォルトの名無しさん
04/08/21 03:16
妙に書き込みがあると思ったら…

95は>>63を彷彿とさせるなぁ…

166:デフォルトの名無しさん
04/08/21 04:02
>>165
そうか?95 はちゃんとした人だと思うが。
当初の勘違いのせいもあって、コミュニケーションがうまく
行かなかっただけじゃないのか?

167:デフォルトの名無しさん
04/08/21 04:06
ところで、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 人口は生きた化石のごとく変わらないのであろうか?

168:デフォルトの名無しさん
04/08/21 04:33
>>146
ワード?


169:デフォルトの名無しさん
04/08/21 05:01
レベルは下がり続けているな。

170:デフォルトの名無しさん
04/08/21 05:54
未踏の lego 用 XS lisp って本当にいじってみた人いる?
Google で「面白そう」って意見は結構見るんだけど
おれは Lisp 入門者だけど実装側の勉強にもなるかな?


171:80
04/08/21 10:35
>>83 >>85
情報サンクス。
λ計算の理論から導出される公式として覚えておけば良いものみたいですね。
情報数学知らなかったので助かりました。


172:デフォルトの名無しさん
04/08/21 19:06
>>164
サンクス

173:デフォルトの名無しさん
04/08/21 22:33
気付いたら>>95のヴォケのおかげで無駄レスが・・

174:デフォルトの名無しさん
04/08/23 02:51
陸上の末続選手はちょっと Shiro さんに似てると思った

175:デフォルトの名無しさん
04/08/23 14:55
>>174
ぜ、全然似てない…!!!
URLリンク(images.google.co.jp)

176:デフォルトの名無しさん
04/08/23 23:02
>>174 馬鹿だな、親戚だから似てて当たり前


177:デフォルトの名無しさん
04/08/24 13:01
>>71
マクロを使ったプログラムの互換性を保障したいためでしょ。
デファクトなんだし、仕様に取り込んでもいいと思うのだが。
Schemeマクロを実装するよりも、ずっと手軽に実装できるしな。

178:デフォルトの名無しさん
04/08/24 19:39
>>177
legacyマクロでプログラムの互換性を保障するのは難しいよ。
バッチコンパイルする処理系だと、マクロから呼んでる関数が
マクロ展開時にはまだ無いってことがあり得る。
え、eval-whenですか? それはちょっと…


179:デフォルトの名無しさん
04/08/24 21:11
eval-whenは必須でしょ

180:デフォルトの名無しさん
04/08/24 21:38
そんなマクロはうちの子じゃありません

181:デフォルトの名無しさん
04/08/24 22:28
eval-whenてなに?

182:デフォルトの名無しさん
04/08/25 00:53
>>181
黒魔術。

183:デフォルトの名無しさん
04/08/26 00:50
(expt float integer)

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

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

不安なら整数用の expt を作る必要がありますか?

184:デフォルトの名無しさん
04/08/26 01:32
>>183
>2 乗や 3 乗のときは,これでは困りますよね.
なにが困るのか判らない。

185:183
04/08/26 23:37
>>184
2 回か 3 回の掛け算で済むことに,log や exp の計算
(級数などを使うのでしょうか?) をしてしまうのは不経済では,と思ったのです.

186:デフォルトの名無しさん
04/08/27 00:02
それは「困る」とは違うよね

187:デフォルトの名無しさん
04/08/27 06:26
>>183
処理系任せだろうね。真面目な処理系なら最適化してるんじゃない。
心配ならプロファイリングしてみれば。
というか、そんな細かいところを気にする前にベンチ取ってボトルネック
見つける方がいいと思うよ。

188:183
04/08/28 14:02
>>186-187
みなさんのお陰で考え方が分かりました.ありがというございました.

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

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

そうですね.言われるまでこういうことには気づきませんでした.

189:デフォルトの名無しさん
04/08/29 17:38
LISPって遅そうでめちゃんこ速いね

190:44
04/08/29 18:43
数値 (float) が書かれたテキストを読んで,
それとソース内のリテラルとで算術演算する場合は,
リテラルの表記を *read-default-float-format* に合わせておくべき,
というより合わせなくてはならないのでしょうか.

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

clisp で long-float する人たちは,
リテラル全ての箇所で coerce するなんて,そんな話はありませんよね?

191:デフォルトの名無しさん
04/08/29 18:59
必要なら全ソースを*read-default-float-format*で検索すれば
そのうちわかるんでは?
clispも企業に対して動作保障をしているわけではないし、
どの言語処理系も数値周りは手抜き工事していたり、
バグの温床だったりする可能性が高いので。

192:デフォルトの名無しさん
04/08/29 19:27
>>190
最終的な目的がなんなのかによるだろ

193:デフォルトの名無しさん
04/08/29 20:45
defineの挙動なんですが、top levelとそうでないときとで
動作が異なるってやつの実装がマンドクセえんですが

実際はどうやってんでしょう
フラグ?

194:44
04/08/29 22:54
むむ,compile しないで実行すると warning が出ない.
compile の過程で勝手に single-float にされているのかな?

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

>>192
ちょっとファイルから読んで計算するだけです.
single-float では桁が寂しい感じがしたので,せっかくだからと
long にしただけなのに怒られた,というわけなんです.

195:デフォルトの名無しさん
04/08/29 23:07
>>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.

URLリンク(cvs.sourceforge.net)

ECL とかでも使われてたと思う。何のメリットがあるかは知らない。

196:44
04/08/30 01:30
今まで eval-when を使ったことが無かったのですが,
もしかしてと思い,

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

としたら,問題無くなりました.コンパイル時にも,その後の実行の時も
double-float で読む,ということなんですね.
今までこんな便利なものも知らなくて問題を長期化させました.すみませんでした.

197:デフォルトの名無しさん
04/08/30 19:45
>>193
環境を見ればトップレベルかどうかはわかるよね。

internal defineはマクロとの絡みがややこしい。
実装者泣かせかな。


198:デフォルトの名無しさん
04/08/30 21:49
内部defineはふつー実行前にletrecに変換するでしょ
まともな処理系なら

199:デフォルトの名無しさん
04/08/31 18:59
Dr.Schemeで「独習Scheme三週間」で紹介されてるすべての構文を使用するには
どうすればいいの?
ドットリストで構文エラー出るよ・・・

200:デフォルトの名無しさん
04/08/31 21:42
>>199
ドットリストで構文エラー出るなんてありえねー
そのコードさらしてみ

201:デフォルトの名無しさん
04/08/31 22:00
>>199
Language → choose Language で Full Scheme

202:デフォルトの名無しさん
04/09/01 01:57
9月の言語はSchemeと決まっています.

203:デフォルトの名無しさん
04/09/01 18:52
8月の言語は何だったの?

204:デフォルトの名無しさん
04/09/01 20:14
Augustだ。
略してAda。

205:デフォルトの名無しさん
04/09/02 14:12
cl の loop が,*短ければ* 読みやすさも書きやすさも両立してて,
すごくいいことを知りました.
lisp らしくないからと拒んでいた自分が悲しいです.
; グレアム氏の入門書が偏っているせいかと w

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

get-output-string-stream の input-stream 版が無いのは残念ですね.

206:デフォルトの名無しさん
04/09/02 20:22
そうこうしてるうちにOnLisp邦訳も更新されてたね。乙
後2章か、がんがれ

207:デフォルトの名無しさん
04/09/02 21:38
URLリンク(www.itmedia.co.jp)

208:デフォルトの名無しさん
04/09/02 22:44
>>207
なんだかなぁ... すべてが痛々しい

209:デフォルトの名無しさん
04/09/02 23:53
>>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らしからぬ見た目になるけどね。

210:デフォルトの名無しさん
04/09/03 00:04
3年前はロン毛だったと記憶してるんだけど・・・これヅラだよね?普通に考えて。

211:デフォルトの名無しさん
04/09/03 01:07
>>209
read-line は改行を消してしまうね.
「行の区切り」を指定できるスペシャル変数があればいいのに.
; awk みたいだ...

212:デフォルトの名無しさん
04/09/03 01:30
学生時代に授業でSchemeをちょこっとやったんですが、
最近CommonLispをいじってます。
で、CLのlambdaなんですが

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

これにすごい違和感があります。この「#'」はナニモノで
何故必要なんでしょう。

213:デフォルトの名無しさん
04/09/03 02:00
>>212
このページが大変参考になる。
URLリンク(www.ice.nuie.nagoya-u.ac.jp)

214:デフォルトの名無しさん
04/09/03 02:28
LISP-1か2の違い。

215:デフォルトの名無しさん
04/09/03 04:24
数ヵ月前に見た時もロン毛だったよ>ドクターT。



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



217:デフォルトの名無しさん
04/09/03 14:43
>>216
(get-output-string-stream)
で作ったストリームで *standard-output* を let で上書き,,,でできますか?

218:デフォルトの名無しさん
04/09/03 15:44
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

219:218
04/09/03 15:45
追記.with-open-file を外せば直ります.

220:デフォルトの名無しさん
04/09/03 19:44
>>218
リテラルリストを破壊的に変更しちゃいかんよ。


221:218
04/09/03 20:35
>>220
結果は処理系依存ということなんですか.
最初の alist を,
(list (cons :file "foo.txt")
      (cons :bar nil))
に変更すればいいのでしょうか.

こういうのを警告してもらう方法がありましたら教えてください.

222:デフォルトの名無しさん
04/09/03 20:39
(rplacd (assoc :bar alist) 6))

(setf alist (cons (cons :bar 6) alist))

223:218
04/09/03 22:16
>>222
assoc で引かれることがないとしても,なんとなく違和感がありませんか?
こういうのを普通に感じるて初めて中級者なのでしょうか.

224:デフォルトの名無しさん
04/09/04 02:10
リテラルを書き換えちゃだめってのは別にLispに限らない、プログラミング言語
一般(とくにコンパイラが介在するもの)に言えることでしょう。
Cでも文字列リテラルには手は出せませんし。


225:デフォルトの名無しさん
04/09/04 03:01
> Cでも文字列リテラルには手は出せませんし。

んなこたあない。

普通はしないけど。

226:デフォルトの名無しさん
04/09/04 03:09
OS-9 の C言語処理系は literalが code module (だっけ?) に
置かれるので、書き換えちゃだめでした...

昔話かつ lispじゃないので sage


227:デフォルトの名無しさん
04/09/04 08:18
>>225
> > Cでも文字列リテラルには手は出せませんし。
> んなこたあない。

いや、んなことあるよ。
リードオンリーなセグメントに置かれるので、変更しようとするとbus errorになる。
そうしないとリテラルはプロセス間で共用することも実行ファイルを直接バッ
キングストアにしてmmapすることもできなくてメモリ利用上非効率。
よしんばそうでなくとも複数の同じ内容の文字列リテラルは一つにまとめられるので、
そういうものだと変更すれば当然悪影響が出る。


228:デフォルトの名無しさん
04/09/04 13:43
古き悪しきお行儀の悪いやつ用のコンパイルオプションも大抵用意されてはいるけどね

229:デフォルトの名無しさん
04/09/04 23:18
警告も何も出ない?
セルにimmutableフラグとか付いてないのか。
tinyschemeだか何かの処理系はそういうフラグがあって、
破壊代入するとエラーか何か出た記憶がある。
LISPの場合大抵は複製するから、個人レベルでは対策しなくても
あんま問題にはならないけど、時間置いて使うとたまにやってしまったりするな。
こういう場合の処方で処理系にセーフティレベル上げるとか何らかの
モードがある場合もあるが、実際は目先の速度に気を取られて
気付かない&あえて無視する可能性が高いんだよな。
結局デバッガ立ち上げて原因がわかると。
cmuclレベルの処理系なら何らかのオプションがあると思う。

230:デフォルトの名無しさん
04/09/05 17:46
InterLispって良く見るんですが、これはLisp方言の一種ですか?
それともCL実装の名前ですが?

231:デフォルトの名無しさん
04/09/05 17:52
URLリンク(foldoc.doc.ic.ac.uk)


232:デフォルトの名無しさん
04/09/05 22:03
>>217
折角教えていただいたのですが、出力文字列を解釈しなくちゃいけなくて大変そうで、
unix-gettimeofdayでusecをとってごまかしてしまいました。
プロセス時間じゃなくて実時間ですが。
経験値を上げてもうちょっと賢くなったらトライしてみます。


233:デフォルトの名無しさん
04/09/05 22:49
WindowsでLISPでマルチメディアが扱える
処理系ってないのでしょうか

234:デフォルトの名無しさん
04/09/05 23:48
マルチメディアってなんなんやー?

235:デフォルトの名無しさん
04/09/06 00:37
メディアが複数同時に使えることでは?

236:デフォルトの名無しさん
04/09/06 02:06
フロッピーとハードディスクのファイルを読み書きできるとかか。

237:デフォルトの名無しさん
04/09/06 03:12
クイックディスクを忘れないで欲しい。

238:デフォルトの名無しさん
04/09/06 06:22
えっと、lispacheの苫米地氏とオウム事件「逆洗脳」の苫米地氏って、
同じ人なんですか??

239:デフォルトの名無しさん
04/09/06 10:34
>>234-238
おまえら、いい加減にしろw

>>233
やっぱりACLじゃないの?
なんでもできそうだけど。

240:デフォルトの名無しさん
04/09/06 15:00
gauche用のsdlラッパというのが一番ありがちなパターンに見えるなあ

241:デフォルトの名無しさん
04/09/06 15:39
>>233
LISPならxyzzy,SCHEMEならHandySchemeのMCI関数でどうよ?


242:233
04/09/06 22:15
ACLインストールしました
HandyScheme は知りませんでした
なんかゲームの挙動をLISPで書いて
細かい部分をCで書いて、みたいな
ことを考えてるんですけど・・・
とするとgauche の sdlラッパというのがよさげですね
有難うございました

243:デフォルトの名無しさん
04/09/06 23:52
>>238
t

>>233=242
Corman Common Lispも見てみれば? IDE使わなきゃ無料だしWindows APIと
仲良くするのも結構得意だというのを聞いた希ガス。実体験ではないので本当のトコロが
どんなもんか知らんけど。
マニュアル眺めた限りではDLL作ったりとかインラインアセンブラ使ったりとかWindowsが
主環境であればそれなりに使えそうだったよ。SDLも誰かライブラリ作ってたはずだし。

244:233
04/09/07 00:48
>>243
有難うございます
いつも不思議に思うのですが
私も結構Lisp関連のサイトをこまめに
調べてはいるのですがそういう情報にたどり着けない・・・
どこでそういう情報を得るのですか?
英語圏を調べろってことですかね・・・欝

245:デフォルトの名無しさん
04/09/07 07:22
Cormanは日本語が通らないのが難点。ゲームとか作るんなら要らないかも知れないが。
それとも今は通るようになったのかな?


246:243
04/09/07 21:19
どこでって普通にググるとかcomp.lang.lisp読むとか。
英語圏避けてたらLisp関連サイト調べてないのとほぼ等価と思われ。
ってか折角ただでいろんな情報転がってるのに自分で枠狭めてちゃもったいない。
RCE関連サイトにはロシア語圏にディープなのが多いね。

247:デフォルトの名無しさん
04/09/07 22:41
Arcの話題ってこことは違う?

248:デフォルトの名無しさん
04/09/08 00:46
ここでいいんじゃないの。何か進展あった?

249:デフォルトの名無しさん
04/09/08 02:20
slime 1.0
URLリンク(common-lisp.net)

250:デフォルトの名無しさん
04/09/08 05:53
gaucheってそもそも Windows に正式対応してたっけ?
Windows 2000 + cygwin でなんとかコンパイルできる段階みだいだけど、
ちゃんと使えてる人いる?




251:デフォルトの名無しさん
04/09/08 09:17
XP + Cygwin でとりあえず gosh が起動しますが
それ以上の確認はしてないっす

252:デフォルトの名無しさん
04/09/08 10:19
普通に使える
GLも使える
問題なし

253:デフォルトの名無しさん
04/09/08 17:50
>> 251-252
有難う。
どうやら、家のCygwinは古いようなので新しいやついれて
ためしてみます。


254:デフォルトの名無しさん
04/09/09 05:26
今日はFranzセミナーですね。終わったら報告キボンヌ

255:名無しさん@
04/09/09 08:26
前から気になってたんですが、CLOSにはコンストラクタってないんでしょうか?

256:デフォルトの名無しさん
04/09/09 09:39
:initformじゃだめ?
だめなら make-instanceをオーバーライド。



257:デフォルトの名無しさん
04/09/09 09:44
gauche-sdl
URLリンク(michaelvess.com)


258:デフォルトの名無しさん
04/09/09 14:42
Win XP + ACL 6.2 + slime 1.0 + Meadow-2.10-dev (ASAGAO)
を使っているんですが、日本語が表示できる設定おしえてください。




259:デフォルトの名無しさん
04/09/10 00:40
>>256、に限らず
:initformと:initargsって何か使い分けるのに明確な基準とかある?
make-instanceをオーバーライドするんじゃなくてmake-fooみたいなのdefunして
その中でmake-instanceして細工したオブジェクト返すのはよくやるけど、CLOS的には
ダサいっすか?

260:デフォルトの名無しさん
04/09/10 07:24
ダサいというより、しっかりドキュメントしとかないと(していても)忘れそうじゃない?
間違ってmake-instance単独で使われたときに検出してエラーを出すようにしないと、
しばらくたって保守するときとかにやばそう。


261:デフォルトの名無しさん
04/09/10 08:10
>>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
URLリンク(www.lispworks.com)

262:233
04/09/10 23:05:30
gauche Windowsで使う方法がいまいちわからない・・・

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

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

(2)の方法が良くわからないのですがCのライブラリに
gaucheからアクセスするのは簡単なのですか?
だとしたら自分で使いやすいようにラッパを作っても
いいんですけどね・・・

263:デフォルトの名無しさん
04/09/10 23:44:32
>>262
Gauche は examples/spigot/ が参考になるかと

264:233
04/09/11 01:41:51
>>263
(2)は define-module, select-module, dynamic-load, provide
の手順でいけるんですね
gauche が理解できる形でstubというのを作ってそこから引っ張るんですね
なんとなくわかったような・・・

@GOSH@ ってのは そのstubというのをつくるコマンドですか?
GOSH getstub $<
スタブとか言葉は聞いたことあるけど実はあんまりわかってないw

265:264
04/09/11 16:06:15
gauche インストールしました
gosh ってgouche のリスナーの名前だったんですね・・・
お恥ずかしい


266:デフォルトの名無しさん
04/09/11 22:18:30
>>258
(process-send-string proc (string-make-unibyte string))
string-make-unibyte してちゃ日本語は無理だよな。
さて、どうするか

267:デフォルトの名無しさん
04/09/12 00:16:38
>>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)))


268:デフォルトの名無しさん
04/09/12 01:00:18
うおおお
sortがでけた

269:デフォルトの名無しさん
04/09/12 16:27:08
Corman Lispの作者のCormanさんから宣伝メールが来たよ。
Lispの処理系売って食ってくというのは苦労してるんかね。
とにもかくにも日本語がちゃんと扱えないことにはねえ。


270:デフォルトの名無しさん
04/09/13 16:15:43
前から思っていたんだけれど、
スペシャルフォームをファーストクラス・オブジェクトにすることはできない
だろうか?
スペシャルフォームを引数にとったり、関数の戻り値としたりできないだろうか?

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

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

271:デフォルトの名無しさん
04/09/13 16:32:46
>>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


272:270
04/09/13 16:37:59
ええー!Gauche って便利なのね。すごーい!

と言うか、なんで PetiteChezScheme だとできないのだろう??
何か不都合があるのでしょうか?
使えるほうが、絶対便利だと思うのだけど。

273:270
04/09/13 16:55:53
すると Gauche では、こんなこともできちゃうのでしょうか?

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

スペシャルフォームは、car の位置にきたときだけ機能するようにすれば
こういう書き方も ok だと思うのだけど。

274:デフォルトの名無しさん
04/09/13 16:56:18
もはやGaucheは、かつてgccがCじゃなかったくらいにschemeじゃない気がする。
gccの場合はしばらくしたら標準が追い付いてきたので、
schemeもあと十年くらい待てば>>270みたいのが標準で使えるようになるかもよ。


275:デフォルトの名無しさん
04/09/13 17:01:39
>>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……。


276:270
04/09/13 17:17:52
>>275
あれれ、残念。
shiro さん、もし見てたら、ご検討お願いします。

277:デフォルトの名無しさん
04/09/13 17:18:15
guile> ((lambda (x y) (x #f y)) or 3)
3

できました

278:270
04/09/13 17:20:20
>>277
おお!さすが何でもありの Guile!

279:デフォルトの名無しさん
04/09/13 19:01:09
それにしても、こんなに便利そうなのに、どうして標準になっていないのだろう?
何か問題があるのだろうか?

280:デフォルトの名無しさん
04/09/13 19:59:08
そりゃSchemeが便利ならなんでもありとは対極にあるような言語だからだろ


281:デフォルトの名無しさん
04/09/13 20:17:07
マクロの展開についての根深い対立が…。

282:デフォルトの名無しさん
04/09/13 20:32:55
夢の中で問題点を一つ思い付いた。関数はまず全部の引数を評価してしまうが、
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は遅いんだな……。


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




284:270
04/09/13 20:45:37
>>282
すばらしい!Guile のその挙動こそ、私が望んでいたものです。

>>283
それが、『Scheme手習い』の「lambdaは最高だ」に、スペシャルフォームを引数に
取れたら非常にシンプルに書けるような例が出ていたのです。
(実際はできないから、本では相互再帰を行って何とか解決していた)

285:270
04/09/13 20:48:12
>>282
Guile の実装はぜんぜん知りませんが、
きっとスペシャルフォームを実行するのは car の位置に来たときだけ、という
ルールでやっているのじゃないかなあ。

そんなに速度も落ちないのじゃないかと思うのだけど。

286:デフォルトの名無しさん
04/09/13 21:36:01
実行時に展開と評価時に展開じゃ速度にかなり違いが出るような気が。

287:デフォルトの名無しさん
04/09/13 21:41:43
"special formを実行する" のは構文を parseするときではないのか?

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

Haskellの世界にでもくれば shortcutなんかわざわざ意識しないでいいよ :-)


288:270
04/09/13 22:02:21
うー、そういう問題があるのですか…。

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

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

;関数を返す関数。引数に 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))


289:270
04/09/13 22:03:35
もしかして、Haskell のように遅延評価がデフォルトだと、
スペシャルフォームのほとんどは不要になるのでしょうか?

290:デフォルトの名無しさん
04/09/13 22:14:28
>>274
標準 (R5RS) では未定義あるいは実装依存とされている領域を利用しているだけだから
scheme ⊃ Gauche だよ

291:デフォルトの名無しさん
04/09/13 23:13:29
ふと気づいたのだけど、マクロもスペシャルフォームの一種だよね?
Guile って、マクロも実行時に展開しているんだろうか?
だとしたら、遅いのも道理だなあ…。

どなたかGuileユーザの方、確かめていただけませんか?

292:デフォルトの名無しさん
04/09/13 23:34:50
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 が返ってくるなら、マクロを実行時に展開していると思う。


293:デフォルトの名無しさん
04/09/14 00:00:24
>>292
Unbound variable: define-syntax
とか怒られた。

294:デフォルトの名無しさん
04/09/14 00:06:55
あれ?当然エラーは 2つ目の式で出たんですよね?
1つ目のdefine-syntax の式の実行で出たのではないですよね?

するとやはり Guile は他と同じで、パース時にマクロを展開するのかな?

295:293
04/09/14 00:14:21
>>294
ごめん。(use-syntax (ice-9 syncase))忘れてた。
2つめの式で
ERROR: invalid syntax my-or
って出た。

296:デフォルトの名無しさん
04/09/14 01:24:16
了解。いずれにせよ、マクロ展開は実行時ではなく、解釈時なのね。
どうもありがとう。

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

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

special form を first class として扱うためには、マクロ展開を実行時に行っても
構わないような、マシンパワーのあまりある時代を待つしかないのかもしれない。

297:デフォルトの名無しさん
04/09/14 01:28:42
まてよ。Gauche でも、マクロには別名は付けられないよね?
(define new-or my-or) は syntax error になると思う。

すると、ChezScheme のように、special form を一切拡張しないのが一番
現実的なのだろうか。何か寂しいなあ。

298:デフォルトの名無しさん
04/09/14 01:39:04
Gaucheではできる。Gaucheでは、コンパイル時に(手続き呼び出しではなく)
マクロだとわかるものならマクロ展開をしてくれるし、マクロの名前は
マクロそのものを返す。(define new-or my-or)も可能。

syntax classをapplicable objectにして、実行時に展開したら
おもしろいかも。evalが必要になるし、トップレベル以外の環境は
取得できないから無理だろうけどさ。

299:デフォルトの名無しさん
04/09/14 05:00:28
>>270
そういうのはマクロでやる。
実際、make-functionのコンパイル時にはs-formが構文かどうかは
わからないわけだから、コンパイラは ((make-function s-form) (cdr list0))
を評価してからs-formを呼ぶってコードを出すしかないじゃん。

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



300:270
04/09/14 10:38:48
>>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))))))))

そうしたら、マクロ展開が停止しないんです。再帰的定義なのに停止条件がないから。
この場合、どう書いたらよいのでしょうか?ヘタレですみません。

301:270
04/09/14 13:12:00
『On Lisp』邦訳 10 マクロのその他の落し穴 10.4 再帰(P81)を読んでみました。
思ったより、解決は難しそうです…。

302:デフォルトの名無しさん
04/09/14 15:30:55
>>300
> やっぱり Gauche はバランスがよく取れているということなのでしょうか。

つーより、事前にコンパイルするんじゃguileみたいな挙動は不可能じゃね?
S式をそのまま解釈実行するのでないと。当然その場合実行速度は遅くなる。


303:デフォルトの名無しさん
04/09/14 15:58:30
なんか似たような話を見たことあるなあ……と思ってたんですが、
これなんか参考になりませんか? Common Lisp だけど。

URLリンク(home.comcast.net)

304:デフォルトの名無しさん
04/09/14 16:14:46
>>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 ...))))







305:270
04/09/14 22:43:09
ありがとうございました。言われてみれば『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))

306:270
04/09/14 23:26:58
今回は本当に勉強になりました。
今まで、special form が first class でない理由がずっとわからなかったの
ですが、答えはこうだったのですね。「マクロがあるから」

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

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

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

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

ありがとうございました。

307:デフォルトの名無しさん
04/09/15 01:29:34
高尚なネタで盛り上がってるとろこスマン。
BKNL,TBNL,IMHO,UncommonWeb,AllegroServe+WebActions,CL-HTTPといろいろある
ウェブサーバ on CLなモノタチのなかでこのスレ住民のお勧めはどれなのか教えて欲しい。
できれば理由も。処理系はACLかCMUCLの予定です。

308:デフォルトの名無しさん
04/09/15 10:05:40
>>307
おれも知りたいな
ACL の WebAction はセミナー聞いただけだと
そう良くも悪くもなさげだった、ほとんど Apache Struts の焼直しって感じだけど
他のも Web 「アプリケーション」サーバーなのかしら?



309:デフォルトの名無しさん
04/09/16 00:57:02
スレの内容が高度すぎる…
初心者スレは良かった…

310:デフォルトの名無しさん
04/09/16 04:28:41
ちっとも高度じゃないよ。
分からないうちは飛ばしとけ。

311:デフォルトの名無しさん
04/09/16 10:42:55
>>309
大丈夫。あきらめなければそのうち、ちゃんとわかるようになるから。
シンプルなのが Lisp の身上。
スレの過去ログの、昔読んで分からなかったところが、少したつととても面白く
読めるようになります。経験者は語る。

-------------------
新山氏の日記に、久しぶりに Lisp のことが書かれている。
URLリンク(tabesugi.net)

新山氏は相変わらず冴えてます。読んで「うわー、そういう感じ、よく分かる」
と思った人も多いのではないだろうか。

312:デフォルトの名無しさん
04/09/16 13:59:44
>>306
> マクロでできることはほとんど高階関数でできてしまう

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

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

と書けばよい、ということじゃない?


313:デフォルトの名無しさん
04/09/16 15:44:06
>>311
>「うわー、そういう感じ、よく分かる」
Lisp側から見て? それともPython側から?
ちなみに俺はSchemeもPythonも好きで両方使ってるけど,
Lisp側の意見はあまり共感できないなぁ.(マクロまんせーには同意するけど)

314:311
04/09/16 15:56:34
>>312
確かに引数として与えたとき or は評価されないけれど、has-atom? の内部で
or ではなく、or に似た働きの関数になっちゃうでしょ? or に与えたい引数
の両方をまず評価してしまうから、リストを最後まで評価しないと止まらない。

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

315:312
04/09/16 16:42:23
>>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))

こんな感じでどう?もしかしてまた勘違いしてるかな


316:デフォルトの名無しさん
04/09/16 18:15:12
>>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で遅延評価など書いておれるか!」と言ってるけど
気持ちがわかったような気がする。やっぱり煩雑だよね、これ。

317:デフォルトの名無しさん
04/09/16 19:14:58
リストの評価が途中で止まるのは、いずれもspecial form である or のおかげ
なのだから、or をそのまま渡せるマクロのほうが、はるかに自然。

or に仕事をさせるために、lambda や delay で囲んで、引数の強制的な評価を
回避させなければならない高階関数は冗長。

318:デフォルトの名無しさん
04/09/16 19:23:34
細かい話だけど、それぞれ1個目の delay と force 、要らないじゃん。

319:デフォルトの名無しさん
04/09/16 22:43:03
special-formをfirst-classにするってことは,
実行時にマクロ展開を行わせることになるよね.
そうすると静的スコープがグチャグチャになるような,ならないような….
あぁ,メタメタしてワケ分からん.

ところで,暗黙のforceを実装した処理系ってある?
暗黙のforceを実装してれば,遅延評価版>>316とかは,delay一つでよくなる.

320:312
04/09/17 00:45:57
>>318
そうだね、 or の第一引数はかならず評価されることが決まってるから
delay する必要はないのか

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

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

に反論したくなっただけdeth。テヘ


321:デフォルトの名無しさん
04/09/17 09:16:08
>>320
> 以前 ruby の matz 氏が、マクロでできることはほとんど高階関数でできてしまう
> と言っていましたが、決してそうではないですね。

これ,orとかの評価を遅延させるためのマクロのことを念頭に置いてるんですかね.
「できる」と「やりやすい」は違うし,だいたい,できないこともおおいじゃん...

322:デフォルトの名無しさん
04/09/17 11:56:01
やりやすくないとやりたくない.

323:デフォルトの名無しさん
04/09/17 13:39:34
>>321
マクロでしかできないことってどういうものがありますか?
マクロは興味はあってもとっつきにくいなあと思っています。
教えてもらえるとイメージが湧くかも。


324:321
04/09/17 13:57:18
URLリンク(www.shiro.dreamhost.com)
マクロの応用方法を分類して解説しているので,参考になるのでは.

「宣言的コードにみせる」や「ミニ言語のうめこみ」あたりが
美しいマクロの使い方だとおもいます.

325:デフォルトの名無しさん
04/09/17 14:19:47
>>321
まさに去年の今頃、似たような話をしていた記憶が。懐かしい。
ちなみに matz 氏の発言ていうのはこの辺。
URLリンク(www.rubyist.net)

何となくだけど、matz 氏の意図しているところは
「dolist って for-each でいいじゃん?」ていう程度の話な気がする。
遅延評価がどうとか call-by-name がどうとかってところまでは風呂敷は広げてない感じ。

326:321
04/09/17 14:38:04
ああ,これって算符の記でやってた議論なんですね.しらなかった(赤面)
両者のスタンスの違いがよくわかりますた.


327:デフォルトの名無しさん
04/09/17 22:04:43
評価を遅延させるだけの目的でマクロを使うのはよくないと思う.
引数が評価されるかどうかが定義を見ないと判らないわけで,
むしろ可読性を損なっている気がする.
マクロはマクロを使わないとできないこと,例えばdefineを拡張して
パターンマッチできるようにするとか,そういう目的で使うべき.

328:デフォルトの名無しさん
04/09/17 23:35:35
Common Lisp使ってCみたくメモリ上のビット単位まで意識したコードって簡単に
書けますか? 書けるとしたらその方法が知りたいです。memory mapped I/Oの操作
みたいな低レベルな操作ができるのかな、ってのと、やっぱりそんな処理はCでヤレ、
そもそもLisp使ってやる内容じゃないだろ、って結論しかないのかを教えてくれるとうれしい。

329:デフォルトの名無しさん
04/09/18 01:26:48
素人でスマンが、Cで簡単に拡張ライブラリが書けるような
Lisp処理系を使う、って答えになるんじゃなかろうか。

330:デフォルトの名無しさん
04/09/18 01:33:48
最近の主なLisp処理系ならFFIでCのコードを呼べて楽よ。
>>328みたいなこともやればできそう。
でも分野的に、Cで書く方が直感的でメンテもしやすい気がしなくもないので、
そういうコードをCで書いてFFIで使うというのがいいんじゃないかい。




331:328
04/09/18 02:36:20
レスどうもです。やっぱりFFI使ってCで書くのが定石なんですね。
Cltl2眺めててbit-vectorのオブジェクトの存在するアドレスを物理メモリにマップできれば
もしかして・・・と思ったのですが違ったようです。LispMachineとかだとできたのかなぁ。
データの圧縮とかビットマップインデックスみたいに素のLispが提供していないメモリ上のデータ構造を
ゴリゴリ扱いたいなぁ、と思ったらLisperの取る道はFFIしかないんですかね。それともマクロで
抽象化してarray :element-type (unsigned-byte 32)の上で操作するのでしょうか。

332:デフォルトの名無しさん
04/09/18 03:06:04
物理メモリにmapするには、もひとつOSの助けも必要だと思われ。
Linuxはユーザ空間にmemory mapped I/Oをmapできたんだっけか。
ユーザ空間にI/OをmapするAPIと、具体的な仮想アドレスのreferenceを
取得できるAPIをFFIで書いたらできるのかな。


333:デフォルトの名無しさん
04/09/18 03:26:40
結局そういうインタフェース作ったとして問題は参照方法だろ
さすがにメモリ走査とかはポインタないと辛い
Cでやった方が全然楽だし速いよ

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

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

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

やっぱ記述量が割に合わない


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