[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 2chのread.cgiへ]
Update time : 03/26 12:58 / Filesize : 286 KB / Number-of Response : 995
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

CommonLisp Scheme Part11



1 名前:デフォルトの名無しさん mailto:sage [04/08/02 23:13]
過去スレ
Part1: piza2.2ch.net/tech/kako/987/987169286.html
Part2: pc.2ch.net/tech/kako/1002/10025/1002584344.html
Part3: pc.2ch.net/tech/kako/1008/10082/1008220265.html
Part4: pc.2ch.net/tech/kako/1016/10162/1016211619.html
Part5: pc3.2ch.net/tech/kako/1023/10230/1023091882.html
Part6: pc3.2ch.net/tech/kako/1031/10315/1031560687.html
Part7: ruku.qp.tc/dat2ch/0311/20/1042167213.html
Part8: pc2.2ch.net/tech/kako/1058/10582/1058263391.html
Part9: pc2.2ch.net/test/read.cgi/tech/1069594582/
Part10: pc5.2ch.net/test/read.cgi/tech/1075630259/

関連リンクは>>2-10あたり


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

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

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

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

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

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


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

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

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

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

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




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

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

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

249 名前:デフォルトの名無しさん mailto:sage [04/09/08 02:20]
slime 1.0
ttp://common-lisp.net/project/slime/

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




251 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [04/09/09 05:26]
今日はFranzセミナーですね。終わったら報告キボンヌ

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



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



257 名前:デフォルトの名無しさん mailto:sage [04/09/09 09:44]
gauche-sdl
michaelvess.com/text/index.html?section=code


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




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

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


261 名前:デフォルトの名無しさん mailto:sage [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
www.lispworks.com/reference/HyperSpec/Body/07_a.htm

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

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

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

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

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

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

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

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




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

267 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [04/09/12 01:00:18]
うおおお
sortがでけた

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


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

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

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

271 名前:デフォルトの名無しさん mailto:sage [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 mailto:sage [04/09/13 16:37:59]
ええー!Gauche って便利なのね。すごーい!

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

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

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

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

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


275 名前:デフォルトの名無しさん mailto:sage [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 mailto:sage [04/09/13 17:17:52]
>>275
あれれ、残念。
shiro さん、もし見てたら、ご検討お願いします。

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

できました

278 名前:270 mailto:sage [04/09/13 17:20:20]
>>277
おお!さすが何でもありの Guile!

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

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


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

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




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

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

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

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



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

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

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

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


288 名前:270 mailto:sage [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 mailto:sage [04/09/13 22:03:35]
もしかして、Haskell のように遅延評価がデフォルトだと、
スペシャルフォームのほとんどは不要になるのでしょうか?

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

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

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

292 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [04/09/14 00:00:24]
>>292
Unbound variable: define-syntax
とか怒られた。

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

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

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



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

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

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

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

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

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

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

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

299 名前:デフォルトの名無しさん mailto:sage [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 mailto:sage [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 mailto:sage [04/09/14 13:12:00]
『On Lisp』邦訳 10 マクロのその他の落し穴 10.4 再帰(P81)を読んでみました。
思ったより、解決は難しそうです…。

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

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


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

ttp://home.comcast.net/~bc19191/blog/040527.html

304 名前:デフォルトの名無しさん mailto:sage [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 mailto:sage [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 mailto:sage [04/09/14 23:26:58]
今回は本当に勉強になりました。
今まで、special form が first class でない理由がずっとわからなかったの
ですが、答えはこうだったのですね。「マクロがあるから」

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

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

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

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

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

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

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



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

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

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

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

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

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

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

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

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


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

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

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

315 名前:312 mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [04/09/16 19:14:58]
リストの評価が途中で止まるのは、いずれもspecial form である or のおかげ
なのだから、or をそのまま渡せるマクロのほうが、はるかに自然。

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

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

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

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

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

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

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

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


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

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

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

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


324 名前:321 mailto:sage [04/09/17 13:57:18]
www.shiro.dreamhost.com/scheme/wiliki/wiliki.cgi?Scheme%3a%a5%de%a5%af%a5%ed%a4%ce%b8%fa%cd%d1
マクロの応用方法を分類して解説しているので,参考になるのでは.

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

325 名前:デフォルトの名無しさん mailto:sage [04/09/17 14:19:47]
>>321
まさに去年の今頃、似たような話をしていた記憶が。懐かしい。
ちなみに matz 氏の発言ていうのはこの辺。
ttp://www.rubyist.net/~matz/20030915.html

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



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


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

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

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

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




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

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


333 名前:デフォルトの名無しさん mailto:sage [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;

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

334 名前:デフォルトの名無しさん mailto:sage [04/09/18 03:35:32]
餅は餅屋

335 名前:328 mailto:sage [04/09/18 03:55:28]
はぅあ。袋叩きにあってしまいましたな。記述量が割に合わないとかLisp向きじゃないよなぁ
とは思いながらも知らない世界があるかも程度の好奇心で聞いただけなのでした。

>>334 餅は餅屋
御意。いまも仕事でLispのコード書いてたんだけど、Lispで書いてるととにかく楽なんで
何でもかんでもLispで書けないかなとか思った私が阿呆でした。
どうでもいいけど、みんなこんな時間まで何やってんの?皆もデスマ?



336 名前:デフォルトの名無しさん mailto:sage [04/09/18 04:01:40]
Schemeで名前空間で名前を分類するようなことをしたいのですが、どういう方法を
取ればよいのでしょうか?
C++でnamespaceでモジュール全体を囲って名前の衝突が起きないようにして、
using namespaceで名前空間を使うというようなことです。
名前空間を階層化したりもしたいのです。


337 名前:デフォルトの名無しさん mailto:sage [04/09/18 04:22:51]
標準的な方法はないから
toplevelをletか何かで包んで必要な名前だけ外部に出すとか

(define proc1 #f)

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

あとは処理系依存だから、付属のマニュアルでも嫁






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<286KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef