[表示 : 全て 最新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あたり


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

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

338 名前:デフォルトの名無しさん mailto:sage [04/09/18 05:32:43]
>>328
>>338 の言う通り、やってできなくはないと思う。mapしたアドレス値を
取得するのと、そのアドレスにアクセスするプリミティブは処理系
依存になるが。だがCでポインタを扱いなれてると、Lispでのアクセスは
冗長だね。マクロが使えることはメリットだけど。



339 名前:デフォルトの名無しさん mailto:sage [04/09/18 09:28:32]
>>336
処理系依存でよければmoduleシステムやなんやらを使うのがいいでしょう。

どうしてもportableでやりたいなら、top levelの束縛を変更する関数を
マクロで置き換えて、ほげほげとか。
って、top levelの束縛をマクロにするのはR5RS的にはだめなんだっけか...



340 名前:デフォルトの名無しさん mailto:sage [04/09/18 10:40:21]
スペースで区切られたテキストが以下のようにあったとして
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)))

誰かアドバイスください・・・

341 名前:デフォルトの名無しさん mailto:sage [04/09/18 13:02:49]
縦読みデコーダでも作るの?


342 名前:340 [04/09/18 13:15:05]
>>341
そんな大層なものではなくて
練習用に書いているのですが・・・

上の例では3列と固定しているところを可変で
対応できるようにしたいのです
str1,str2,str3 とかやるのは格好悪いし・・
もっとすっきり書けませんかね?

343 名前:デフォルトの名無しさん mailto:sage [04/09/18 13:32:22]
下のコードはヒントにならない?
(mapcar #'list '(a b c d e) '(3 4 5 6 7))
=> ((a 3) (b 4) (c 5) (d 6) (e 7))



344 名前:340 [04/09/18 15:24:32]
>>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 になってしまうのでしょうか?

345 名前:デフォルトの名無しさん [04/09/18 16:18:32]
whileの返り値

346 名前:デフォルトの名無しさん [04/09/18 18:07:39]
(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が出てきたらやはり名前衝突を
起こしてしまう気がするのですが、私は何か勘違いして
いるのでしょうか。

347 名前:デフォルトの名無しさん mailto:sage [04/09/18 18:16:40]
>>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))


348 名前:デフォルトの名無しさん mailto:sage [04/09/18 18:45:50]
gensymはinternされない (システム内部の、名前からシンボルへの
対応表に登録されない) シンボルを作るので、このマクロの展開時に
作られるシンボル (#:G0031とか) と同じシンボルを外から与えることは
できない。(同じ名前にしてもシンボル自身は別オブジェクトなので
衝突しない)



349 名前:340 mailto:sage [04/09/18 18:56:21]
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 のように今度は再帰で考えて見ます



350 名前:デフォルトの名無しさん [04/09/18 19:24:40]
>>348
ああそうか!
` が付いて無いからマクロの展開時に (let) は消えるんですね
納得・・・ありがとうございました

351 名前:340 [04/09/18 19:48:28]
ようやく上手くいきました
良い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)))

知恵を下さった皆さん有難うございました
もっとエレガントにいけるとかあったら
ぜひ教えてください

352 名前:ミミ [04/09/19 10:40:16]
Scheme の継続と、Win32 API のウィンドウ プロシージャ コールバック
って、共存可能だと思いますか?

353 名前:デフォルトの名無しさん mailto:sage [04/09/19 11:07:15]
不可能な理由がなかったら可能だよ。

354 名前:& ◆TACpYgPjX6 [04/09/19 11:17:07]
それがよくわからないんですよ。
だって、OS 側でどんな処理をしているか分からないじゃないですか。

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

OS 側でスタック上のデータではない
グローバル変数をいじっていたとすると、
コンテキストがめちゃくちゃになって、
よくない気がするんです。

355 名前:デフォルトの名無しさん mailto:sage [04/09/19 11:26:55]
> OS 側でどんな処理をしているか分からない

分からない以上、可能だという確認ができないんじゃないか?

356 名前:ミミ [04/09/19 11:31:53]
いえいえ、今の私の知識ではわからないということなんです。
どなたか深い知識をご存知の方はいらっしゃらないかなと思いまして。

357 名前:デフォルトの名無しさん mailto:sage [04/09/19 11:33:02]
354の話で使いたい場面と、問題意識が少しわかったので
もう少し整理してから、その問題意識を中心に調べものしたらわかるのではないかな。
イベントハンドラまわりなんだよね。
;;; Windowsのことはよく知らないけど...


358 名前:& ◆TACpYgPjX6 [04/09/19 11:36:15]
実は Windows 専用 Scheme を作りたいと思っているんです。
特にシステム ハックをするためのツールを
Scheme でガンガン作りたいんですよねぇ。

コンセプトは
"Scheme as a better C."
"Scheme as a hacking tool."

359 名前:デフォルトの名無しさん mailto:sage [04/09/19 11:50:34]
で?



360 名前:ミミ [04/09/19 11:51:32]
協力してくれたらうれしい。
できたら使わせてあげるから。

361 名前:デフォルトの名無しさん mailto:sage [04/09/19 11:54:40]
面白そうではあるが,コールバックまで正常動作させようとすると
継続はおろかクロージャさえ厳しいだろうな…

362 名前:& ◆TACpYgPjX6 [04/09/19 11:56:17]
だいたいですね、Lisp 系の言語って、
どれもこれも Unix っぽいのがよくないと思うんですよ。
Perl や Python も同じなんですけど、
Java はちょっと違う感じ。

Windows みたいな素敵なシステムに、
Scheme みたいな素敵な言語があれば、
みんな幸せだろうなぁ、と思ってさ。

363 名前:ミミ [04/09/19 11:59:09]
すいません、どうしてクロージャが難しいのでしょうか。
何も OS が直接クロージャを呼び出すことは期待していないです。
間に C 関数をかませば問題ないですよね?

> 面白そうではあるが,
ありがとう。

364 名前:デフォルトの名無しさん mailto:sage [04/09/19 12:00:52]
PythonはMac出身じゃなかったっけ.
まぁ、それはともかく、Unixっぽいってどういうこと?

365 名前:デフォルトの名無しさん mailto:sage [04/09/19 12:13:05]
>>363
話の流れからすると,Win32APIを丸々wrapするんじゃなくて,
Cの関数を直接呼び出したりできる機構を用意しようってことだよね?

366 名前:& ◆TACpYgPjX6 [04/09/19 12:18:32]
一番大きなのは、コンソール (標準入出力) を前提としていること。

あと、いろんな 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 専用のライブラリを構築するほうが
ずっといいと思う。

367 名前:デフォルトの名無しさん mailto:sage [04/09/19 12:27:13]
うーん、Scheme.NETか?

368 名前:ミミ [04/09/19 12:28:34]
>>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 からのコールバックとして実装しなくてはならず、
その場合、継続と相性悪くないのかなぁ、とふと思ったのです。

369 名前:デフォルトの名無しさん mailto:sage [04/09/19 12:34:50]
>>366
> であれば、Windows 専用の Scheme 実装の上に
> Windows 専用のライブラリを構築するほうが
> ずっといいと思う。
そういうことは、既存Scheme処理系をWindowsに移植しようとして
挫折してからいうべきなのではないか。先人の知恵は偉大だよ。
;;; 挫折というのは移植者の能力不足のことではないよ。

あ、もしかして、scheracy?



370 名前:& ◆TACpYgPjX6 [04/09/19 12:37:25]
>>369
>あ、もしかして、scheracy?
え? Scheme ヤラシイ?
なんですかそれは。

371 名前:デフォルトの名無しさん mailto:sage [04/09/19 12:40:07]
>>367
だよね。他にもあるかも知れないけど、
.NETFramework をサポートする Scheme を開発するプロジェクト

ttp://radio.weblogs.com/0101156/stories/2002/03/19/tachy.html
ttp://www.cs.indiana.edu/~jgrinbla/index.htm

372 名前:デフォルトの名無しさん mailto:sage [04/09/19 12:45:12]
チョット前に出てたハンディスキームじゃダメなのか?

373 名前:ミミ [04/09/19 12:49:18]
>>371
情報ありがとうございます。一度よく調べてみます。

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

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

"as a hacking tool" ===> "cool and cute" ですよ?


374 名前:& ◆TACpYgPjX6 [04/09/19 12:55:32]
>>372
> チョット前に出てたハンディスキームじゃダメなのか?
むむ!
これ、なんだかよさげですね。
こんなのがあったんですね。
ちょっと今日の宿題にしてみます。
ありがとうございます!

375 名前:デフォルトの名無しさん mailto:sage [04/09/19 13:13:42]
おぇ

376 名前:デフォルトの名無しさん mailto:sage [04/09/19 13:17:42]
"as a hacking tool"
===> "as a hacking tool"

377 名前:デフォルトの名無しさん mailto:sage [04/09/19 14:24:34]
なんでハンドル二つ使って常時ageなんだ?

378 名前:デフォルトの名無しさん mailto:sage [04/09/19 14:34:01]
Cからのscheme呼出しの中で補足された継続のエクステントが無制限な処理系ってあるの?
GaucheでもCからのコールバックで補足されたもののエクステントはコールバック内に限定されるし

379 名前:デフォルトの名無しさん mailto:sage [04/09/19 15:02:33]
>>363
クロージャが難しいというよりはガーベジコレクションが難しそう.
Schemeで書かれた関数をWin32APIに渡して,コールバック関数として登録したとして,
その関数がいつまで使われるかはSchemeインタプリタ側では判別できないと思う.



380 名前:デフォルトの名無しさん mailto:sage [04/09/19 16:06:22]
>>377
1. 2ch が Netscape や Mozilla に対応していない。
2. よって、cookie に書き込まれた全角のハンドル名が化ける。
3. あわててハンドル名を入れなおすと、そのときは正しい名前で掲示板に
  書き込まれる。
4. 次に書き込むと、またハンドルが化ける。
5. 以下繰り返し。

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

常時 age については分からない。

381 名前:デフォルトの名無しさん mailto:sage [04/09/19 16:13:53]
>>380
> >>377
> 常時 age については分からない。
sage を知らない、だろうな。

382 名前:デフォルトの名無しさん mailto:sage [04/09/19 17:31:16]
> Windows みたいな素敵なシステムに、
ここんとこに賛同できないのは漏れだけなのか。s/Windows/MacOSX/だったら同意なんだが。

383 名前:デフォルトの名無しさん mailto:sage [04/09/19 17:42:53]
その部分は罠と判断した。

384 名前:デフォルトの名無しさん mailto:sage [04/09/19 17:53:10]
>>366
> 一番大きなのは、コンソール (標準入出力) を前提としていること。

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

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

ttp://www.kt.rim.or.jp/~qfwfq/rhiz-pi/
> 共有オブジェクト(Win32ではDLL)を動的にロードし、
> 中の関数をscheme コードから呼び出すことができる。
> さらにコールバック関数をscheme コードで記述できる。


385 名前:デフォルトの名無しさん mailto:sage [04/09/19 22:06:34]
DrSchemeって、一応他のエディタで編集してロードすれば、日本語表示できるみたいだな。
例えば、「あ」と言う文字のように二文字目が\と同じコードの場合には「あ\」と、\を余分にくっつけて
\\を\と認識させるという技を使わなくちゃいけないのが面倒だけど。

ランタイムDLLが必要になるがEXEも作れるようだし、俺の中ではDrScheme最強になりつつある。

386 名前:デフォルトの名無しさん mailto:sage [04/09/20 01:04:59]
gaucheでhtml解析するときって皆さんどうやってます?
saaxとかつかってます?
それとも自分で解析モジュールを書いちゃいます?

387 名前:デフォルトの名無しさん mailto:sage [04/09/23 02:10:26]
やっと cygwin + slib のインスコ完了したよ・・・
なんでこんなに疲れるんだろう

388 名前:デフォルトの名無しさん mailto:sage [04/09/23 11:27:01]
>>386 これは? 使ったことないけど。
www.neilvandyke.org/htmlprag/


389 名前:デフォルトの名無しさん [04/09/23 18:33:55]
gosh のload-path は add-load-path 以外に方法がないのですか?
毎回指定するの面度印ですけど・・・



390 名前:デフォルトの名無しさん mailto:sage [04/09/23 18:40:08]
>>389
command line optionの-I

391 名前:デフォルトの名無しさん mailto:sage [04/09/23 19:04:22]
>>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の様に内関数同士の再帰やコールバック関数にできない。)

ただね、いまんとここれ使って何がしたいって訳でもないので、そのまま放置状態。
とにかく機構そのものより、ラッパとか書くのが面倒すぎて、型変換も適当。

392 名前:& ◆TACpYgPjX6 [04/09/23 19:48:16]
>>391
> 継続はコールバックに跨らなければ問題ない。
> ちゃんとコールバックに制御を返却する当てがあるなら、たぶん問題なし。
> これに関しては結局セオリーみたいのは見つからなかった。

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

であれば、コールバック A から OS 側に戻ろうとする直前に、
あたかも、コールバック B から戻ったように見せかけることができれば、
いい感じがしませんか?


393 名前:ミミ [04/09/23 19:48:51]
具体的な実装方法は、コールバック クロージャ B の
サンクとなる C 関数において、
コールバック開始時の継続をキャプチャしておきます。
また、「コールバック B のコンテキストである」という記録を
g_callbackContext グローバル変数に保持しておきます。

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

少し問題なのは、コールバックの戻り値をどのように決定するかですが。。。


394 名前:デフォルトの名無しさん mailto:sage [04/09/23 20:27:26]
>>393
>問題は、ContA を呼び出し後に、コールバック A から呼び出し側に戻って
>しまうことが問題なのですよね。

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

根源的に何か勘違いしていないか?


395 名前:& ◆TACpYgPjX6 [04/09/23 20:40:39]
>>394
実装によってはできますよ。
スタックをすべて記憶する類の実装の場合です。

396 名前:デフォルトの名無しさん mailto:sage [04/09/23 20:48:45]
なんでそんなに継続にこだわってるんだ?
コールバックの中で補足した継続にそこまで意味があるとは思えないんだが。
具体的にどういう使いかたを想定しているの?

397 名前:ミミ [04/09/23 21:06:20]
いやー、コールバック ベースではない普通の Scheme コードの場合
(C でいう main() プログラム)、継続はどこで作成されたものであっても
自由に使えますよね。

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

継続を1つのコールバック内に閉じ込めて使用しなければならないという
この窮屈さを解消したいだけなのですけど。。。

398 名前:ミミ [04/09/23 21:07:40]
すいません、間違い。
× で呼び出されたかを覚えていないとだめですよね。
○ で作成されたかを覚えていないとだめですよね。


399 名前:デフォルトの名無しさん mailto:sage [04/09/23 21:10:25]
いいかげんsageてくんないかなあ・・・



400 名前:デフォルトの名無しさん mailto:sage [04/09/23 21:22:30]
こんなことでぐだぐだ言ってないで、さっさと処理系書いてみれ。
コールバックをまたぐ継続が動かないことくらいすぐ分かるよ。

401 名前:ミミ [04/09/23 21:37:21]
>> 400
いや、私がいいたかったのは、そうじゃないんですよぉ。。。
おこんないでくださいよぉ。。

402 名前:デフォルトの名無しさん mailto:sage [04/09/23 21:41:42]
具体的に 「こういう使い方すると非常に便利だから絶対使いたい」 というわけでもないのに、
処理系云々の前段階げグダグダいっても意味無いだろ。
実装するにはいろいろ難しい問題があり、汎用的なものにすることは不可能なんだから、
要求が出る前から考えたって良い解法が出るわけがない。
あと、いいかげんsageろ知障。

403 名前:デフォルトの名無しさん mailto:sage [04/09/23 21:43:55]
くれぐれもshiroさんとこ行ったりして迷惑かけるなよ

404 名前:デフォルトの名無しさん mailto:sage [04/09/23 21:52:20]
汎用的に実装するのはまず無理だろうし,できたとしても
OS側の継続(変な言い方だけど)が戻らないんじゃ意味無し.
が,絶対に無理かと問われると断言できないのが歯痒いというか何というか.

405 名前:ミミ mailto:sage [04/09/23 22:02:04]

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

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

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

> あと、いいかげんsageろ知障。
すいません、やっと意味が分かりました。m(_ _)m


406 名前:デフォルトの名無しさん mailto:sage [04/09/23 22:22:17]
> コールバック A から OS 側に戻ろうとする直前に、
> あたかも、コールバック B から戻ったように見せかけることができれば、
この時点でOS側の継続は戻ってないと思うんだが

そもそもOSがコールバック関数を呼ぶってのは言わば見せかけであって,
実際にはプロセス間通信なんかが絡んでるの判ってる?

407 名前:デフォルトの名無しさん mailto:sage [04/09/23 22:26:21]
>>406
Windows素人は黙ってて欲しいなあ・・・

408 名前:ミミ mailto:sage [04/09/23 22:31:33]
>>406
たぶん、私の意図を誤解されています。
実際に OS 側の継続を戻す Scheme 実装系はありますよ。

409 名前:デフォルトの名無しさん mailto:sage [04/09/23 22:33:06]
OS のコールバックを跨ぐ事を前提にしているのに、
Scheme 側で生のスタックを使おうとしているのが、
根本的な設計ミスだろ?

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

それを理解せずにスタックに拘る奴は愚かと言う他はない。




410 名前:デフォルトの名無しさん mailto:sage [04/09/23 22:35:34]
>>408
> 実際に OS 側の継続を戻す Scheme 実装系はありますよ。

それはどの OS 上のどの実装系?
OS 側のサポートが無い限り setjmp/longjmp 以上のことができるとは思えないんだが。

411 名前:ミミ mailto:sage [04/09/23 22:45:10]
> 409
> OS のコールバックを跨ぐ事を前提にしているのに、

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

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

スタックを記録するタイプの実装を行っている SCM は、
Mac, Win, Linux, BSD, Solaris, AIX, HP-UX, OS/2,
DOS, Amiga, Atari など多くの OS に移植されています。
これほど汎用的に使える手法を"たまたま"と表現することはできないでしょう。


412 名前:デフォルトの名無しさん mailto:sage [04/09/23 22:54:28]
>私がやりたいのは、いかに継続をコールバックというしがらみから解放させたように
>見せかけるか、という手法なんですよ。
で、そう見せかけるためには、実際にはコールバックをまたぐ必要があるんだろ?

>これほど汎用的に使える手法を"たまたま"と表現することはできないでしょう。
"たまたま" の意味を取り違えているな。
レジスタに 0 をセットのには、たまたま XOR が使えるけど、
123 をセットする為には、どんなにビットをいじくりまわしても
無理。素直にロード命令を使っとけって事。


413 名前:デフォルトの名無しさん mailto:sage [04/09/23 22:55:51]
> ですから、私はコールバックをまたぎたいんではないんですって。
まず,「コールバックを跨がなければ問題なく継続を扱える」のは
>>391さんの言う通り問題ない.
>>392の発言はどう読んでも「コールバックを跨ぎたい」という風にしか
読み取れないんだが.
> いかに継続をコールバックというしがらみから解放させたように
> 見せかけるか、
もう少し具体的に書いてくれ.これでは全く意味不明.

414 名前:デフォルトの名無しさん mailto:sage [04/09/23 23:00:38]
なんか変なやつが増えた?
具体的には412だけどさ・・・
おねがいだからこれ以上変なスレにしないでね(苦笑

恐らくミミが言ってるのはschemeで擬似的な継続を作ってやりすごそうって事だよな?
その偽の継続と、OS側の本物の継続はかならずしも一致しなくていい。


415 名前:デフォルトの名無しさん mailto:sage [04/09/23 23:03:01]
つまりschemeコード上で破綻してなければどんな手段の継続であるうとかまわない、
最終的にプログラムを終了させたときにOS側の継続と一致していれば良い、
って事だと思う。

416 名前:デフォルトの名無しさん mailto:sage [04/09/23 23:05:21]
だからコールバックに突入してそのままルートの継続呼び出して戻ってきても、
OS側の本物の継続はまだコールバックの中、ってこともありえる。

417 名前:デフォルトの名無しさん mailto:sage [04/09/23 23:11:02]
>>416
言ってることは分からなくもないが,別に疑似的な継続なんて持ち出さなくても
「コールバックを跨がなければ問題なく継続を扱える」
方法はあるわけで.

418 名前:デフォルトの名無しさん mailto:sage [04/09/23 23:17:24]
で,コールバックを跨ぐために疑似的な継続を持ち出してみたものの,
どのみちOS側の継続は戻せないので意味ないじゃん…という感じ.

419 名前:デフォルトの名無しさん mailto:sage [04/09/23 23:19:33]
別にOS側の継続戻す必要ないよ



420 名前:デフォルトの名無しさん mailto:sage [04/09/23 23:23:51]
おまいらちょっと用語の整理が居るんじゃないか?
おれは理解が追いついていないから何もできんですまんが


421 名前:デフォルトの名無しさん mailto:sage [04/09/23 23:26:00]
>>419
WM_* のコールバック中に継続を保存し、それを再開できるとでも?






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

前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