LISP Scheme Part4
レス数が950を超えています。1000を超えると書き込みができなくなります。
0001デフォルトの名無しさん
NGNGPart1: http://piza2.2ch.net/tech/kako/987/987169286.html
Part2: http://pc.2ch.net/test/read.cgi/tech/1002584344/
Part3: http://pc.2ch.net/test/read.cgi/tech/1008220265/
リンクは>>2-10のどこか
0002デフォルトの名無しさん
NGNG日本Lispユーザ会(日本語)
http://jp.franz.com/jlug/index.html
ここにかなりの情報があります。
プログラミング言語Scheme(日本語)
http://www.sci.toyama-u.ac.jp/~iwao/Scheme/scheme.html
Schemeの人はまずここを見ましょう。
Lisper への道(日本語)
http://www.geocities.co.jp/SiliconValley-Oakland/1680/rakup.html
判りやすいLISP入門サイト
Schemeへの道(日本語)
ttp://www.stdio.h.kyoto-u.ac.jp/~hioki/gairon-enshuu/SchemeNotes/scheme.html
慶応の授業のページ・記号処理プログラミング 2001
http://buri.sfc.keio.ac.jp/lisp/menu.html
Practical Scheme(日本語)
http://www.shiro.dreamhost.com/scheme/index-j.html
「普通のやつらの上を行け」など、興味深い文書があります。
SICP(英語)
http://mitpress.mit.edu/sicp/full-text/book/book.html
「計算機プログラムの構造と解釈」の原書です。
全てオンラインで読めます。
Scheme Hash(英語)
http://okmij.org/ftp/Scheme/index.html
John McCarthy's Home Page
http://www-formal.stanford.edu/jmc/
LISPの生みの親、J・マッカーシーのページだそうです。
お隣りのプログラマ板のLISPスレのログです。
http://mentai.2ch.net/prog/kako/963/963134110.html
0003デフォルトの名無しさん
NGNGCommon Lisp the Language, 2nd Edition(英語)
http://www.cs.cmu.edu/afs/cs.cmu.edu/project/ai-repository/ai/html/cltl/cltl2.html
CommonLispの仕様書です。
アルゴリズム言語Schemeに関する第五改訂報告書 R5RS(日本語)
http://www.sci.toyama-u.ac.jp/~iwao/Scheme/r5rsj/html/r5rsj_toc.html
http://www.biwa.ne.jp/~mmura/scheme/tspl.html#r5rs
日本語訳はここ以外にもあるそうです。
Scheme Requests for Implementation SRFI (英語)
http://srfi.schemers.org/
Scheme Frequently Asked Questions (英語)
http://www.schemers.org/Documents/FAQ/
0004デフォルトの名無しさん
NGNGSchemeで書かれた正規表現ライブラリ
ttp://www.cs.rice.edu/~dorai/pregexp/pregexp.html
SICPの回答集
http://www.melt.kyutech.ac.jp/~gogogo/sicp_ex/
http://pluto.aurorasd.co.jp/~mkama/sicp/
http://www.ipl.t.u-tokyo.ac.jp/sicp/solution.root.html
http://www.sampou.org/scheme/sicp/answer/
以上、手抜きですまん。
0005デフォルトの名無しさん
NGNGhttp://www4.ocn.ne.jp/~inukai/scheme_primer_j.html
オンラインで読める
0006デフォルトの名無しさん
NGNGSmalltalk スレで、Smalltalk のリフレクションは Lisp 系起源という話が
あったのですが、これって Common Lisp とかでしょうか?
Scheme にもありますか?
0007デフォルトの名無しさん
NGNG0008デフォルトの名無しさん
NGNGってただ言いにきただけ。scheme は何でもできて(・∀・)イイ!!みたいな意見
を前スレで見たので(実は難しくてあんまり読んでないけど) 楽しみ。
0009デフォルトの名無しさん
NGNG0010デフォルトの名無しさん
NGNGCommonLispで同型関数ありませんか?(関数名を参考にしたいので)
;先頭からn番目までのリストをコピーして返す
(define (list-head l n)
(let loop ((l l) (n n))
(if (zero? n)
tail
(cons (car l) (loop (cdr l) (- n 1))) )))
;リストがn以上の長さであれば#tを返す
(define (nlength? n l)
(if (zero? n)
#t
(if (pair? l)
(nlength? (- n 1) (cdr l))
#f)))
;n個引数ずつ処理するmap
(define (mapn n proc l)
(let loop ((x l))
(if (nlength? n x)
(cons (apply proc x) (loop (list-tail x n)))
'())))
;n個引数ずつ処理するmap。
;引数はコピーされるので可変個procに対してのapplyも安心
(define (mapnc n proc l)
(let loop ((x l))
(if (nlength? n x)
(cons (apply proc (list-head x n)) (loop (list-tail x n)))
'())))
;使い方
>(mapn 3 (lambda x (apply + x)) '(1 2 3 4 5 6))
=>(21 15)
>(mapnc 3 (lambda x (apply + x)) '(1 2 3 4 5 6))
=>(6 15)
0011デフォルトの名無しさん
NGNGsubseq
> ;リストがn以上の長さであれば#tを返す
nthcdr
0012デフォルトの名無しさん
NGNGcvs でとってきた 1.7 なんですけど。これって make 失敗とかですか?もと
もとないんですか?
0013デフォルトの名無しさん
NGNGScheme の良いところは、言語仕様を覚えるのが楽って事かな。
あとはマクロか。これがデカい。タイプ量が減るので最高。
ライブラリは適当に出回ってるのでも使って頂戴。
00148
NGNGでも slib が使えるようにならないなぁ。インストールばっかりやってると時
間がもったいないから slib は後まわしで scheme 覚えよ。
0015デフォルトの名無しさん
NGNGguileのinfo読めば書いてあるのに。
0017デフォルトの名無しさん
NGNGscheme は「関数型(?)」なのに「手続き」
なんかおもしろいね。間違ってたらツッコミよろしく。
0019デフォルトの名無しさん
NGNG前者は手続きを含むプログラムで言う所の「関数」
後者は写像の意味の「函数」の一般的な表記
ちょとちがう。
0020デフォルトの名無しさん
NGNGslibのパスを設定すれば何とかなるんでない?
俺は試してないけどね。
0021デフォルトの名無しさん
NGNGhttp://www.gentei.org/~yuuji/elisp/
http://www.cs.indiana.edu:800/LCD/cover.htm
http://www.anc.ed.ac.uk/~stephen/emacs/ell.html
http://www.geocities.co.jp/SiliconValley-Oakland/1680/xyzzy_lisp.html
xyzzy で勉強したいと思ってます。
おすすめの書籍なんかもあったら教えてください。
0022めりっさ P マッカ−
NGNGとったんだろう。気になって夜もねむれません。教えてセソセイ!
0023デフォルトの名無しさん
NGNGC言語は解説してるページもけっこうありそうなので、それを参考に勉強していこうと思ってのですが、
無理です......
やっぱり解説書を買うべきでしょうか。
0024デフォルトの名無しさん
NGNG逝ってよし
誤爆は無視して 行きましょう
0025デフォルトの名無しさん
NGNGxyzzyはEmacs LISPじゃないょぅ
0026デフォルトの名無しさん
NGNG0027デフォルトの名無しさん
NGNG俺は「リスト遊び」読んでから、URL の1個目の人が書いてる「やさしい
Emacs-Lisp 講座」を読んだよ。「やさしい...」読んだら人のソースとかも読
めるようになる...かな?俺も勉強中。
00298
NGNGgauche で slib 使えてる人教えてください。
Gauche-eucjp-0.5.2-1 の rpm なんですが、/usr/local/silb から slib を探
しているようなので、ln -s /usr/share/slib /usr/local/slib とシンボリッ
クリンクしました。それから gauche を起動すると、
gosh> (use slib)
*** ERROR: no such module: srfi-1
Stack Trace:
_______________________________________
0 (%require feature)
At line 34 of "/usr/share/gauche/0.5.2/lib/gauche-init.scm"
のようになります。srfi-1 を探すと
/usr/share/slib/srfi-1.scm
/usr/share/gauche/0.5.2/lib/srfi-1
というのが見つかるのですが。どうしたらいいんでしょ。
003121
NGNGそうなんですか・・! Emacs Lisp ⊂ Common Lisp だと思ってました。
そういえば、xyzzy は Common Lisp だとどこかで読みました。
Emacs Lisp と Common Lisp、とりあえずどちらを学ぶのが
良いのでしょうか。
より一般的にエディタに使われている方を学びたいと考えてます。
つまり、どちらの言語でライブラリを書くと、より多くの人に
(特に英語圏の方に)使ってもらえるでしょうか。
0032デフォルトの名無しさん
NGNG0034デフォルトの名無しさん
NGNGEmacs Lisp だけ覚えても、良いプログラムが書けるとは思えない。
まずは Common Lisp か Scheme で修行して、Lisp の本質を勉強する
事をオススメする。
003721
NGNGあ、あなたのレス見逃してました。すみません;
http://www.gentei.org/~yuuji/elisp/
とりあえずここを保存してじっくり読んで見ます。
良さそうだったら、書籍も購入してみます。
>>34
半分はそのつもりです。もう半分は、まぁ自分のためです。
0038デフォルトの名無しさん
NGNG激しく激しく外出だが、
ftp://ftp.ascii.co.jp/pub/GNUの
emacs-lisp-intro-jp, emacs-20.xも忘れるな!
0040デフォルトの名無しさん
NGNG0041デフォルトの名無しさん
NGNG0042デフォルトの名無しさん
NGNGscheme 特集あるの?立読みしに逝こ。
0043デフォルトの名無しさん
NGNGそんなたいそうなもんじゃない
単なる書評
Great !っていう内容の
0044デフォルトの名無しさん
NGNGおもしろい?
0045デフォルトの名無しさん
NGNG0046デフォルトの名無しさん
NGNGもしscheme特集やるとして、何載せるんだ?
どうせCマガのことだからlambdaとかtailrecurseみたいな
初歩的な事しかやらないだろ。
0047デフォルトの名無しさん
NGNGあってる? 修行が足りない?
(define (fibo num)
(define (loop n p1 p2)
(cond ((= n 0) 1)
((= n 1) 1)
((= n 2) (+ p1 p2))
(else (loop (- n 1) (+ p1 p2) p1))))
(loop num 1 1))
0048デフォルトの名無しさん
NGNGそれはやっぱアサインメントを使用しないで
アルゴリズムを構築するってことの妙味を伝えるんじゃないかな?
0050デフォルトの名無しさん
NGNG0051デフォルトの名無しさん
NGNG005251
NGNG0053デフォルトの名無しさん
NGNG0054デフォルトの名無しさん
NGNG0055デフォルトの名無しさん
NGNGあとは「より良いライブラリ」についての議論ぐらいじゃないの?
0056デフォルトの名無しさん
NGNGって言うけど、良く判らない。クラスの内部にアクセスする手段というのが、
メソッドの一つの役割ですよね。メソッドをクラスの外で宣言できるという
事はオブジェクトの隠蔽と矛盾しないのでしょうか?
って、自分で調べてみろって? そうします・・・。
0057デフォルトの名無しさん
NGNGこれといったものがないんだよね。人によって定義が違うわけ。だ
から、ある人にとって「こんなのオブジェクト指向じゃない!」と
言えるものが、ほかの人にとっては「まさにこれこそがオブジェク
ト指向だ!」となることもあるわけ。
メソッドの定義を隠蔽するかどうか、アクセス制御を提供するかど
うか、といったあたりはOOPLによってかなり幅のある部分ですよね。
0058デフォルトの名無しさん
NGNG流行を追いかけて Smalltalk と Java をかじった私としては、とても新鮮です。
Smalltalk と Lisp は歴史上、非常に縁近いと聞いていたので尚更です。
ちなみに >>56 はこの文書を読んだ感想です。
Schemer's way
http://www.shiro.dreamhost.com/scheme/docs/schemersway-j.html
0059デフォルトの名無しさん
NGNG特に盛りあがる必要なし
0060デフォルトの名無しさん
NGNGLISPやSchemeではオブジェクトやメソッドとかの隠蔽って
自然に出来ると思うけど?
特にこれといったインターフェースを使え、とか強要されて
るわけでもないし、制限も別に無いんで、頭やらかい人じゃない
と逆に使いづらいのかも。
0061デフォルトの名無しさん
NGNGそれと「メソッドがクラスに従属していない」のは
CLOSみたいなマルチメソッドを採用してるパッケージだと思う。
もちろん、C++やJava風の、クラスに垂れ下がるメソッドを持つ
形式のパッケージもあるよ。
0062デフォルトの名無しさん
NGNGくわしい人解説プリーズ。
0063デフォルトの名無しさん
NGNGCLOSのディスパッチ方法は・・・
最初に、ある名前に対して
「この名前をメソッド(=総称関数)として使用する」
と宣言する。(必ずしも名前を定義する必要はなく、lambdaと同様に無名メソッドも定義できる。)
するとメソッドディスパッチを行うオブジェクトが生成され、その名前に関連付けされる。
そのオブジェクトはメソッド毎のクラス階層と依存関係を保持していて、
新しいメソッドが定義されると、その依存関係を更新する。
メソッド呼び出しで、ディスパッチオブジェクトが引数に与えられた
各オブジェクトのクラスを比較していき、クラスが一致するか、
または与えられたオブジェクトがそのクラスの派生型である
メソッドを選択して適用する。
0064デフォルトの名無しさん
NGNG名前よりもむしろ引数型の組み合わせが重視される。
ローカル宣言もできるので、名前を外部に公開しなければ
隠蔽の意味にもなるでしょ。
0065デフォルトの名無しさん
NGNG0066デフォルトの名無しさん
NGNGあった) ところで、
scheme の「手続き」は closure で、
closure とは「環境」のついてくる「(Cでいうような)関数」で、
「環境」とはその時点で存在する変数とその値、手続きなどの alist (のようなもの)
っていう理解であってる?間違ってたら指摘プリィズ。
0067デフォルトの名無しさん
NGNG0068デフォルトの名無しさん
NGNG(define (table '())
(apush 'これが 'alistや! table)
(assq 'これが table)
=>(これが . alistや!)
0069デフォルトの名無しさん
NGNG「強力な手法」とのこと。
やっぱり、構文の再構成に使用するデータ構造はリスト構造が最適なのでしょうか。
それとお聞きしたいのですが、
LISPと数式処理、LISPと有限群論について何か良い本、Webページはないでしょうか。
0070デフォルトの名無しさん
NGNG> LISPと数式処理、LISPと有限群論について何か良い本、Webページはないでしょうか。
http://sal.kachinatech.com/A/1/ なんかあさったらどう?
0071デフォルトの名無しさん
NGNGhttp://www.shiro.dreamhost.com/scheme/wiliki/wiliki.cgi?c=a&l=jp
0072デフォルトの名無しさん
NGNG*** ERROR: no such module: srfi-1
Stack Trace:
_______________________________________
0 (%require feature)
At line 34 of "/usr/share/gauche/0.5.2/lib/gauche-init.scm"
なんでこうなるんだよう。教えてくれよう。
SCHEME_LIBRARY_PATH 設定したのにだめ。
007372
NGNGslib 使えなくても多分問題はないんだけど...気になる。
007472
NGNG(use srfi-1) (use srfi-2) .... (usr slib)
ってひたすらやったらエラーは出なくなったけど...
(use slib) だけでできるってマニュアル書いてあったから本当は自動でやっ
てくれたりするんじゃないの?
0075デフォルトの名無しさん
NGNG複雑な構文もない。
演算子もない。よって優先順位もない。
書いた文はそのままリストになるし。
リストをevalに書ければ評価される。
非常にわかりやすい。
カッコ付けるだけで、なんでもできる気がする。
0076デフォルトの名無しさん
NGNGと問われたら、俺は間違い無くLISPと答えるだろう。
つーかFORTHわけわからん。
LISPが一貫して
(<関数|構文> 引数)
なのに対し、
FORTHは暗黙のスタック操作も含まれるため、
引数 <関数|構文>
だけでは済まされない事が、問題を複雑化してる様に思う。
コードを読んでも、そのときスタックに何が積まれている(べきな)のか、
俺にはさっぱりわからないのだ。
0077デフォルトの名無しさん
NGNG0078デフォルトの名無しさん
NGNG処理系実装者にとって優しい言語だと思われ。
0079デフォルトの名無しさん
NGNGLispもFORTHほどじゃないが処理系実装者にとって優しい言語だと思う。
0080デフォルトの名無しさん
NGNG0081デフォルトの名無しさん
NGNG結局今月は出ない模様。
http://www.pearsoned.co.jp/washo/nbindex_chg.html
0084デフォルトの名無しさん
NGNG学校の授業でDrScheme使うのか。
課題がPICコンパイラつーのは面白そうだな。
0085デフォルトの名無しさん
NGNG0086デフォルトの名無しさん
NGNG訳本で未定ってどういうこと?
まだ翻訳が終わってないのか、
金の問題なのか。
後者だったらやだなあ・・
0087デフォルトの名無しさん
NGNGfluid-letって初出どこだったかな。
define-macro版とsyntax-rule版がを見かけたことあるけど。
そういや、fluid-let内で継続脱出があった場合、
どういう扱いになるか、誰か知ってますか?
0088デフォルトの名無しさん
NGNGSlib にあったよ。チラっと見たら、dynamic-wind 使ってました。
0089デフォルトの名無しさん
NGNGどっかから持ってきたやつをちょっと修正したもの。
R5RSのdynamic-windが必要。
この実装だと継続脱出が起こると前の状態に戻る。
(define-macro fluid-let
(lambda (xexe . body)
(let ((xx (map car xexe))
(ee (map cadr xexe))
(old-xx (map (lambda (ig) (gensym)) xexe))
(result (gensym)))
`(let ,(map (lambda (old-x x)
`(,old-x ,x))
old-xx
xx)
(dynamic-wind
(lambda()
,@(map (lambda (x e)
`(set! ,x ,e))
xx
ee))
(lambda() ,@body)
(lambda()
,@(map (lambda (x old-x)
`(set! ,x ,old-x))
xx
old-xx)))))))
0090デフォルトの名無しさん
NGNG0092デフォルトの名無しさん
NGNGイルには何を書いてますか?
0093デフォルトの名無しさん
NGNG自作が多いと思われ。
1)最低限の実装以外は全部schemeマンセー
2)可能な限りCやASMで組み込み症候群
の2派が存在すると思われ。
その中でもEXE作れる処理系はごくわずかと思われ。
0094デフォルトの名無しさん
NGNG``Why functional programming matters''
(ttp://www.cs.chalmers.se/~rjmh/Papers/whyfp.html)
という論文を読んだんですけど、
lazy evaluation が非常に重要だという話になってました。
scheme などは lazy list しかないので
妥協的だとしていましたが、
scheme マンセーなみなさんとしてはどう思いますか?
009695(88)
NGNG009788
NGNG>>94
lazy list の説明に、
A list which is built using a non-strict constructor.
(non-strict なコンストラクタを使って構築されるリスト)
ってあるんだけど、Scheme は strict じゃないの?
0098デフォルトの名無しさん
NGNGa non-strict constructor → delay
"un-evaluated objectをconstructする。"
0100デフォルトの名無しさん
NGNGなぜ関数プログラミングは重要か
ttp://www.sampou.org/haskell/article/whyfp.html
ってHaskellな人の文章だからねー
あんまり信用しないほうが良いのでは?
Scheme:LazyEvaluation
ttp://www.shiro.dreamhost.com/scheme/wiliki/wiliki.cgi?Scheme%3aLazyEvaluation&l=jp
0101デフォルトの名無しさん
NGNG納得できる内容なら信用すれば良い。
(すごいとは思ったけど何処まで重要なのか私には和歌欄……)
0102デフォルトの名無しさん
NGNGこれを読むまでHaskellがどうして遅延評価にこだわっているのか、わか
らなかったし。
Schemerとしては、リスト構造や高階関数の価値がわからないプログラマ
に対して「こんな良いものがわからないなんて...」という気分を持って
いますから、Haskell派の方々が遅延評価について同じような気持ちを
抱いているであろうことはわかりました。ただ、Haskellは僕にはわけが
わからないんで、しばらく使う気はありませんけれど。
0103デフォルトの名無しさん
NGNG「遅延評価が重要だ」が先にくるんじゃなくて、作用順序に依存しないコード
の方が保守性が良くなるんじゃないか、って考えが元なんじゃないかと。
haskellはそれを体現してみせたわけだけど、結局、
モナドなんかはやりすぎって感じで、本末転倒な気がするのは俺だけでしょうか。
0104腰の曲がったおじいさん
NGNG0105BASICER
NGNG(cond
[empty? (l) 0]
[else (+ 1 (length (rest l)))]))
cond: clause is not in question-answer format
>
ランゲージレヴェルスエクザンプルの1ページ目に載ってた関数を実行したら
こうなったDrSchemeをうかつにDLしたが、サパーリちんぷんかんぷん
誰か乞うアドバイス
>>104
C++は今がやりすぎだね(w
0106デフォルトの名無しさん
NGNGsetpperつかったら?
(length (1 2 3 4))とかやってみてみそ
0107デフォルトの名無しさん
NGNG(+ 1 length(2 3 4))
(+ 1 (+ 1 length(3 4)))
(+ 1 (+ 1 (+ 1 length(4))))
(+ 1 (+ 1 (+ 1 (+ 1 length()))))
(+ 1 (+ 1 (+ 1 (+ 1 0))))
=4
0108BASICER
NGNGえっ?
> (length (1 2 3 4))
illegal application: first term in application must be a function name
> (length (1 2 3 4))
(+ 1 length(2 3 4))
(+ 1 (+ 1 length(3 4)))
(+ 1 (+ 1 (+ 1 length(4))))
(+ 1 (+ 1 (+ 1 (+ 1 length()))))
(+ 1 (+ 1 (+ 1 (+ 1 0))))
illegal application: first term in application must be a function name
>
こりゃだめだ!!
DrSchemeが嫌いになりそ(@_@);
0109デフォルトの名無しさん
NGNG0111107
NGNG>> (length (1 2 3 4))
>quote付いてないよ
う、初歩的しょぼいミスー。すまぬ
(length '(1 2 3 4))だね
0112BASICAR
NGNGquote: misused: '(1 2 3 4) is not a symbol
>
出鼻でつまづいたのはDrSchemeが始めてだす〜
0113BASICAR
NGNGDrSchemeはアンインストールします。
皆さんありがとうございました。
0114デフォルトの名無しさん
NGNG(define (mylength l)
(cond
((empty? l) 0)
(#t (+ 1 (length (cdr l))))
)
)
(mylength (list 1 2 3 4))
lengthは駄目だって。予約済みだから。
>> (length '(1 2 3 4))
>quote: misused: '(1 2 3 4) is not a symbol
このエラーはねー 「リストと quote 」
ttp://www.edu.cs.kobe-u.ac.jp/Enshu6/2000/scheme_web/sexpr_quote.html
みてみそ。
ただしBiggner modeじゃないとStepperは使えない
0115デフォルトの名無しさん
NGNG0116デフォルトの名無しさん
NGNG英語発音とずいぶんずれてるような気がするけど。
0117デフォルトの名無しさん
NGNG0119デフォルトの名無しさん
NGNG0120デフォルトの名無しさん
NGNG0121デフォルトの名無しさん
NGNGhttp://www.amazon.co.jp/exec/obidos/tg/detail/reviews/-/english-books/0262011530/ref=ed_er_dp_1_1/250-7898109-1920242
0122デフォルトの名無しさん
NGNGなぁと。4000円くらいなら買うけど8000円だとためらうなぁ。
0123デフォルトの名無しさん
NGNGそんなに日本語訳ひどいかなぁ? 少し特徴のある訳し方だとは思うけど、
表面的な意味は十分理解できるよ。
0125デフォルトの名無しさん
NGNGまだ全然なんですが、Schemeって3つ以上の分岐ってどうやるのか疑問。
いわゆるelseifです。
if文の中にif文ネストするのもエラーって言われたし。どうすんでしょ?
0126デフォルトの名無しさん
NGNG0127デフォルトの名無しさん
NGNG自分はしょーがないからこんな風にした。
(define a 10)
(define b 0)
(define c "hoge")
a; 10
b; 5
(set! c (* a b))
c; "c = a * b"
;***** if branch *****
;1
(if (> c 0)
(printf "a and b have the same sign")
)
;2
(if (= c 0)
(printf "c is zero")
)
;3
(if (< c 0)
(printf "a and b have the different signs")
)
0128デフォルトの名無しさん
NGNGお、情報ありがとうございます。やってみます。
DrScheme見やすくて素人に優しそうなんですけど、全角だめっぽいのが傷。
0129デフォルトの名無しさん
NGNG(cond
((> c 0) (display "same sign") (newline))
((= c 0) (display "c is zero") (newline))
((< c 0) (display "different sign") (newline))))
厨房だけど、こんなのとか。
;; different signs (複数形)なの?わからんけど(汗
0130デフォルトの名無しさん
NGNG(define a 10)
(define b 5)
(define c 0)
a; 10
b; 5
(set! c (* a b))
c; "c = a * b"
;***** cond branch *****
(cond ((> c 0)
(printf "a and b have the same sign"))
((= c 0)
(printf "c is zero"))
((< c 0)
(printf "a and b have the different signs"))
)
0131130
NGNGほとんど同じっすね。安心。
>different signs (複数形)なの?わからんけど(汗
いや、コメントは僕も適当なんで読み流してください。同符号ならひとつだから単数形、異符号なら二つだから複数形(笑
0132デフォルトの名無しさん
NGNGあれっ。てもとにあるDrSchemeでできるけど。
condじゃだめなの?
0133デフォルトの名無しさん
NGNGでlispを勉強してるのですが、
そこにでてくるテイル再帰プログラムというのがいまいちなんですが、
(defun hoge (param1)
;処理
(hoge (param))
という風に再帰呼び出しをするときに余計なことせずに
その関数そのものだけを呼び出せばテイル再帰になるという理解でいいんですか?
また、テイル再帰にすることにどんな意味があるんですか?
0134デフォルトの名無しさん
NGNG0135デフォルトの名無しさん
NGNG0136デフォルトの名無しさん
NGNGLISPは処理系によってどうなるかわからんけど、
schemeだと
(define (hoge) (hoge))
(hoge)
がふつーに動く。
これは末尾コンテクストという概念で、
シーケンスの最後に関数などの呼び出しがあるなら、
それはただのジャンプに置き換わるって事なんだけど。
0137デフォルトの名無しさん
NGNG(hoge 1)
12345678...
永遠にカウントアップする関数
0138デフォルトの名無しさん
NGNGschemeにはループ制御構文はdoしかない。
それもオプション扱いなんだけど。
言語設計者は末尾再帰をサポートすれば専用のループ構文は
全く必要ない事に気が付いた。
0139デフォルトの名無しさん
NGNG後はif文さえ除去できれば。
非正格言語なら遅延実行でif文も無くせるのに
0140デフォルトの名無しさん
NGNGあれってif文みたいなものじゃないの?
0141デフォルトの名無しさん
NGNGパターンマッチングはただのシンタックスシュガー.
0142デフォルトの名無しさん
NGNG>パターンマッチングはただのシンタックスシュガー.
え、何の?
0143141じゃない
NGNG0144デフォルトの名無しさん
NGNG0145デフォルトの名無しさん
NGNG正しくは、引数書き換え&goto文 だと思われ。
0146デフォルトの名無しさん
NGNGパターンマッチもガードじゃないの?
0148デフォルトの名無しさん
NGNG今使ってるのはMeadow, XLispStatですが、Common Lispと微妙に違っているので、
出来るだけ準拠したものがほしいのです。できれば、GUIありで・・・。
0149デフォルトの名無しさん
NGNG0150デフォルトの名無しさん
NGNGguile は
#!/usr/bin/gulie
の書式が使えるんだけど、
mit-scheme で同じようなことできませんか?
0151デフォルトの名無しさん
NGNG0152デフォルトの名無しさん
NGNGguile と gauche は #t 返したけど。
0153デフォルトの名無しさん
NGNGオブジェクト生成の爆発を避けるために
256バイトとかでテーブル参照でもやってるんでしょう。
gc起動が一番コストがでかいから。
0154デフォルトの名無しさん
NGNG属性フラグ+文字で1オブジェクト2〜4バイトとして考えても
最大1024バイト程度のテーブル参照で済むから、
そういうのは積極的にやってると思う。
実際ソース読んで見ないとわからないけども。
でもgaucheは漢字も1文字として解釈するんだよね。
0155152
NGNG>>153-154
そういうことなんですか、実装のことまでは分からないけど。俺もいつかは
scheme 処理系書くぞ。でも今は scheme 書けるようになるのが先だけど。
0156デフォルトの名無しさん
NGNGlambda->lm
はどうよ?
(de list(lm x x))
0157デフォルトの名無しさん
NGNG継続以外の処理は、すぐにでも作れるけど・・・
みんな、どうな風に作ってるんだろ?
(ソースみて勉強しないとねー)
0158デフォルトの名無しさん
NGNG0159150
NGNG#!/usr/bin/guile だけではできませんが、
#!/usr/bin/guile -s
!#
と書けばできます。
#! から !# までをコメントとする guile 独自の拡張らしい。
0160デフォルトの名無しさん
NGNG":"; exec gosh -b $0 "$@"
gauche だけどこれでできたから逝けるかも。-b は batch mode. 後ろの 2つ
は何だか知らないけど多分引数を渡すやつ。shell によっては変えないとだめ
かも。
0161デフォルトの名無しさん
NGNG#!/usr/bin/env gosh
の方が簡単かも。引数渡せるかは調べてないから調べて判ったら教えてね。
0162130
NGNG「SICP読む→ウマー」ってスレ立てようかと思ってるんですけど、お前らいかがですか。
0163デフォルトの名無しさん
NGNG0164150
NGNG":"; exec gosh -b $0 "$@"
こういう sh の書き方は知りませんでした。
#!
しかないと思ってた。
これでできるかも知れません。サンクス!
0165デフォルトの名無しさん
NGNG0166(define (x) (x))
NGNG0167デフォルトの名無しさん
NGNGオンライン版なら誰でもアクセスできるわけだし。
0168デフォルトの名無しさん
NGNGある地点を(x,y,z)とあらわせるとする。
x,y,zは符号付整数。
ある地点A,B,C・・・を結ぶためのパイプを設置する事を考える。
パイプのコストはなるべく安くすませたい。
パイプは長さ1に対して、コストL円かかる。
パイプを連結するのにB円かかる。
ひとつの連結パーツで最大6つのパイプを一点で連結する事ができるが、
それぞれのパイプの角度は90*n度でなくてはならない。(nは整数)
それから、パイプの方向は(1,0,0),(0,1,0)(0,0,1)のいずれかでなくてはならない。
パイプの配置方法を求めるプログラムを作成せよ。
以上、とある高校の夏休みの宿題。
作ってくれ
0169SICP 問題1.5に
NGNG(define (test x y)
(if (= x 0)
0
y))
(test 0 (p))
を実行してみると面白いことがわかる、と書いてあるけど、それ以前にこれ実行できないんですけど。。。。
素人目に見ても、1行目の関数定義のところが違ってるように見える。(define (p) (p))の最初のpは関数名に取られるわけだから、「引数のない関数は受付ません」というエラーが出るのも当然な気が・・・
何か間違ってるのかな?
0170追記
NGNG(define (no-argument) 5);引数なしプロシージャの定義
(no-argument);実行!
のような、引数なしのプロシージャもOKなんですな。
0171デフォルトの名無しさん
NGNGこのスレがあるからいらない。
0172デフォルトの名無しさん
NGNG0173デフォルトの名無しさん
NGNG0174デフォルトの名無しさん
NGNG0175デフォルトの名無しさん
NGNGな手続きって同じことができる?
0176デフォルトの名無しさん
NGNGその問題は
評価の仕方が作用順か正規順かで
とまるかとまらないかということ。
0177デフォルトの名無しさん
NGNG(define (my-reverse s)
(let loop ((s s) (reversed '()))
(if (null? s)
reversed
(loop (cdr s) (cons (car s) reversed)))))
0178デフォルトの名無しさん
NGNGありがと。簡単そうだけど書こうと思ったら書けなかった(厨
0179腰の曲がったおじいさん
NGNG> 正しくは、引数書き換え&goto文 だと思われ。
書き換えはatomicに起きます。
0180177
NGNG一筋縄でいかないと思ったら、問題を分割すると良いですよ。
reverse みたいに下請けを用意するとか、相互再帰する手続きを作るとか。
偉そうな事いえた器じゃないですけど。
0181デフォルトの名無しさん
NGNGの方法でも大丈夫なようです。
$gosh -V
Gauche scheme interpreter, version 0.4.10
で、引数を取れることを確認しました。確認したのは、附属していたドキュメン
トのまんまですが ↓ です。
---- ここから
#!/usr/bin/env gosh
(define (main args)
(if (null? args)
(copy-port (current-input-port) (current-output-port))
(for-each (lambda (file)
(call-with-input-file file
(lambda (in)
(copy-port in (current-output-port)))))
args))
0)
---- ここまで
0182デフォルトの名無しさん
NGNG相互再帰って何?
二つの関数がお互い同士を呼び合って、再帰するやつだったっけ?
できればサンプルプログラムを使って教えてください。
(相互再帰って3つ以上の関数同士でも出来るのかな?)
0183デフォルトの名無しさん
NGNG「なんでも再帰」とかおもしろいよ。
http://www.shiro.dreamhost.com/scheme/index-j.html
0184177
NGNGそうですね。複数個の手続きを通して再帰される場合、相互再帰。
1. 対等な関係にある 2 つの状態を調べる述語を書くとき。
典型的なのは、偶数と奇数を調べるもの。実際には letrec を使うのが
良いかも。
(define (my-even? n)
(if (= n 0)
#t
(my-odd? (- n 1))))
(define (my-odd? n)
(if (= n 0)
#f
(my-even? (- n 1))))
2. 手続き呼出。eval をするためには apply をしなければならないが、
apply をするためには引数を eval しなければならない。
3. S 式の解析。手続き read はデータをひとつ読みますが、
データ → アトムかリスト
リスト → データ、データ、データ...
なので、read とペアになる read_form でも定義して、それらを相互再帰
させます。
他にも色々使えると思いますが、慣れるとスイスイ相互再帰な手続きが
書けるようになります。
0185デフォルトの名無しさん
NGNGmit-scheme ではできたの?
0186177
NGNG長々とすみません。
0187デフォルトの名無しさん
NGNG(define (foldl bop iv ls)
(if (null? ls)
iv
(foldl bop (bop iv (car ls)) (cdr ls))))
(define (my-reverse ls)
(foldl (lambda (y x) (cons x y)) '() ls))
0188182
NGNGしんせつな解説有難うございます。
相互再帰かー。かっこいいなー。
リストと再帰を使いこなせるように精進します。
(zipとか使いこなせると括弧良いねー)
0189デフォルトの名無しさん
NGNG「なんでも再帰」
なんと相互再帰つかうと、関数と状態が1対1対応出来るんですね。
関数型プログラミングのパワー炸裂ですね。
0190デフォルトの名無しさん
NGNG>括弧良いねー
(((・∀・)))イイ!
0191デフォルトの名無しさん
NGNGおかしくないですか?括弧はネスト可能ってなってるけど括弧ネストしてあっ
たらエラーになる。
0192191
NGNG>括弧はネスト可能、つまり、 `abc (def (ghi) jkl) mno' は、`abc', `(def
>(ghi) jkl)', `mno' の3単語とみなすんだ。 但しダブルクオートで囲まれた
>文字列の中では括弧は機能しないとする。さてどうだ。
(define (count-words)
(define (in-word c count)
(cond ((eof-object? c) count)
((char-whitespace? c) (in-space (read-char) count))
((char=? c #\") (in-quote (read-char) (+ count 1)))
((char=? c #\() (in-paren (read-char) (+ count 1)))
(else (in-word (read-char) count))))
(define (in-space c count)
(cond ((eof-object? c) count)
((char-whitespace? c) (in-space (read-char) count))
((char=? c #\") (in-quote (read-char) (+ count 1)))
((char=? c #\() (in-paren (read-char) (+ count 1)))
(else (in-word (read-char) (+ count 1)))))
(define (in-quote c count)
(cond ((eof-object? c) (error "EOF in quoted word"))
((char=? c #\") (in-space (read-char) count))
((char=? c #\\) (read-char) (in-quote (read-char) count))
(else (in-quote (read-char) count))))
(define (in-paren c count)
(cond ((eof-object? c) (error "EOF in parenthesis"))
((char=? c #\() (in-paren (read-char) count) (in-paren (read-char) count))
((char=? c #\)) (in-space (read-char) count))
((char=? c #\") (in-quote (read-char) count) (in-paren (read-char) count))
(else (in-paren (read-char) count))))
(in-space (read-char) 0))
0193191
NGNGin-paren が #\) を見つけたときに in-space に跳んでっちゃうからいけない
んだと思うんだけどどうですか?
0194Lisper
NGNG0195デフォルトの名無しさん
NGNG0196デフォルトの名無しさん
NGNG作ったファイルを消したいときはどうやるんですか?
0197デフォルトの名無しさん
NGNG0198Rubyist
NGNG0199デフォルトの名無しさん
NGNGhttp://www.shiro.dreamhost.com/scheme/docs/schemersway-j.html
↑Schemer's way の Schemeプログラミングへがその質問へ回答かと。
話は変わるけど、Scheme FAQ を Scheme の勉強がてら翻訳しています。
プログラミング初心者なもので、難儀しています。
既に、日本語訳がありましたら、参考にしたいので教えて下さい。
http://www.schemers.org/Documents/FAQ/
0200デフォルトの名無しさん
NGNGここではSchemerとでも名乗ってください
0201デフォルトの名無しさん
NGNG0202デフォルトの名無しさん
NGNG0203デフォルトの名無しさん
NGNGな処理系ってどんなのがあります?
0204デフォルトの名無しさん
NGNGSICPの4章
は冗談として、シンプルな処理系としてSECDR-Schemeはどうかな。
SECDマシンという仮想機械にバイトコンパイルして動作する。
あとmini-schemeとか。ソースコード1ファイルで約2500行
当然だけど、継続や末尾再帰もサポート。
どっちも昔niftyのFPLにあったけど、多分Webでも拾えると思う。
Tiny-Schemeはmini-schemeのコードを元に作ってるみたいだし。
Tiny-Scheme
http://tinyscheme.sourceforge.net/
0205デフォルトの名無しさん
NGNGhttp://tinyscheme.sourceforge.net/minischeme.tar.gz
0206デフォルトの名無しさん
NGNGSICPの4章にのってるんですか?今webのやつ3章まで読んでるんですが。4章楽
しみだな。
>>205
ありがとうございます。今から見てみます。
0207デフォルトの名無しさん
NGNG> Gauche scheme interpreter, version 0.4.10
えーん。あたらしいのにしようよー。
0208デフォルトの名無しさん
NGNG良いね!
0209デフォルトの名無しさん
NGNG0210デフォルトの名無しさん
NGNG0211デフォルトの名無しさん
NGNG発音するとゲマクス。
カコワルイ
0212デフォルトの名無しさん
NGNG0213デフォルトの名無しさん
NGNGGauche は今 0.5.2 になってるね。
0214デフォルトの名無しさん
NGNG厨房増えまくっても嫌だけど。
0215デフォルトの名無しさん
NGNGHaskellで言うところのリスト内包表記をマクロで定義することもできるんですかね?
たとえば,1..10のうち偶数を取り出すというのをリスト内包表記で表すと
[x | x <- [1..10], even x]
のように,数学の式と同様に表現できます.
内容は,| 以降の条件をすべて満たしたxの集合を表します.
こういうシンタックスシュガーは,Schemerは好まないものですかね?
0216デフォルトの名無しさん
NGNGってスレ違いか。
0217デフォルトの名無しさん
NGNGまだ全然Schemeを使いこなせてないのにぃ
0218デフォルトの名無しさん
NGNGお。奇遇だね。俺もたった今注文してきたとこだよ。
俺もschemeまだまだわからないけど。多分あの本ってこれからschemeをやろうっ
ていう人が読むような本なんじゃないかな。
0219デフォルトの名無しさん
NGNG0220デフォルトの名無しさん
NGNG書かれている文書を見るのですが、何がそう言わしめているのでしょうか。
個人的には、Scheme は十分実践的だと思っています。
Common Lisp ライブラリ関数の膨大さ故でしょうか。
0221デフォルトの名無しさん
NGNG0222デフォルトの名無しさん
NGNG0223デフォルトの名無しさん
NGNG> 個人的には、Scheme は十分実践的だと思っています。
「個人的」だからじゃないかな?
0224デフォルトの名無しさん
NGNGで書」くために使わせてもらっています。というか勉強中です。
0225デフォルトの名無しさん
NGNGCommon Lisp は remove と delete, reverse と nreverse といったように、
同じ動作で効率を重視した破壊的関数が用意されているあたり実践的なんじゃないかな。
あと、一つの関数でもキーワード引数で
* (remove 2 '(1 2 3 1 2 3))
(1 3 1 3)
* (remove 2 '(1 2 3 1 2 3) :count 1)
(1 3 1 2 3)
* (remove 2 '(1 2 3 1 2 3) :count 1 :from-end t)
(1 2 3 1 3)
* (remove 2 '(1 2 3 1 2 3) :test #'>)
(2 3 2 3)
と使いでがあるあたりも。
0226220
NGNG「僕の個人的な意見としては」という意味だったんですが。
それとも「個人的な意見」に留まってしまっているのが原因、と?
>>225
なるほど。他にも &optional のような、一見クリーンでなくても実践的な
仕様がありますね。なにも「Scheme は実践的ではない」という意味で
捉えなくても良いって事でしょうかね。
0227Gauche しゅごーい。
NGNG俺と同じ人がいた。
0228デフォルトの名無しさん
NGNGlet/let* と letrec の違いがいまいち理解できてないのですが、
let/let* はclosureが評価された値をバインド
letrec はclosureそのものをバインド
という理解でいいのでしょうか?
0229デフォルトの名無しさん
NGNG0230デフォルトの名無しさん
NGNGこれでも読みませう。
http://www.stdio.h.kyoto-u.ac.jp/~hioki/gairon-enshuu/SchemeNotes/let.html
0231デフォルトの名無しさん
NGNGこのスレのPart3(いま見えないけど)にあったvarマクロ使ってるけど、
あれネストが減っていいですよ。
(var a 1
var b 2
var c (+ a b)
c
)
=>3
0232デフォルトの名無しさん
NGNGとか逝ってみるテスト
0233デフォルトの名無しさん
NGNG(try
...(throw tag)
catch tag
...
finally
...)
って感じのならあるけど、アプしようと思って、今読み返したら、
結構長かった。
作りは、
・lispのcatch & throwのエミュ
・lispのunwind-protectのエミュ(javaのfinallyに対応)
・(try ... catch ... finally)を許す様に簡単な構文変換
の組み合わせで、
catch/throwはcatchで継続と一緒にタグをグローバルな変数へ登録、
throwでその変数を検索といった感じです。
0234デフォルトの名無しさん
NGNGcall/cc の使い方について、ループからの脱出以外にどんなものがあるかを知
りたいので、
>・lispのcatch & throwのエミュ
だけ良かったら見せてもらえますか?これも長くなりますか?
0235233
NGNG(define -*-root-*- '()) ;トップレベルに戻るための環境
(call/cc (lambda (cont)
(set! -*-root-*- cont) ))
(define *exception* '()) ;例外補足用のtag環境リスト
;(catch <tag> . cont)または
;(catch all . cont)または
;(finally . cont)
(define (throw-value tag result)
(let loop ((x *exception*))
(if (pair? x)
(cond
; catch <tag>
((and (eq? (caar x) 'catch) (eq? tag (cadar x)))
(set! *exception* (cdr x))
((cddar x) result))
; catch-all
((and (eq? (caar x) 'catch) (eq? 'all (cadar x)))
(set! *exception* (cdr x))
((cddar x) result))
;finally
((eq? (caar x) 'finally)
((cdar x)) ; finally
(set-cdr! (car x) (lambda())) ; dmy-closure
(loop (cdr x))
)
(else (loop (cdr x)))
)
(begin
(set! *exception* x)
(puts "Cannot throw tag and perform a reset"
(list 'throw-value tag result))
(-*-root-*- result)
))))
0236233
NGNG(define (sequence? l)
(and (pair? l)
(pair? (cdr l))))
;sequenceを置けるthrow (throw tag seq...)
(define-macro (throw tag . body)
(list 'throw-value tag
(if (sequence? body)
(cons 'begin body)
(car body))))
(define (lisp-catch tag body)
(call/cc (lambda (cont)
(set! *exception* (cons (cons 'catch (cons tag cont)) *exception*))
(throw-value tag (body)))))
(define-macro (catch tag . body)
`(lisp-catch ,tag (lambda () ,@body)))
(define (call-with-catch tag test catch)
(let ((throw? #t))
(let ((result
(call/cc (lambda (cont)
(set! *exception* (cons (cons 'catch (cons tag cont)) *exception*))
(throw-value tag (prog1 (test) (set! throw? #f)))))))
(if throw?
(catch result)
result))))
(define (unwind-protect test finally)
(let ((current *exception*))
(push (cons 'finally finally) *exception*)
(let ((r (test)))
(set! *exception* current)
(finally)
r)))
0237233
NGNG>(define-macro (catch tag . body)
> `(lisp-catch ,tag (lambda () ,@body)))
(define-macro (catch tag . body)
`(lisp-catch ',tag (lambda () ,@body)))
でした。
0239デフォルトの名無しさん
NGNG0240デフォルトの名無しさん
NGNG> -5月下旬発売予定-
http://www.pearsoned.co.jp/washo/nbindex_may.html
0241デフォルトの名無しさん
NGNGいとかこのスレかどっかで見た覚えがあるんですが。
0242デフォルトの名無しさん
NGNG継続対応にするにはどうすればいいんですか?
0243デフォルトの名無しさん
NGNG0244デフォルトの名無しさん
NGNG継続や例外処理が使えるようにλ理論の拡張したものらしいけど・・
何か参考になる本、Web無い?
誰か教えてー。
0245デフォルトの名無しさん
NGNGかわりといっては何だがhttp://www.cs.uu.nl/~franka/refでもどぞ。
プログラミング言語理論のオンラインテキスト集。(既出か?)
0246デフォルトの名無しさん
NGNGLisperらしき人がCommon Lispをボロクソに言っているように見えますが、こ
のスレのLisper/Schemerな人たちどう思いますか?
Schemeはhackerのための言語でしょうか。ライブラリが充実しているかどうかっ
ていうところが問題かな?
0247デフォルトの名無しさん
NGNG0248デフォルトの名無しさん
NGNG>ライブラリが貧弱
0249デフォルトの名無しさん
NGNGschemeについて全く触れられてないけど。。。
0250デフォルトの名無しさん
NGNGGauche の開発者の人の訳文だし、このスレの人は結構見てるかも。
Common Lisp への批判は、今日の Java への批判に通じる物があるね。
この文章を書いたた人は Python が好きそう。
0251デフォルトの名無しさん
NGNGハックに使いにくい事みたいだけど、本当ですか?
0252デフォルトの名無しさん
NGNGことになりがち。他の言語やツールと連携することは、可能ではあっても、
快適にできるというわけではないから。だからハック向きの言語ではない
と言って良いと思う。Perl/Python/Rubyは他の言語やツールと連携する
のが得意だし、カンタンな処理はごく短いコードで書けるから、ハック向
きの言語だよね。
件のページに書かれているように、今すぐ書いて処理したい仕事では、文
字列処理がその多くを占める。だから強力な文字列ライブラリのある言語
は「実用的」だと言えるよね。Common Lispはそうじゃない。カンタンな
フィルタプログラムを書こうと思っても、そんなにカンタンじゃない。
UNIX文化にどっぷりつかっている言語と、OS側の機能を前提としない言語
の違いと言ってもいいかもね。
0253デフォルトの名無しさん
NGNG0254デフォルトの名無しさん
NGNG文字列処理がLISPでできるというメリット
0255デフォルトの名無しさん
NGNGかなり変わった構成だな。
0256デフォルトの名無しさん
NGNG(car "あいうえお")=>\あ
とできて嬉しいのかと問いたい。
(cdr "あいうえお")=>"いうえお"
うむ。
0257デフォルトの名無しさん
NGNG(call/cc (lambda (break) ....
このbreakとか。
0258デフォルトの名無しさん
NGNGbreakくらいならたいていの言語にあるだろうけど。
継続のもっと強力な機能が知りたいな、とか逝ってみるテスト。
0259デフォルトの名無しさん
NGNGいや、このbreakを変数の様に持ち回れるって所は他の言語にはないでしょ?
0260デフォルトの名無しさん
NGNG継続あればなんでもできるよ
0261腰の曲がったおじいさん
NGNG0262デフォルトの名無しさん
NGNG0263デフォルトの名無しさん
NGNG「マクロでできるよ」
……こんなのばっかりです、
0264デフォルトの名無しさん
NGNGだから?
0265デフォルトの名無しさん
NGNG素晴らしすぎると思うのだが。
初めてEmacs-Lispでマクロの練習したときは、その強力さにオロロイタ。
Schemeとかで「プログラムのためのプログラム」組むのも大事だけど、やっぱエディタのマクロ組むと楽しいと思う。
実用的なマクロができあがるとうれしいもの。
0266デフォルトの名無しさん
NGNGた。
;; とか言って scheme じゃ算数の問題解くだけしかできないけど(w
0268デフォルトの名無しさん
NGNG漏れは今読んでるぞ。
0269デフォルトの名無しさん
NGNGThat was too easy!:P
I've just read a few pages and never opened it again.
Well, but it might be true the book sometimes is useful.
0270デフォルトの名無しさん
NGNGあの本は非常によく考えられて作られてると思うぞ。
0271デフォルトの名無しさん
NGNG0272デフォルトの名無しさん
NGNG0273デフォルトの名無しさん
NGNGみんな思ってる。
0274デフォルトの名無しさん
NGNGIs it true that it is an atom?
atom
で始まって、答えが
Yes,
because atom is a string of characters
beginning with the letter a.
邦訳はどんな感じですかいね。
0275217
NGNG0276デフォルトの名無しさん
NGNGとか言ってみるテスト。
0277デフォルトの名無しさん
NGNG船便で半年後にくる、に500みずぽ。
0279デフォルトの名無しさん
NGNGアマゾンで注文して2週間できたよ。
0280デフォルトの名無しさん
NGNG0281デフォルトの名無しさん
NGNGあんたがどこで買ったかなんて興味ない
0282デフォルトの名無しさん
NGNGLispってけっこうおもしれー。
どういう用途があるのかよくわかんないけど・・・
0283デフォルトの名無しさん
NGNG0284デフォルトの名無しさん
NGNG文字列処理だよ!文字列処理!!
0285腰の曲がったおじいさん
NGNGEmacs
0286デフォルトの名無しさん
NGNGありがと
0287デフォルトの名無しさん
NGNG逆にemacs以外のエディタでlispプログラミングしてる人いる?
おれはそんなの考えられないんだけど。
0288デフォルトの名無しさん
NGNG0289デフォルトの名無しさん
NGNGいけずぅ。
0290腰の曲がったおじいさん
NGNG.sawfishrcを書く程度ならviを。
0291デフォルトの名無しさん
NGNGの間違い、ごめん。おれは287.
0292デフォルトの名無しさん
NGNGもちろん、Schemeのプログラムもviで書いてる。
0293285
NGNGSchemeとLispの違いって何?DelphiとPascalの違いみたいなもん?
外出質問かもしれん
0294デフォルトの名無しさん
NGNG0295デフォルトの名無しさん
NGNG何ゆえにその人物はScheme処理系使わないの?
0296デフォルトの名無しさん
NGNG真に絵がうまい人は、線は一度しか引かない。Scheme の哲学しかり。
と、自分なりに思ってみた。
0297デフォルトの名無しさん
NGNG0298腰の曲がったおじいさん
NGNGActor理論に基づいた(Lisp風の)処理系を作るのが当初の目的。
過去スレ読めば文献ポインタもある。
0299デフォルトの名無しさん
NGNGコレクションしています。
mini scheme
tiny scheme
ki-scheme
am-scheme
LispMe
他にもあったら教えて下さい。
ki-scheme のソースは日本語で丁寧にコメント書いてあるし、
SJIS が通るので良い感じ。
何れは俺も作ってみたいな、scheme 処理系。
0300デフォルトの名無しさん
NGNG0301デフォルトの名無しさん
NGNG俺にはだよ,俺には.
0302デフォルトの名無しさん
NGNG打撃戦ってあったか?
0303不覚
NGNG0304デフォルトの名無しさん
NGNG0305デフォルトの名無しさん
NGNG純正のEmacsを使うのだ!
0306デフォルトの名無しさん
NGNG[[LK9-herTeMV3]]
<<xyzzy>>に一票!
……は置いといて、
>>293
> DelphiとPascalの違いみたいなもん?
LispとSchemeは「どちらかはもう一方の物を拡張した物」等と言った関係ではないので、違います。
実際の違いについては、>>294が一番分かりやすいと思う。
>>294はただの勘違いだけれど、そんな勘違いを生む程度の違いがあります。
0307デフォルトの名無しさん
NGNGいい加減講義も研究もしなければならないから読む暇無いぞモルァ
0308デフォルトの名無しさん
NGNG0309デフォルトの名無しさん
NGNG教わる学生が不幸すぎる・・・
0310デフォルトの名無しさん
NGNG「ママみたいに優しく教えてよ!」ってな感じの
プログラミング苦手初心者には、効果的かも。
「プログラミング・マニアみたいな人」ばっかりだと、
この世界も広がらないしねぇー。
0311デフォルトの名無しさん
NGNG0312デフォルトの名無しさん
NGNG0313デフォルトの名無しさん
NGNG前書きに、rushするな!って書いてあるだろが!!ちゃんと前書きから読め!!
0314デフォルトの名無しさん
NGNG今年の2月以降に製造された RX-2001 が、
たったの 9700 円!?↓
http://www.bidders.co.jp/user/1023585
買おうかな。
0315Symbolics
NGNG0316Symbolics
NGNGoriginal (Lisp/Unix) があって、それが使いやすくて亜種がいっぱい
できて、そのうちの分派 (Scheme/BSD) が使いやすかったので
そのなかで大きな一派になっている。
で、その一派から originalに吸い上げられた機構 (Static scope/TCP)
もあったりして、ぐちゃぐちゃになってると。
我ながら強引な説明だ。
0317デフォルトの名無しさん
NGNG部外者でも買えるの?
それともダイガクセイを装って買った方がイイ?
0318デフォルトの名無しさん
NGNG部外者でも買えるYO! 学生割引が使えないだろうけど。
それでも中高生ならアカデミックパックは買える。
0319デフォルトの名無しさん
NGNG(sys-srandom (sys-time))
(modulo (sys-random 10))
とやってみたけど始めの1桁がかたよってしまいます。他にいい方法あったら
教えてください。
0320デフォルトの名無しさん
NGNG0321デフォルトの名無しさん
NGNG0322デフォルトの名無しさん
NGNG初期のList処理はFortran上で行われていて、
そこからList処理拡張を持つFortranや、Lispが生まれた、とか、
Lispの初期の実装系はFortranで書かれたって、知っているよね?
>>321 は罰として、Fortran-moniterシステム使ってLisp machine作ってくだちい。
0323デフォルトの名無しさん
NGNGこの繋がりが良く分からない
0324デフォルトの名無しさん
NGNG同じく。
0327デフォルトの名無しさん
NGNGこの繋がりも分からない。
0328デフォルトの名無しさん
NGNG0329デフォルトの名無しさん
NGNG0330デフォルトの名無しさん
NGNG今はEmacsとWnnの設定の時ぐらいしか使わない。
暇があったら GIMPで遊んでみる事にしよう...。
0331デフォルトの名無しさん
NGNG0332デフォルトの名無しさん
NGNGあくまで補助として。
0333デフォルトの名無しさん
NGNG講義はするじゃなくて受けると言えば良かったのか.失敬.
0334デフォルトの名無しさん
NGNGThis space reserved for
JELLY STAINS!
★★★★★★★★★★★★★★★★★★
0335デフォルトの名無しさん
NGNG同じく。
俺の予想では Lisp スレで Fortran という単語を見た
>>322 は知識をひけらかしたい欲求にかられたのだろう。
0336デフォルトの名無しさん
NGNGGauche はちょっと大きいかな?
http://www.shiro.dreamhost.com/scheme/gauche/index-j.html
あと、ここみたいに >299 がリンク集にしてレスしてくれると
幸せかもと思ったり……
http://www.sci.toyama-u.ac.jp/~iwao/Scheme/scheme.html
0337322
NGNG>同じく。
>俺の予想では Lisp スレで Fortran という単語を見た
>>>322 は知識をひけらかしたい欲求にかられたのだろう。
それはどうかな?
最近このスレ、つまらなくなってきているので、
話題の転換を図ろうとしたんですけどねぇ。
もしかして、学部生レベルを超えた話題は全て、
「知識をひけらかしたい部外者」のレスって思ってませんか?
0338デフォルトの名無しさん
NGNG擬似乱数の生成法によるけど、手元のmanでrand(2)を見ると
上位ビットを使えと書いてある。
Cならj=1+(rand() % 10)ではなく
j=1+(int) (10.0*rand()/(RAND_MAX+1.0))とやれと。
0339321
NGNGLISPは最初はFORTRANで実装されていて、遅かったという話しは読んだことある。
CommonLispの入門書でだったかな?
http://www.jah.ne.jp/~naoyuki/Writings/VScheme1.html
を読んでやってみたい気もするが、まずはSchemeを使いこなしたい。
このスレが最近単調なのは同感だけど、歴史談議は興味がない。
リアルタイムで知ってるやつもいないだろうし。
Gauche+xml(rdf)+CGIでいろいろやりたいから、その方面の話題を希望。
#英語はなかなか読み進められないんだよ。。。
0340デフォルトの名無しさん
NGNG#英語はなかなか読み進められないんだよ。。。
#って意味不明
0341335
NGNG> それはどうかな?
> 最近このスレ、つまらなくなってきているので、
> 話題の転換を図ろうとしたんですけどねぇ。
へー、そうだったんだ…。変なこと言ってゴメソ。
> もしかして、学部生レベルを超えた話題は全て
とりあえず俺には>>322は学部生レベルを超えた話題には見えない。
> 「知識をひけらかしたい部外者」のレスって思ってませんか?
思ってないよ。
>>321-322 の流れが謎すぎたからそう思っただけ。
# つか「部外者」ってなんだ?
というかこのスレは学部生レベル (ってのもよくわからんが)
を超えてるであろう話題がいっぱい出てますが
「お前はただ知識をひけらかしたいだけちゃうんかと」なんて一度も思ってないですよ。
ただひたすら「勉強になるなぁ」と。
# 実際は理解できない話題が多く、あまり勉強になってないかもしれんが…。
0342デフォルトの名無しさん
NGNGwith-in/out系が生きてくるし。
0343のほほ
NGNG計算機まわりの知識とかスキルって、
自分でがつがつ食っていくもんだから、
○○レベルってのはそのへんに置いとこう。
俺みたいに単に興味本位でいじってる人間には
食え「そう」なものがいろいろ落ちてるスレってだけでいいんだけど。
食う、食わないはべつにして。
0344デフォルトの名無しさん
NGNG0345デフォルトの名無しさん
NGNGhttps://rakunet.org/TSNET/topics/compare.html
0346デフォルトの名無しさん
NGNG;;; 解3
;;; 継続の呼び出しでループを実現するひねくれた解
(display
(let ((total 0))
(let ((next (call-with-current-continuation (lambda (k) k))))
(let ((num (read)))
(if (zero? num)
total
(begin
(set! total (+ total num))
(next next)))))))
これを set! なしで書くことできる?解2のやつはできたけど
こっちはわかんない。
0347のほほ
NGNG0348デフォルトの名無しさん
NGNG企業では、AI的用途(エキスパート・システム等)でだいぶ前に導入されて、
今は廃れているという罠
#データ・マイニングとか、ナレッジ・エンジニアリング周りにはAIの残党も残っているけど、
#金融/投資といったシビアな分野ではどーでしょ。(Lisp使う使わないって問題じゃないでしょうね)
大昔から、Lispいじりは大学2年の夏休み自由課題と相場が決まっている罠
0349のほほ
NGNGでも Emacs を使っている人間は Lisp をいじりつづけるという罠
0350デフォルトの名無しさん
NGNG生活感をまじえつつ教えてくれ
0351デフォルトの名無しさん
NGNG0352デフォルトの名無しさん
NGNG0353デフォルトの名無しさん
NGNGLISPのマクロを使いたいとき
0354デフォルトの名無しさん
NGNGそのマクロをつかいたいときってどんなとき!?
0355デフォルトの名無しさん
NGNG楽したいとき。
0356デフォルトの名無しさん
NGNGAdaも使う破目に。
0357デフォルトの名無しさん
NGNG触っているとき。
でLispなんて単純すぎると嘆き、結局元の言語にもどる罠
0358デフォルトの名無しさん
NGNG0359デフォルトの名無しさん
NGNG0から自作?
0360デフォルトの名無しさん
NGNG0361デフォルトの名無しさん
NGNG本を開いた瞬間仰天した.
子供に読ませるの?というレスがあった理由が分かる気がするよ.
この程度の本なら,英語が苦手な友達も気軽に読めそうな気がする.
が,名著たるゆえんが見いだせそうにないのだが…
0362デフォルトの名無しさん
NGNGよく読んでみろ!!
めちゃめちゃ作りこまれてるぞ!!
0363デフォルトの名無しさん
NGNG0364229
NGNGリクエストにお答えして。
TinyScheme と Minischeme はこのスレの上の方>>204-205
にありました。
Gauche は小規模と言うには本格的過ぎます。
そう言えば、Gauche 0.5.3 がリリースされたみたいですね。
ソースコードを公開している Scheme の小規模な処理系を
集めてみました。
こうして見ると、日本人の作による物が多いですね。
TinyScheme: 下記 Minischeme の発展版
http://tinyscheme.sourceforge.net/
Minischeme: 1 ファイルに凝縮された Scheme 処理系
http://tinyscheme.sourceforge.net/minischeme.tar.gz
KI-Scheme, AM-Scheme, etc...
http://www.nifty.com/download/dos/prog/lisp/
LispMe: Palm 上で動く Scheme 処理系
http://www.lispme.de/lispme/
スレのテンプレに入れて下さると嬉しいです。
0365364
NGNG>>359
KI-Scheme が良いんじゃないでしょうか。
コメントが充実していますし、SJIS も使えます。
0366デフォルトの名無しさん
NGNG336じゃないけどサンクス。
確かにKI-Schemeは読みやすいね。
0367デフォルトの名無しさん
NGNG再帰をしっかり理解できている人にとっては
不動点演算子とインタープリタの所以外は、簡単すぎるかもしれない。
再帰を知らない人に、再帰を理解させる本だね。
0368デフォルトの名無しさん
NGNGweb で調べてもさっぱりだったけど。
0369デフォルトの名無しさん
NGNGうん、簡単だよねぇ。
2時間で読むれっていったら誰かさんが「急ぐなヨ」とか逝ってたけど、
オレは30分で読んだYO!
0370デフォルトの名無しさん
NGNGまさか本当に >299 がまとめてくれるとは。THX
0371デフォルトの名無しさん
NGNG0372デフォルトの名無しさん
NGNG0373デフォルトの名無しさん
NGNGマターリ
0375デフォルトの名無しさん
NGNG「自分は一般人とは違う」などと勘違いしてしまう罠
0376デフォルトの名無しさん
NGNGはあ?
0377デフォルトの名無しさん
NGNG>「なんでも継続」を書けばなんでも三部作完結
早く読みたいなぁ。。
概出だけど Gauche-0.5.3 age
0378デフォルトの名無しさん
NGNGmanko
Yes,
because manko is a string of characters
beginning with the letter a.
0379デフォルトの名無しさん
NGNG0380デフォルトの名無しさん
NGNG( ゚д゚)ポカーン
0381デフォルトの名無しさん
NGNGそこもまちがっとった。
0382デフォルトの名無しさん
NGNG0383デフォルトの名無しさん
NGNGを読んだんだけど、プロダククションコードでは処理系依存の
機能をばりばり使っていい、ってのは変じゃ?
その codeをほかの処理系を使ってる人に使ってもらう、とか
いうことを考えなくていいん?
そういうのを考えるのはプロダクションじゃないとか?
0384デフォルトの名無しさん
NGNG0385デフォルトの名無しさん
NGNG0386デフォルトの名無しさん
NGNGしろーたん萌え (;´Д`)…ハァハァ
0387デフォルトの名無しさん
NGNG(lambda (arg1 arg2)
...
(define (func arg1 arg2)
...
どっち派?
どっちがきれい?
0388デフォルトの名無しさん
NGNGわたしゃ、lambda派
MITスタイルは好きになれない。
0389デフォルトの名無しさん
NGNG後者はMITスタイルって呼ばれてるんですか?
0390デフォルトの名無しさん
NGNG後者が好き。打つのも読むのも楽。構文糖は徹底活用すべし。
0391デフォルトの名無しさん
NGNG0392デフォルトの名無しさん
NGNG(define func (lambda (arg1 arg2) ...
(define-function (func arg1 arg2) ...
と分かれていた方が好き。
(define (func arg1 arg2 . rest) ...
これはうまいな、と思うけども。
0393デフォルトの名無しさん
NGNGどっち派もクソもねーだろ、このホゲ。
(define f(let(...)(lambda(args)...)))
↑みたいに特に理由が無い限り
(define(f args)...)
に決まっておろーが。
0394デフォルトの名無しさん
NGNGまあ、どっちでもいいけど。
Kent dybvigさんの本だとlambdaを使っているね。
λ式に名前をつけるって感じでこっちが好きだけど、
構造と解釈の普及でlambda無し方が今や主流なのかな。
0395389
NGNG0396デフォルトの名無しさん
NGNGスタイルもなにもない
0397デフォルトの名無しさん
NGNG0398デフォルトの名無しさん
NGNGdoとnamed-let,letrecどれで書けばいいの?
0399398
NGNG0400デフォルトの名無しさん
NGNG0401デフォルトの名無しさん
NGNG0402デフォルトの名無しさん
NGNG多分。
0403デフォルトの名無しさん
NGNG0404デフォルトの名無しさん
NGNG読みにくいよ。
0405デフォルトの名無しさん
NGNG0406デフォルトの名無しさん
NGNG0407デフォルトの名無しさん
NGNGつーか、みなさまは SRFIに乗ったライブラリとかを
使ってるんでしょうか??
0408デフォルトの名無しさん
NGNG(Y Y) Works! A Lecture on the Why of Y
ってタイトルで
PostScriptファイルが手にはいるよ。
0409デフォルトの名無しさん
NGNGGhostScript入れるとか無しに。
0410デフォルトの名無しさん
NGNGGhostScript入れるのが一番簡単だと思うが。
0411デフォルトの名無しさん
NGNGこのまえいれてみたんだけど、
日本語がうまく表示できなかった。
0412デフォルトの名無しさん
NGNGPostscriptで配布されている論文読むためだと勝手に信じて、
・http://www.fsci.fuk.kindai.ac.jp/~kakuto/win32-ptex/web2c73.html
の下にあるGhostscriptのどれか。gnu-gs652j-full-w32api.zipが簡単かね。
・Adobeの製品を買う。
・UNIXを使う。
のどれかを。
0413デフォルトの名無しさん
NGNG確かにスレ違いだけど、このスレは論文とかpsファイルの参照って
結構多いから、こういう情報は助かります。
0414デフォルトの名無しさん
NGNG読んでる人少なそうだが。
0415デフォルトの名無しさん
NGNGAdobe Acrobat 5 買いな (無料の Reader じゃなくて)。
ダブルクリックで PostScript ⇒ PDF に変換してくれるから。
ただし、よく失敗するけど (GhostScript も同じか)。
0416デフォルトの名無しさん
NGNGGSViewはここにあるのを入れて動きました。
ttp://www.matsusaka-u.ac.jp/~okumura/texfaq/bibun2e/gsview.html
0417デフォルトの名無しさん
NGNG0418デフォルトの名無しさん
NGNGscheme処理系を発見しました。
http://www.jah.ne.jp/~naoyuki/index.html
0419デフォルトの名無しさん
NGNG「Schemeを作ろう」だって。
難しくてわかんないや。
0420デフォルトの名無しさん
NGNGそれは末尾再帰展開に対応してないので、schemeとは呼べませんな
0421デフォルトの名無しさん
NGNG0422デフォルトの名無しさん
NGNG0423デフォルトの名無しさん
NGNG末尾再帰をサポートしないと、ループ回すうち
スタック溢れちゃう。
0424デフォルトの名無しさん
NGNG>スタック溢れちゃう。
常にそうなるとは限らないと思うけど・・・
プログラミング言語としては末尾再帰無いとナンセンスかな?
ちなみに継続 call/ccは必須うなのかな?
0425デフォルトの名無しさん
NGNG0426デフォルトの名無しさん
NGNG前半は気になるところがいっぱいあった。
後半はあまりそう思わなかった。
慣れただけかもしれないし、訳者が違うのかもしれない。
0427デフォルトの名無しさん
NGNGhttp://www-mitpress.mit.edu/sicp/
原文が全部のってるから、読み比べるよろし。
0428デフォルトの名無しさん
NGNGそれとも一部の実装で?
0429デフォルトの名無しさん
NGNG0430デフォルトの名無しさん
NGNG継続だけに繋がりが重要ということで。
>>428
継続が使えるように拡張された実装があるらしい。
今はpython本家でも使えるようになったのかな?
Stackless Python
http://stackless.com/research/stackless/
0431デフォルトの名無しさん
NGNG本家には入ってないようです。
0432429
NGNGSceme → Scheme
0433デフォルトの名無しさん
NGNG0434デフォルトの名無しさん
NGNG(define (boolean x)
(if x #t #f))
0435sage
NGNGって以前から動いてた?
とにかく c-w-c からいっきに call-with-current-continuation 補完されるのは最高。
0436デフォルトの名無しさん
NGNG0438434
NGNG(define (whitespace? ch)
(boolean (memv ch *whitespace-chars*)))
0439デフォルトの名無しさん
NGNGあえて#tと#fにそろえる必要もないんでは。
0441デフォルトの名無しさん
NGNG0442デフォルトの名無しさん
NGNG0443デフォルトの名無しさん
NGNG=>?
これは#t/#fどっち?
0444デフォルトの名無しさん
NGNG0445デフォルトの名無しさん
NGNG0446デフォルトの名無しさん
NGNGILISP is a powerful GNU Emacs interface to many dialects of Lisp,
including Lucid, Allegro, Harlequin LispWorks, GCL, KCL, AKCL, ECL,
IBCL, and CMUCL. Also some Scheme implementations are supported as
well as a preliminary version of Xlisp/XlispStat.
0447デフォルトの名無しさん
NGNGとりあえず候補を色々知っておきたい.
…と調べていたら,GuileGLなるものをハケーン.
試してみるか…
http://atrey.karlin.mff.cuni.cz/~0rfelyus/guileGL/
0448デフォルトの名無しさん
NGNG#f以外は全部#tとみなすんじゃないの?
0449デフォルトの名無しさん
NGNGそれはこういう場合でしょ。
(if 'a 'true 'false)
=> true
0450デフォルトの名無しさん
NGNG付いてる。callcc{}。
新バージョンでは捨てるという話を聞いたような聞かないような。
>>448
#f以外は真として扱うというだけであって、#tとして扱う訳ではありません。
偽:#f
真:#fを除く全てのもの
0451デフォルトの名無しさん
NGNGnilはschemeだとただのシンボル
0452デフォルトの名無しさん
NGNGあと set! とかが返り値ないのも。
0453デフォルトの名無しさん
NGNGおとなしくGauche-glでやってみることにしたり…
0454デフォルトの名無しさん
NGNGOpenGLって何だろ。
0455デフォルトの名無しさん
NGNG続を生成するためには一回その無限ループを評価しないといけないですよね(?)
そうするとループから抜けられなくなるから、継続を束縛するところまではで
きるけど、その継続を評価してみることはできないってことになりますか?
;; 本に載ってるプログラムをいじって何をしてるのか実験してみたいんですが。
0456デフォルトの名無しさん
NGNG例えば、まず
(define top (call/cc (lambda (k) k)))
みたいにしてトップレベルへ脱出できるようにしておく。
で、欲しい継続を大域変数に保存したあとに、
top を呼び出してトップレベルに戻る。
抜粋すると
(call/cc (lambda (k) (set! global k) (top #f)))
みたいになる。
0457デフォルトの名無しさん
NGNGhttp://www-swiss.ai.mit.edu/%7Ejaffer/SCM.html
>Tanel Tammet's Hobbit compiler is now integrated into the SCM distribution.
>Ported SCM to the PLAN9 operating-system.
>Ported SCM to OS/2, IBM VisualAge C++ v3.
0458デフォルトの名無しさん
NGNGなるほど。ありがとうございます。
勉強になりました。
下のようなコードを実行してみたのですが、
#<subr:"continuation">hoge
*** ERROR: bad procedure: #f
と言われてしまいました。
しばらく悩んでいたのですが、意味が分かりました。
(cc #f) から無限ループが始まることを期待していたのですが、(top #f)のと
ころでトップレベルに戻ってしまうために cc の値が #f になってしまってエ
ラーになっている、という解釈でいいんですよね。
;; 何がやりたいかと言うと、無限ループの継続を実行したら無限ループが始
;; まるだろう、というのを実験してみたかった。
-------------------
(define cc #f)
(define top (call/cc (lambda (k) k)))
(define (loop)
(let f ()
(call/cc (lambda (k) (set! cc k) (top #f)))
(display "hoge")
(newline)
(f)))
(loop)
(display cc)
(cc #f)
------------------
上の #<subr:"continuation">hoge
は (display cc) (cc #f) の出力です。
0459デフォルトの名無しさん
NGNGcc の値は continuation になってるけど、 top の値が #f になってて、
(top #f) が (#f #f) になってエラーが起きているのでは。
(top #f) を (top null?) とでもすると期待どおりになるのでは。
0460デフォルトの名無しさん
NGNGごめん。俺がかんちがいしてたみたい。
(define top (call/cc (lambda (k) k)))
のところからして、変だった。
(let () (call/cc (lambda (k) (set! top k))))
で、とりあえず動く。どうしてかは、よく判らん。
くわしい人に聞いて。
他の事しながら書いてるので、まだおかしいかもしれん。
0461458
NGNGになりました。また (top (lambda (a) a)) でも大丈夫でした。
>>460
>(define top (call/cc (lambda (k) k)))
>のところからして、変だった。
これって変なんですか?うまく行きましたけど。
>(let () (call/cc (lambda (k) (set! top k))))
これは
(call/cc (lambda (k) (set! cc k) (top #f)))
この行を書きかえるんですよね。これでもうまく行きました。
うーん、だんだん混乱してきた(汗
0462デフォルトの名無しさん
NGNG0463デフォルトの名無しさん
NGNG0464デフォルトの名無しさん
NGNGSCM version 5d6, Copyright (C) 1990-1999 Free Software Foundation.
;loading /home/research/lpsb/usr/local/lib/slib/require
;done loading /home/research/lpsb/usr/local/lib/slib/require.scm
を実行。
> (+ 1 2)
3
> (+ 1.0 2)
ERROR: unbound variable: 1.0
; in expression: (+ 1.0 2)
; in top level environment.
;STACK TRACE
1; (+ 1.0 2)
実数が使えません・・・。
> (sqrt 4)
ERROR: unbound variable: sqrt
; in expression: (sqrt 4)
; in top level environment.
;STACK TRACE
1; (sqrt 4)
sqrtがありません・・・。
なんで?
0465デフォルトの名無しさん
NGNG>;loading /home/research/lpsb/usr/local/lib/slib/require
>;done loading /home/research/lpsb/usr/local/lib/slib/require.scm
本当にこれしか表示されてないの。
5d5だと
> sqrt
#<CLOSURE sqrt "/usr/local/lib/scm/Transcen.scm": (z) (#@if (#@real? #@z) (#@if (#@negative? #@z) (make-rectangular 0 ($sqrt (- z))) (#@$sqrt #@z)) (make-polar ($sqrt (magnitude z)) (/ (angle z) 2)))>
てなってるから使えないんだろうって気がするけど。
+が知らない。rootで一回実行してみたら。
0466デフォルトの名無しさん
NGNG-DFLOATS せずにcompileした。
scm.info読んだんか?
http://swissnet.ai.mit.edu/~jaffer/buildscm.htmlは? と小一時間(略
0467デフォルトの名無しさん
NGNG0468デフォルトの名無しさん
NGNG0469デフォルトの名無しさん
NGNG0470デフォルトの名無しさん
NGNG0471デフォルトの名無しさん
NGNG0472デフォルトの名無しさん
NGNG0473デフォルトの名無しさん
NGNG0474デフォルトの名無しさん
NGNG0475デフォルトの名無しさん
NGNG(set! animals (cons 'ushi animals))
これは immutable object を変更することにはならないよね?
0476デフォルトの名無しさん
NGNG環境が更新されるだけ。
この辺理解してない人多いね。
0478デフォルトの名無しさん
NGNG他の関数set-car/cdr! string-set! vector-set!などは
オブジェクトに直接作用する
0479デフォルトの名無しさん
NGNGあるんでしょう?
0480デフォルトの名無しさん
NGNG0481デフォルトの名無しさん
NGNG0482デフォルトの名無しさん
NGNGDOS だけど。
http://www.nifty.com/download/dos/prog/lisp/
0483デフォルトの名無しさん
NGNGところでCやなんかと連携するとしたら、
みなさんはどういった風にやるのでしょうか?
大まかな感じでもいいので教えてもらえるとうれしいです。
0484デフォルトの名無しさん
NGNG組みこみって事かな?
とりあえずemacsでも触ってみれば?
0485デフォルトの名無しさん
NGNGPetite Chez Scheme がいいよ。
コンパイラじゃないけど、めちゃめちゃ高速
0486デフォルトの名無しさん
NGNG「みなさん」つーより、「system」によるだろ。
http://www.shiro.dreamhost.com/scheme/gauche/index-j.html
http://www.gnu.org/software/guile/
辺りを読んでみれば? (どっちもschemeだけど)
0487デフォルトの名無しさん
NGNGhttp://www.swig.org/
0488483
NGNG色々とレスありがとうございました。
自分でもよく分かってないので、要領を得ない質問になってしまい申し訳ございません。
ただ、Cとかの手続き型で書くのは面倒な部分のみをLispやSchemeで書いて、
Cとかで書いたものと組み合わせるとしたらどういった手段があるのかな?と思ったもので。
紹介してもらったものを色々調べさせてもらおうと思います。
0489デフォルトの名無しさん
NGNG例えば始めから予測がつかない処理ってのがあるでしょ。
GUIのイベントハンドリングとか。
こういった処理をいちいちコンパイルして動作確認するのは面倒。
即席なコードどんどん書いていけるから便利だとおもう。
ある程度パターン化ができるならその部分はCとかに直して効率を上げていく。
0490デフォルトの名無しさん
NGNG状態遷移表を書けばいいんじゃないの?
0491デフォルトの名無しさん
NGNG0493デフォルトの名無しさん
NGNG他のインタプリタな言語って例えば何?
LISPだとランタイム込みで数十キロ程度で済みそうだけど。
0494デフォルトの名無しさん
NGNGプログラムの中断後にいつでも再開ができる。
これはLISPのデバッグモードみたいなのより自由度高い。
メモリーイメージダンプ取るだけで状態の永続化も簡単。
外部リソースとの連携という問題もあるけど。
suspend/resume時にフック関数を呼ぶ様にすればなんとかなる。
これがあると世界が変わるよ。
他の言語でもできる事かもしれないけど。
0495デフォルトの名無しさん
NGNG0496デフォルトの名無しさん
NGNG文書の本文も文字列 "..." として埋め込むんですか?
0497491
NGNG0498デフォルトの名無しさん
NGNGことって、どんなのがありますか?
0499デフォルトの名無しさん
NGNGLisp 指向でプログラムを書く事かな。
0500デフォルトの名無しさん
NGNGとかつぶやいてみるテスト。
0501デフォルトの名無しさん
NGNGその場の継続を取得した後一旦外に脱出して、
後で再開する試みは成功するでしょうか?
(define (test)
(let ((resume #f))
(call/cc(lambda(suspend)
(with-output-to-file "test" (lambda() (call/cc(lambda(cont)
(set! resume cont)
(suspend))))) ; with
(if (not resume) (error "ポートが開けなかった"))
;ファイル'test'に"hello world\n"と出力
(display "hello world")(newline)
(resume)
)) ; suspend
)) ;let def test
0502デフォルトの名無しさん
NGNG残念ながら処理系依存。
(規格にはないけど)seekできる処理系ならdynamic-windを使って
「with-...から出たらcloseし、resume時にはopenしてseekして状態を復元する」
マクロを自分で書けるかも。
0503デフォルトの名無しさん
NGNG(define (test-open filename)
(let ((resume #f))
(call/cc(lambda(suspend)
(let ((res
(with-output-to-file filename (lambda()
(call/cc(lambda(cont)
(set! resume cont)
(suspend))))) ;call/cc
(set! resume (lambda())))) ; with
(if res (res 'ok))
))) ; suspend
(if resume (lambda()(resume (call/cc(lambda(c)c)))) #f)
)) ;let def test-open
(define close (test-open "test"))
(display "hello world")
(newline)
(close)
これで通りました。
これが何なのかというと、ネストしまくった階層の継続を取得して
普通のファイルハンドルと同じ様に持ちまれるかどうか、
の実験です。
display〜部をトップレベルで評価し、openで得た継続(ハンドル)で
状態が戻ればネストを気にせずに色々とできそうだなということで。
0504デフォルトの名無しさん
NGNG(define (test-open filename)
(let ((resume #f))
(call/cc(lambda(suspend)
(let ((res
(with-output-to-file filename (lambda()
(call/cc(lambda(cont)
(set! resume cont)
(suspend))) ;call/cc
(set! resume (lambda()))
)) ; res
)) ; with
(if res (res 'ok))
) ; let
)) ; suspend
(if resume (lambda()(resume (call/cc(lambda(c)c)))) #f)
)) ;let def test-open
(define test-close (test-open "test"))
(display "hello world")
(newline)
(test-close)
>>502
with系のポートをオープンしっぱなしという前提にすれば
再定義でできそうな気がするんですが。
0505デフォルトの名無しさん
NGNGwith〜をdynamic-wind前提で組まれると困ったりしない?
使い勝手を考えると制御用と、後始末(例外)の2つが必要な気がする。
積極的に使う場合>call/cc
0506デフォルトの名無しさん
NGNG継続の辺りの仕組みが知りたいんだけど。
0507デフォルトの名無しさん
NGNGネイティブじゃないけど、Scheme-to-C コンパイラなら。
使ったことないので、御満足頂けるかわかりませんが。
ttp://www.call-with-current-continuation.org/
0508デフォルトの名無しさん
NGNGで,ベクターの要素には当然関数の計算結果であってほしいけど,
関数を計算しない状態が要素になってしまいます.
で,色々試行錯誤した結果,
(list->vector `(,(dv 0) ,(dv 1) ,(dv 2)))
などというスマートじゃない感じで落ち着いてしまいました.
普通に関数が展開されたベクターを書くにはどのようにすればいいですか?
0509デフォルトの名無しさん
NGNGでいいはずだが。
0510デフォルトの名無しさん
NGNGvectorは自己評価式(数値や文字列と同じ扱い)なので
外部表現#(〜)の読みこみ時に内部の要素が評価されることはありません。
>>509の様に定数式で無理やり評価するか、
新規に作ったり、
(vector (dv 0) (dv 1) (dv 2))
または、既存のvectorに対して代入します。
(define vec (make-vector 3))
(vector-set! vec 0 (dv 0))
(vector-set! vec 1 (dv 1))
(vector-set! vec 2 (dv 2))
ちなみに
list->vectorは
(define (list->vector vec) (apply vector vec))
こうやって定義できます。
0511デフォルトの名無しさん
NGNG真夜中にありがとうございます.
vector-set! は,何となく気持ちが良くないので使用を控えたかったり.
使った方がなにかと楽だし,使わないとならない局面もありますけどね.
0512デフォルトの名無しさん
NGNGChez Schemeっていう、わりと気合いの入ったネイティブコードコンパイラもあるが、
有料なんだよな…(www.scheme.com。無料版はインタプリタ)
call/ccの実装方法を手軽に知りたかったらどうすればいいんだろうねえ。
もっとも素朴な方法としては、call/ccでsetjmpかつスタックをコピーしておいて、
その継続を適用するときにlongjmpかつスタックを復元すればいいんだけど。
あるいは、あらかじめプログラムの全体をcontinuation passing styleに変換すれば
ほとんど自明だが。
0513デフォルトの名無しさん
NGNGvector-set!のどの辺が気持ち悪いんだよ
0514デフォルトの名無しさん
NGNG>>512 みたいな実装するには、pthread 使えばいいと思うよ。
GCの時は、全てのスレッドを停止するか、あるいはマルチスレッド対応GC用意する必要があるけど。
0515デフォルトの名無しさん
NGNGbyte code 方式で継続サポートしてるschemeのソース見たことあるけど(Xscheme)…
いかにもbyte code VMじゃないと実装しにくそうな実装方式を使っていたなあ。
0516デフォルトの名無しさん
NGNGpthread使うと何がいいの?
スタックをコピーしやすいとか?
0517デフォルトの名無しさん
NGNG結論急いではまってしまった…
>>512 スタックのコピーなら、とりあえずUNIXのfork()と共有メモリかもねー。
ところで、例の仕様書(R5...)は、
そういう仕様(スタック・コピーによる呼び出し元への戻りの保障)
を要求しているの?
0518デフォルトの名無しさん
NGNGfork()したらset!の結果が共有できなくて困ると思うが…
だいいちコピーするのがスタックだけじゃすまない。
あ、ヒープはmmapしとくとか?
>ところで、例の仕様書(R5...)は、
>そういう仕様(スタック・コピーによる呼び出し元への戻りの保障)
>を要求しているの?
昔から、継続作ったらスタックはコピーせざるを得ない。
だって、何度でも呼び出せるんだから壊しちゃいけない。
継続作った時点でコピーするか、呼び出す時点でコピーするか。
0519デフォルトの名無しさん
NGNGmini-schemeは継続をヒープに持ってるんだけど、この方法だと
コピーが一切必要ない。
ただし、実行と共にヒープにオブジェクトをバンバン作りつづける
仕様だからgcの呼び出し回数がやたらと多くなり、そのせいで遅くなる。
(参照切らない限りgcで回収されないという仕組みを利用してる。)
この方法でもある程度は*gcによらない回収*でgcの起動回数を減らす
ことができるけどね。
それでもスピードはちゃんとコピーして別管理する処理系には及ばない。
0520デフォルトの名無しさん
NGNGまるっきりそのまま使ってる。上と同様の理由で遅い。
安全にvectorオブジェクトのネスト構造が使えないのもマイナス。
(gcソース参照。ネスト深いと死ぬ可能性あり。)
組み込み用途としてはスタックレスschemeの方がいいんだけど。
0521デフォルトの名無しさん
NGNGうん。コピーしなくても要は上書きしなけりゃいいわけなんだが。
必ず新たに作るのは、まあコピーより遅いよね。
で、>>512はCにコンパイルするには...という話じゃないの?
0522デフォルトの名無しさん
NGNG「Scheme compilerは」Cにcompileする処理系で、
Cのcontrol stackとSchemeのcontrol stackを共通にしているのってありますか?
Interpreterの実装が無理だと思うんだけど。
C--とcompilerのみの言語/処理系、という組合わせならありそうだけども。
0523デフォルトの名無しさん
NGNGインタプリタをそのSchemeで書けば良いんじゃないの?
0524デフォルトの名無しさん
NGNG結構シンプルそうなんで参考にしたいんだけど
http://www.iro.umontreal.ca/~dube/
0525デフォルトの名無しさん
NGNG本体が1600行ってことはmini-schemeより小さいね。
0526デフォルトの名無しさん
NGNGヒープの内容は、共有メモリ上に置いとけばええんでないの?
いずれにせよ、ネイティブコードで継続実装する場合、
fork() か thread使わなきゃ、
言語システムと プロセス管理の混合物作んなきゃなんないから、面倒そうだね。
0527デフォルトの名無しさん
NGNGCriticalSectionの切り替えでできるかな?
オブジェクト生成や環境へのアクセス毎に呼ばなきゃいけないから
効率は悪そうだけど、UNIXのプロセスベースよりはまし?
0528デフォルトの名無しさん
NGNG継続ってスレッドよりずっと軽くて原始的なものなので、
(少なくとも概念的には式ごとに別々の継続が出来る)
fork()とかpthreadとかの牛刀を持ち出すのはどうなんでしょう。
それに、fork()しちゃったらGCどうします?
0529デフォルトの名無しさん
NGNGVMで駆動するにしても1実行サイクル毎にCriticalSection呼ぶ
ってのでもいいかもね。ほとんどの場合I/O関係で時間食うわけだから、
I/O扱う処理直前でCriticalSectionをUnlockさせるとか。
0530デフォルトの名無しさん
NGNG"Critical Section" よくわかんないっすスマソ
UNIXのプロセスは、thread並に軽いと思うけど…
>>528 fork()したらGCどうする(略)
排他して親プロセスで共有メモリをGC または、GC専用プロセスでって、だめ?
スタックコピーが必要だっていうから、
ポータビリティ有る方法考えたつもりだったんだけど、
プロセスよりもスレッドよりも軽い継承っつうのが狙いなら、
自前でスタック管理した方がいいかもね。
0531デフォルトの名無しさん
NGNGmmapとかでやるんじゃないの?
大変そうだけど。
0532デフォルトの名無しさん
NGNGスタックのコピーが欲しいってだけなら
SCMとか参考にしてアセンブラでやったほうが良くない?
プロセスベース継続で擬似スレッド作りまくる様な
schemeのコード実行したらプロセスID枯渇するんでない?
0533デフォルトの名無しさん
NGNG昔風にいえばコルーチンを1st classにしたやつだもの
pthreadだとsignalマスクとかthread localとか優先度とか
いろいろ持ってるっしょ。
継承使ってバックトラックやるようなプログラムだと、
継承を何万も作ったりするし。
GCについてだけど、ルートであるスタックが全部見えないと
ヒープだけ見えてもGCできない。
>>531
全プロセスのスタックを親がmmapするとか?
0535デフォルトの名無しさん
NGNG>"Critical Section" よくわかんないっすスマソ
Critical Sectionは関数呼び出し程度のコストでスレッド毎の
リソースロックができる機能だったはず。
状態が
o Lock
x unlock
だとして
thread1 ooooxxxxxxxxxxxoooxxo
thread2 xxxxooooxxxxoooxxxxxx
thread2 xxxxxxxxooooxxxxxxoox
oでリソース(環境)へのアクセスしてる最中は、他のスレッドはブロックされる。
このロック機構はプロセス固有なので、
コストはWindowsのロックの中では最小。(だったはず)
0536デフォルトの名無しさん
NGNGVMの実行がヒトケタ遅くなると思はれる。
0537デフォルトの名無しさん
NGNGじゃあどうすればういいんだyo。
1命令毎に環境へアクセスする必要があるわけじゃないけど、
他のスレッドでgc発動されたら、いつのまにか現スレッドで
参照していたオブジェクトが無効になっていた、なんてのじゃ
使い物にならないよ。
0538デフォルトの名無しさん
NGNG0539デフォルトの名無しさん
NGNG普通は全部のスレッドを止める。
他のスレッドとの競合は、Schemeプログラマが排他制御
するんでは?
0540デフォルトの名無しさん
NGNG全部のthreadはどうやって止めるの?
gc発動thread以外のthreadにSuspendThread送るのかな?
いきなり止められたthreadがクリティカルな処理をしてた場合
はどうすんの?
例えばlistを生成中に他のthreadでgcによる停止が起きた場合、
作成中のlistはそのthread以外、どこにも参照されてないから
gc発動後無効objectとなったりしない?
0541540
NGNGプログラムカウンタ進めたり、計算した結果を数値objectとして
返したりする場合もロックは必要。
ロックしないで可能な事ってかなり限定的なものだと思うけど。
0542540
NGNG一番簡単なんでしょ?
全部のスレッドを止める必要はなく、各スレッドでロック機構を
使用してればどれかのスレッドでgc発動したら自然とブロック
されるわけだし。
0543デフォルトの名無しさん
NGNG例えばバイトコードをinterpretするVMの話で良いよね?
みんなが「せーの」でGCに入るのは、たしかにけっこう難しいんだよ。
だからSunのJVMはなかなかgreen threadからnative threadにできなかった。
例えば、100サイクルに1回グローバルなフラグを見て、立っていたら
スレッド内部の情報を全部GCから見えるところ(スタックとか)に書いて、
「OKだよ」とGCスレッドに言う。そして、GCが終了するまで待つ。
0544デフォルトの名無しさん
NGNG「環境アクセス」って、SchemeやLispだと「変数の読み書き」っていう意味だけど、
それでOK? ローカル変数を読むたびにいちいちロックするの?
オブジェクトの生成は、たとえばスレッドごとに1ぺーじずつ確保して
(ここはロック必要)ページを使い尽くすまではロックしないで良い。
0545540
NGNG>ローカル変数を読むたびにいちいちロックするの?
正確に言うと、自分のいるローカルな環境フレームについてです。
駆動部でそれをちゃんとやってれば、schemeコードを作る側のプログラマが
リソースの排他制御を気にする必要は無いってことですよね?
管理外のリソースは別にして。
>オブジェクトの生成は、たとえばスレッドごとに1ぺーじずつ確保して
これができればいいんですが、処理系を始めから複数スレッド前提で作る
ような気合の入った実装をしないといけないですよね・・・・。
0546540
NGNGその「待ち」と「移動」コストってどれぐらいなんですかね。
アクセス毎のロックを行うよりはマシなんでしょうか。
いっこずつ試してみたいものですが。
0547デフォルトの名無しさん
NGNGSchemeプログラムで、複数のスレッドで共有変数やデータを書き換える
なら、排他制御を意識せざるを得ないと思うが。
逆に言うと、Schemeプログラマが陽にロックを指示しない限りVMは
ロックする必要が無い。
>>546
「待ち」はOSが用意したスレッド間の同期プリミティブを使うんだろうね。
GCは短くても数msくらいはかかるだろうから、同期コストは問題にならない
のでは。
VMローカルのデータをGCから見えるところに書くのは、レジスタ変数を
スタックに退避する程度の手間でしょう。
0548540
NGNG>データを書き換えるなら、排他制御を意識せざるを得ないと
ああ、おっしゃる通りでした。
駆動部による読み書きが安全であっても論理の上で正しいのか
とは別問題でしたね。となると上位側にもロックは必要ですか。
0549540
NGNG0550540
NGNGプリエンティブにする旨みって、I/Oの部分ぐらいしかない気がする
んですけど・・・。
他に実装コストに見合ったメリットってあるでしょうか(おい
0551デフォルトの名無しさん
NGNG0552デフォルトの名無しさん
NGNG括弧を見てるとめまいがする
0553デフォルトの名無しさん
NGNGそこが(・∀・)イイ!んだけど?
0554デフォルトの名無しさん
NGNG0555デフォルトの名無しさん
NGNG0556デフォルトの名無しさん
NGNGなってよろしくない。Lisp プログラムは字下げで読むべし。
0557デフォルトの名無しさん
NGNG> Scheme→Cへのコンパイラを作って、
> インタプリタをそのSchemeで書けば良いんじゃないの?
そのインタプリタが動く時のcontrol stackじゃなくて、
インタプリタが実行するプログラムの方のcontrol stackです。
対象がインタプリタだろうが何だろうが、コンパイルすれば、
control stackを共通化するのは比較的簡単です。
0558デフォルトの名無しさん
NGNGカウントアップしながら出力するコードでベンチ取ったら、
VisualC++6SP4:10秒
おれscheme:13秒
でした。
結構いい線いってる?
(ほとんどコンソールの出力に時間取られてるんだろうけど)
0559デフォルトの名無しさん
NGNG0560デフォルトの名無しさん
NGNGおれschemeでは5000回に一回ほどgcが起動する割合。
Cのソース
#include <stdio.h>
#include <time.h>
main() {
int i;
time_t start = clock();
for (i = 0; i < 100000; i++)
printf("%d\n",i);
printf("interval %d\n",clock() - start);
}
Cのコンパイルオプション
cl /O2 /GB /Og /GA /Ob2 /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /YX /FD test1.c
schemeのソース
(define (call-with-time expr)
(let ((starttime (clock)))
(unwind-protect
(lambda () (expr))
(lambda () (display* "interval " (- (clock) starttime) (newline)))
)))
(define-macro (wt . body)
`(call-with-time (lambda () ,@body))
(define-macro (donum var s e inc . body)
(let ((loop (gensym))(comp (gensym)))
`(let ((,comp (if (<= ,s ,e) < >)))
(let ,loop ((,var ,s))
(if (,comp ,var ,e)
(begin ,(cons 'begin body)
(,loop (+ ,var ,inc)))
,var)))))
(wt(donum i 0 100000 1 (display i)(newline)))
0561デフォルトの名無しさん
NGNG自作しろとは言わないけど、隅々まで知ってる処理系
持ってるにこしたことない、とは思う。
0562デフォルトの名無しさん
NGNG静かな湖畔の♪
0563デフォルトの名無しさん
NGNG>>>523
>> Scheme→Cへのコンパイラを作って、
>> インタプリタをそのSchemeで書けば良いんじゃないの?
>
>そのインタプリタが動く時のcontrol stackじゃなくて、
>インタプリタが実行するプログラムの方のcontrol stackです。
>
>対象がインタプリタだろうが何だろうが、コンパイルすれば、
>control stackを共通化するのは比較的簡単です。
? 意味が分からない。
共通化できたんなら良いのでは。
誤解してると逝けないので言い直すと、
「まずコンパイラを作る。
インタプリタはそのコンパイラを使って『すなおーに』実装する。
(define (eval exp env) ...)と言うように。
(インタプリタからコンパイルされたprocedureを呼び出す
プリミティブだけはCで用意しておく。)
その結果、インタプリタとコンパイラで実行環境が全く共通の
処理系ができる。」
つまり、インタプリタは自分でスタックを管理したりせずに、
Schemeの関数呼び出しや継続の機能をそのまま使えばよい。
0564デフォルトの名無しさん
NGNG入出力とかじゃなくて、アッカーマン関数とかで試そう!
http://www.bagley.org/~doug/shootout/からパクリ。
(define (ack m n)
(cond ((zero? m) (+ n 1))
((zero? n) (ack (- m 1) 1))
(else (ack (- m 1) (ack m (- n 1))))))
話がそれるけど、http://www.bagley.org/~doug/shootout/は
いろんな言語のマイクロベンチマークがあっておもしろいよ。
0565558
NGNGその辺の色々ためしたら全体的に2倍以上遅いことがわかった。
短い夢だったよ。
でもインタプリタとしてはコレ以上速くなるとは正直思えない。
0566デフォルトの名無しさん
NGNG2倍くらいしか違わないインタプリタが作
れたなら何かとんでもない大発明をやらか
したものと思われる。
ぜひ公開して世界を驚かせてくれたまえ。
0567558
NGNG結構ちょろいね。大発明なんて。
セルの再利用とかキャッシュ組みこんでるだけなんだが。
まあそれなりに苦労はしたけど。
あ、公開は勘弁してくれ((((;´Д` )))))ガクガクブルブル
0568デフォルトの名無しさん
NGNGどうみてもただの勘違い。
C/C++で書いたインタプリタでC++ネイティブの1/2の性能が
でるわけがない。
足し算1回するのに必要な機械語命令数を考えればわかる。
0569デフォルトの名無しさん
NGNGまあ、そんな物凄い勢いで否定せんでもいいだろ。
2倍*以上*とかかいてるし。
たぶん特定条件でせまるって事はありえると思うよ。
0570デフォルトの名無しさん
NGNG(行列演算プリミティブを用意するというのはナシで。)
0571デフォルトの名無しさん
NGNG(define (make-matrix n v)
(make-vector (* n n) v))
(define (mref matrix size x y)
(vector-ref matrix (+ (* size x) y)))
(define (mset! matrix size x y v)
(vector-set! matrix (+ (* size x) y) v))
(define (matrix-* m1 m2 size)
(let ((result (make-matrix size 0.0)))
(do ((i 0 (+ i 1)))
((>= i size) result)
(do ((j 0 (+ j 1)))
((>= j size))
(do ((k 0 (+ k 1))
(sum 0.0 (+ sum (* (mref m1 size i k)
(mref m2 size k j)))))
((>= k size)
(mset! result size i j sum)))))))
(define (mat-bench size)
(matrix-* (make-matrix size 1.0)
(make-matrix size 1.0)
size)
#t)
(mat-bench 500)
mrefやmset!はマクロでも良いよ。
これがCやC++の倍の時間でできる?
手元の処理系だと100倍くらいかかったけど。
0572デフォルトの名無しさん
NGNG0573名無しさん@Emacs
NGNGApplyFunc の中でクロージャの場合、
SaveEval(EndClosure, evEnv, NIL) でスタックつんでいるから、
真の末尾再帰ではない、というのは正しいでしょうか?
0574デフォルトの名無しさん
NGNG0575デフォルトの名無しさん
NGNGenum {A,B,C,D};
switch (type) {
case A:return B;
case B:return C;
case C:return D;
case D:return A;
}
みたいな比較を
schemeで簡潔にやるとしたらどうなるんですか?
(define A 0)
(define B 1)
(define C 2)
(define D 3)
(case type
((A)B)
((B)C)
((C)D)
((D)A))
とやると、シンボルの比較になってしまう様ですが。
(cond
((= type A)B)
((= type B)C)
((= type C)D)
((= type D)A))
とするしかないでしょうか。
0576デフォルトの名無しさん
NGNGLispだとシンボルのまま使えて便利じゃん!
0577デフォルトの名無しさん
NGNG連想リストつかったら?
0578デフォルトの名無しさん
NGNG0579573
NGNGError: foo : insufficient memory
となったよ。
やっぱり、minischeme のようにスタック積む時は、
つねに環境も一緒につんだ方がいいのかね。
そんで、スタック戻すときに環境も戻す。
0580デフォルトの名無しさん
NGNG> つまり、インタプリタは自分でスタックを管理したりせずに、
> Schemeの関数呼び出しや継続の機能をそのまま使えばよい。
インタプリタの実行するプログラムは動的に変わるから無理。
> (define (eval exp env) ...)と言うように。
> (インタプリタからコンパイルされたprocedureを呼び出す
> プリミティブだけはCで用意しておく。)
> その結果、インタプリタとコンパイラで実行環境が全く共通の
> 処理系ができる。」
「実行環境」って何の事言ってるの?
envはどうやって実装するの?
0581デフォルトの名無しさん
NGNGハァ?
>「実行環境」って何の事言ってるの?
制御スタック。それを共通化したかったんじゃないの?
>envはどうやって実装するの?
alistでいいんじゃない?
凝った事したければcasual shallow bindingとか使っても
良いけどさ。
0582デフォルトの名無しさん
NGNG・applyは組み込み関数として用意しとく。
・evalはSchemeで書く。
例えばifの処理は
(eval (if 式1 式2) env)
≡ (if (eval 式1 env) (eval 式2 env))
(eval (if 式1 式2 式3) env)
≡ (if (eval 式1 env) (eval 式2 env) (eval 式3 env))
となるようにすれば良い。
λ式を評価するときは、
(eval λ式 env)
≡ (lambda args
(eval λ式の本体
(extend-env λ式の引数部 args env)))
とする。
(≡の右辺はコンパイルされてprocedureになることに注意。)
(eval (関数 . 実引数) env)
≡ (apply (eval 関数 env) (eval-list 実引数 env))
としてしまえば良い。
・あとはread-eval-printループを書く。
これだけでtail-recursiveなインタプリタができるし
call/ccの処理もできるだろ?インタプリタ用の実行時
スタックなんて陽に用いる必要はない。
(こんなの、よくある手法だと思うが。)
0583デフォルトの名無しさん
NGNG> インタプリタ用の実行時
> スタックなんて陽に用いる必要はない。
> (こんなの、よくある手法だと思うが。)
必要があるかどうかじゃなくて、
もともと継続をforkやthreadでという話からの流れで、
そんなことやっている実装はないんじゃないの、と言う話をしているんです。
あなたの例では、インタープリットされるプログラムのコントロールスタックは、
インタープリター自身の局所変数ですね。Lisp 1.5と同じ。
> 制御スタック。それを共通化したかったんじゃないの?
全然一緒になってないよ。
継続を実装する時に、「制御」について別の扱いしないといけないでしょ。
0584デフォルトの名無しさん
NGNG>あなたの例では、インタープリットされるプログラムのコントロールスタックは、
>インタープリター自身の局所変数ですね。Lisp 1.5と同じ。
コントロールスタックという言葉の意味が分かっているか?
上のインタプリタのコードで、環境はenvというインタプリタの
変数として陽に表されているが、コントロールスタックはコードの
どこにも出てきていない。(コンパイラの実現する機能をそのまま
使っている。)
>全然一緒になってないよ。
>継続を実装する時に、「制御」について別の扱いしないといけないでしょ。
やっぱり全然分かってなかったか。
call/ccという組み込み関数は当然すでに用意してあるわけだろ?
で、それを組み込み関数applyで呼び出すだけでcall/ccはすでに
インタプリタで実現できている。別の扱いなんか必要ない。
理解できなかったらやってみ。
0585デフォルトの名無しさん
NGNGふつ〜、リスト処理を内部的にスタックや配列に置き換える
0586デフォルトの名無しさん
NGNGインタプリタの話か?
まさかconsが配列処理するってんじゃないだろうな。
コンパイラがある処理系でインタプリタの速度気にしてどうする?
0587デフォルトの名無しさん
NGNGインタープリタのプリミティブ呼び出しばっかりでちっとも速そうじゃなかったっけ。
CommonLispでも、型宣言もどき入れれば、Cと等価な使い方ができるコード吐きそうなもんだけど、(経験なし)
0588デフォルトの名無しさん
NGNGSchemeチップではどーなんでしょうね?
0589デフォルトの名無しさん
NGNGcdr-codingの事を言ってるならあれはメモリ節約のためで
速度は速くならない(まあGCが減れば速くなるが)。
特にrplacdした時が悲惨。
いずれにせよ巨大マイクロコードの終焉とともに消えた
技術。
0590デフォルトの名無しさん
NGNGうまく型宣言するとCで書いたのと同じコードが出る場合もある。
KCLレポートにtakの例が載っていたはず。
0591デフォルトの名無しさん
NGNG>速度は速くならない
LispMachine のマイクロ・コードだとそなの?
でも、どこにあるかわからないポインタ辿るのと、
配列の次の要素へアクセスするのと、
ではキャッシュのヒット率が違うと思うけど。
0592デフォルトの名無しさん
NGNGどんなお話でしたっけ?
0593デフォルトの名無しさん
NGNGコピーGCでも似た効果(リストのセルが連続した番地に並ぶ)
は得られる。
0594デフォルトの名無しさん
NGNGリストを使わない等価な処理でごまかしてもいいんではないか?と煽ってみる。
0595デフォルトの名無しさん
NGNG(setq x '(a b c))
(setq y (cdr b))
として、a b cへのポインタが連続して並んだとする。
x→a
y→b
c
(rplacd x 1)
したときに、(b c)を上書きして壊すわけにはいかないので
forwarding pointerという「見えないポインタ(勝手にたどる
ポインタ)」をaの場所にいれ、他にセルを割り当てて、
x→→(a . 1)
y→b
c
としなければならない。nreverseとかやっちゃうと大惨事。
0596デフォルトの名無しさん
NGNGリスト処理を内部的には可変長配列で実装し直したという
歴史があったような。
0597デフォルトの名無しさん
NGNG主に線形のリストしか使わず、書き換えもあまりしないなら
良いかも。挿入は遅くなると思うが。
0598デフォルトの名無しさん
NGNGSchemeチップはcdr-codingしてないよ。
GCでコンパクションGCはしてたけど。
「次期バージョンではphantom stackを使う」
とストールマンが書いていたが、本当にそういうチップが
作られたかは不明。
0599デフォルトの名無しさん
NGNGどないでしょうか?特にネイティブ・コード重視の場合。
>>全然一緒になってないよ。
>>継続を実装する時に、「制御」について別の扱いしないといけないでしょ。
>
>やっぱり全然分かってなかったか。
>call/ccという組み込み関数は当然すでに用意してあるわけだろ?
>で、それを組み込み関数applyで呼び出すだけでcall/ccはすでに
>インタプリタで実現できている。別の扱いなんか必要ない。
0600デフォルトの名無しさん
NGNG環境や継続を生成しない場合だけスタックフレームを解放して、
それ以外はスタックがどんどん伸びていく?
0601デフォルトの名無しさん
NGNGにある
A portable implementation of first-class continuations for unrestricted interoperability with C in a multithreaded Scheme -- page 65
Marc Feeley, DIRO, Universitat de Montreal, Montreal, Canada
はどうか。上のほうでも誰か言ってたけど、pthreadとか普通のスレッドを利用して
call/ccを実装するっていう。
0602デフォルトの名無しさん
NGNG走ってるthreadのコピーを作る事って、可能でしょうかね。
もし可能なら、手抜きポータブル継続実装に使えそうですね^^)
0603601
NGNG必要はないと思ったのだが、理解に自信がなくなってきたので出直してきますsage
0604デフォルトの名無しさん
NGNG0605602
NGNGこんな感じでしょうか?
・継続を含むSchemeとCの相互運用を実現するために、[KBD98]が提案した
「C threadを使ってポータブルにCのスタック・コピーと実行をする」方法を
Gambit-C という実装系で採用しようと検討している。
並列動作が主目的ではないため、thread切替のオーバー・ヘッド (2ms)が、
すんげー気に入らない。
・C thread (win32, POSIX, SUN LWP)は、
スレッド生成時に、任意のスタックを与える事ができる。
(従って、継続したいスレッドのスタックをコピーして、
新規スレッドに渡せば、継続の繰り返し実行も可能な感じ。
但し、論文ではCの関数は one shot だと言って、
副作用があるから面倒そうな事を言っている。)
0606602
NGNGけきょーく、Scheme コンパイラで継続実装するには、
a. Schemeのローカル変数フレームを、最初からヒープ上に置くか、
b. 実装言語 (Cとか...)のスタック上に混在させておいて、
継続の必要が生じてから、ヒープ上へ移す
ってあたりが、正解っぽいですね。
もっと良い実装もあるかもしれないけど...。
0607デフォルトの名無しさん
NGNGc. 継続が作られた段階で使われているスタックエリアを切り離し、
継続が呼ばれたらそれをアクティブスタックエリアにコピーする、
というのもあり。ChezSchemeがそうしてるんじゃないかと。
Robert Hieb, Kent Dybvig, Carl Bruggeman, "Representing Control
in the Presence of First-Class Continuations", ACM Sigplan Notices,
25(6), June 1990. とかでそれぞれの方法が議論されてる。
0608デフォルトの名無しさん
NGNG> コントロールスタックという言葉の意味が分かっているか?
> 上のインタプリタのコードで、環境はenvというインタプリタの
> 変数として陽に表されているが、コントロールスタックはコードの
> どこにも出てきていない。(コンパイラの実現する機能をそのまま
> 使っている。)
あの〜、再帰で通訳した場合、
「式」を押さえているpointerがcontrol stackになってるんですよ?
Lisp1.5やSECD machineやInterLispの実装考えれば分かるでしょ?
"ret"でprogram counterにstackから番地戻すんじゃなくて、
再帰から帰ったら、局所変数が押さえてるの。
> call/ccという組み込み関数は当然すでに用意してあるわけだろ?
> で、それを組み込み関数applyで呼び出すだけでcall/ccはすでに
> インタプリタで実現できている。別の扱いなんか必要ない。
ネイティブ・コンパイラの実装の話しているのは理解できているの?
スレの上の方から読み直してみ。(ふぅ)
>>606
そういうことだと思うよ。コンパイラについては。
>>601
pthreadの生成死滅のコストが高いから、
継続の生成死滅が激しいとパフォーマンス悪そうだけど、面白そうね、これ。
0609606
NGNGそっすね。
継続作成時にスタックのスナップショットを、ヒープに退避して、
実行用ローカル変数フレームは、常にスタック上に置いた方が、
シンプルそうっすね。
>>608
threadの並列実行機能抜きで、
stack dump/stack undump専用のシステムコールとか、
ポータブルなライブラリがあれば便利っすね。
0610デフォルトの名無しさん
NGNG>「式」を押さえているpointerがcontrol stackになってるんですよ?
>Lisp1.5やSECD machineやInterLispの実装考えれば分かるでしょ?
InterLispは知らんが、他はどれも違う。
なんで式が「control」でLisp1.5の万能関数の
どこに「stack」があるんだよ。
ひょっとしてSECDマシンのSとかCが関係あると思ってる?
C言語の制御スタックに相当するのは当然Dでしょ。
で、俺のやり方で何がまずいかを言ってみろよ。
>"ret"でprogram counterにstackから番地戻すんじゃなくて、
>再帰から帰ったら、局所変数が押さえてるの。
「control」の意味が分かってないと思われ。
再帰から「返る」機能自体を実現するのがcontrol stackだよ。
で、Cでの実装では、そこにコンパイルコードの環境を一緒に
置くかも知れない。そうでないかも知れない。インタプリタを
Schemeで書けばそれはどちらでも気にしなくて良い。
>ネイティブ・コンパイラの実装の話しているのは理解できているの?
>スレの上の方から読み直してみ。(ふぅ)
あんたはそのつもりかも知れんがこの流れのもとは、
522 :デフォルトの名無しさん:02/05/02 11:13
>>521
「Scheme compilerは」Cにcompileする処理系で、
Cのcontrol stackとSchemeのcontrol stackを共通にしているのってありますか?
Interpreterの実装が無理だと思うんだけど。
C--とcompilerのみの言語/処理系、という組合わせならありそうだけども。
だろ。つまり「SchemeからCへのコンパイラがとにかく既に存在する」
場合に、コンパイラ以前か以後かはともかく「どうやってインタプ
リタを実装するか」という疑問に答えただけだ。
0611デフォルトの名無しさん
NGNGCのスタックは使わずにトランポリンを使う方法
だろう。
他に「決してreturnせず、ときどき大きくlongjmp
する」という方法もあるけど。
http://linux.rice.edu/~rahul/hbaker/CheneyMTA.html
0612デフォルトの名無しさん
NGNGまあまあ。
Common Lispだと確かにコンパイラを先に作って、インタプリタを
Lisp-in-Lispとして作ってある処理系が多いよね。Spice LispもZeta Lispも、
S-1 Common Lispもそうだ。CMU Common Lispもそうだったはず。
これらの処理系だと、インタプリタが独自に実行時スタックを持ったりはして
いない。Lisp 1.5はコンパイラの方が後だが、スタックはどうしたんだろうね。
たぶんインタプリタにあわせたコードをコンパイラが出したんじゃないか?
call-with-continuationなんて無いから別に難しくないだろう。
0613デフォルトの名無しさん
NGNGSchemeでは知らないな〜、知ってる?
0614デフォルトの名無しさん
NGNGInterLisp風のstacklet list使ってややこしいことやっていたような…
0615デフォルトの名無しさん
NGNG68HC11がなんとかって書いてあるから、そのままx86じゃ無理でしょうか。
(無理やりコンパイルしたら駄目だった)
Bit - Implantation compacte de Scheme
http://www.iro.umontreal.ca/~dube/
0616デフォルトの名無しさん
NGNG無謀?
0617デフォルトの名無しさん
NGNGアリモノは、PerlやAwk よりは少なさそうだけど。
>>615 おーっ、面白そうな処理系。クロス・コンパイルして組込みでも
使えるよ、ってのがウリなのか。x86 の 赤帽 7.2 で動いたよ。
適当なコードを作っといて、他の scheme でバイト・コンパイル。
scm> (load "./bit.scm")
scm> (byte-compile "foo.scm" "foo.c")
で、C でコンパイルして、a.out を実行。
gcc foo.c bit.c
./a.out
と、README 通りでいけたけど。
0618デフォルトの名無しさん
NGNG結果うまく表示できる?
write-charしか出力関数が無いみたいだけど
それもなんだかうまく動かなかった。
(何を出力してもヌル文字しか出て来ない。)
0619615
NGNGありがとうございます。byte-compileうまくいきました。
まだ動かしてはないけど。
(他の処理系から読みこませる発想だとは思わなかった。)
bit.scm自身をコンパイルして動かせるのかな?
byte-compileは通ってしまったけど。
0620615
NGNGdisplayとかの他の出力系はlibrairie.scmに入ってますよ。
bit.scmの中にlibrairie.scmをロードする部分があるんで、
それをパス合わせすれば大丈夫かと。
0621デフォルトの名無しさん
NGNG0622615
NGNGこっちもbccでコンパイルは通るけど一般保護で落ちるし。
0623デフォルトの名無しさん
NGNG0624デフォルトの名無しさん
NGNGそれをダウソできるとこってどっかにないの?
0625デフォルトの名無しさん
NGNGwget できないかな?
0626デフォルトの名無しさん
NGNGhtmlもあった。でもそのうち消えた。
0627デフォルトの名無しさん
NGNGふつーのダウソツールでおっけーなんじゃ
0628デフォルトの名無しさん
NGNGにwgetのスクリプトがあって無事ダウソできました。
>>626
本家にpsでありましたよね。むかし・・・。
0629デフォルトの名無しさん
NGNGttp://www.unixuser.org/~euske/doc/niwatori/index.html
つーのがあった。scheme。
こういう解析処理ってググってもあんま見つからないな。
0630高校生の女の子の感覚で、埴輪鶏ってどうよ?
NGNGLisp Schemeからは外れるけど、
オープン・ソースの検索エンジン「Namazu」って結構普及しているよね。
# MS Index Server / Contents Index って結構アレだし。
んで、その検索エンジンは、膠着語である日本語の文節を分割する目的で、
形態素解析エンジン(NAMAZUの場合JUMAN,茶筅)を使ってるよ。
0631デフォルトの名無しさん
NGNGかな文の文節を区切る目的で、形態素解析エンジン使ってるよね
ICOTオープン・ソース・アーカイブへ逝くと、
自然言語処理用の CESPソースがあるけど、
Lispソースはなかったかな?
0632デフォルトの名無しさん
NGNGどうでしょう。
(define (sexpr->html s)
(define (put-tag-with-attr tag)
(if (pair? tag)
(let loop
((x tag))
(cond
((pair? x)
(display (car x))
(if (pair? (cdr x)) (write-char #\space))
(loop (cdr x)))
(else)))
(display tag)))
(define (put-tag-omit-attr tag)
(if (pair? tag)
(display (car tag))
(display tag)))
;ここから
(if (pair? s)
(let ((tag (car s)))
(write-char #\<)
(put-tag-with-attr tag)
(write-char #\>)
(newline)
(if (nlength? 1 (cdr s))
(begin
(for-each sexpr->html (cdr s))
(write-char #\<)
(write-char #\/)
(put-tag-omit-attr tag)
(write-char #\>)
(newline))))
(display s)))
0633デフォルトの名無しさん
NGNG(define source
((html "lang=\"ja\"")
(head
((META
"http-equiv=\"Content-Type\" content=\"text/html; charset=Shift_JIS\""))
((link "rev=\"made\" href=\"mailto:[email protected]\""))
(title "更新履歴"))
(body
(h1 "更新履歴")
(hr)
(p "2002/05/11 Version 1.00")
(ul (li "新規作成") (li "公開")))))
;変換結果
(sexpr->html source)
<html lang="ja">
<head>
<META http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
<link rev="made" href="mailto:[email protected]">
<title>
更新履歴</title>
</head>
<body>
<h1>
更新履歴</h1>
<hr>
<p>
2002/05/11 Version 1.00</p>
<ul>
<li>
新規作成</li>
<li>
公開</li>
</ul>
</body>
</html>
0634デフォルトの名無しさん
NGNGタグの中に属性がある場合は、タグ名の部分をリストにして、
そのリストにタグ名と属性を入れる。
<html lang="ja">ほげほげ</html>
の場合、((html "lang=\"ja\"") ほげほげ)
0635デフォルトの名無しさん
NGNG0636デフォルトの名無しさん
NGNG;リストlが長さn以上ならば#t
(define (nlength? n l)
(pair? (list-tail l (- n 1))))
0637デフォルトの名無しさん
NGNGこれとか参考にしたら
http://okmij.org/ftp/Scheme/SXML.html
0638デフォルトの名無しさん
NGNG0639632
NGNGこっちは非常に面倒そうですが。(トークンの切り分けや省略タグの扱いとか)
>>637
うーん、ソース見たら結構大きいんですけど、
もうちょっとコンパクトなやつないですか?
>>638
キーワード付き引数とは?
(html (@ (lang "ja"))ほげほげ) ;@が属性
みたいな感じでしょうか。
0640デフォルトの名無しさん
NGNG結構短くまとまってるね
0641デフォルトの名無しさん
NGNG既存のHTMLソース読みこませないと問題点がはっきりしないと思う。
0642デフォルトの名無しさん
NGNGHTMLの場合、省略可能タグのせいで、ただのタグの切り分け
だけではどうしようもない問題がある。
単に、
<body>
<h1>
更新履歴</h1>
<hr>
<p>
2002/05/11 Version 1.00</p>
</body>
というデータを何も考えずにパースすると、
(body (h1 "更新履歴") (hr (p "2002/05/11 Version 1.00")))
となり、間違った構造になる。
hrやbrなどは例外的に処理しないと駄目っぽい。
0643デフォルトの名無しさん
NGNGそうだね。
あとは<B></B>なんかの範囲タグは中身が無くても省略できなかったりするから、
その辺を別途切り分けできれば結構使える様になると思う。
0644デフォルトの名無しさん
NGNGHTML文書 ::= (ノード...)
ノード ::= (タグ 属性リスト ノード...) | 文字列
タグ ::= シンボル
属性リスト ::= ((属性名 . 属性値) ...)
属性名 ::= シンボル
属性値 ::= 文字列
(define source
'(html ((lang . "ja"))
(head ()
(meta ((http-equiv . "Content-Type")
(content . "text/html; charset=Shift_JIS""))
(link ((rev . "made") (href . "mailto:[email protected]")))
(title () "更新履歴")))
(body ()
(h1 () "更新履歴")
(hr ())
(p () "2002/05/11 Version 1.00")
(ul () (li "新規作成") (li "公開")))))
0645デフォルトの名無しさん
NGNG(if (string? node)
(display node)
(let ((tag-name (symbol->string (car node))))
(newline)
(display (string-append "<" (car node)))
(for-each (lambda (pair)
(display " ")
(display (car pair))
(display "=")
(write (cdr pair)))
(cadr node))
(display ">")
(for-each sexpr->html (cddr node))
(newline)
(display (string-append "</" (car node) ">")))))
0646デフォルトの名無しさん
NGNG短くなったね。
属性は
(meta ("http-equiv=\"Content-Type\"" "content=\"text/html; charset=Shift_JIS\""))
程度でもいいとおもうけど。なんか真面目に切り分けしても無駄っぽいし。
あとは属性無し、中身無しのタグは(hr)(br)の様にするとか。
これがXMLだとcase-sensitiveな問題とか出てくるんだろうな。
html->sexprが待たれるところだけど、こっちはほんとに面倒そう。
0647632
NGNGまだ中途半端ですが、一応それなりの動作をするものができました。
(html->sexpr "HTMLファイル名")
とするとS式が出てくる筈です。
ただし、タグと属性は1つの文字列になります。
2ちゃんのログを読みこませても大丈夫な様です。
各自でpretty-printしてください。
長いのでこうしました。
(define (substring? key d . opt) (let ((pos (if (pair? opt) (car opt) 0))
(dlen (if (and (pair? opt) (pair? (cdr opt))) (cadr opt) (string-length d))))
(and (<= (string-length key) dlen) (let loop ((i pos) (match 0)) (cond ((=
match (string-length key)) (- i match)) ((< i dlen) (if (char=? (string-ref
key match) (string-ref d i)) (loop (+ i 1) (+ match 1)) (loop (+ (- i match)
1) 0))) (else #f))))))
(define (first-token s) (if (string? s) (let ((pos (substring? " " s))) (if
pos (substring s 0 pos) s)) s))
0648632
NGNG(r '())) (if (or (eof-object? c) (char=? c endc)) (list->string (reverse r))
(loop (read-char) (cons c r))))) (with-input-from-file fn (lambda () (let loop
((c(read-char)) (stack '())) (cond ((eof-object? c) (if (pair? stack) (car
stack) stack)) ((char=? c #\<) (let ((tag (read-token #\>))) (if (char=? #\/
(string-ref tag 0)) (let* ((x (substring tag 1)) (v (find (lambda (s) (if
(string-ci=? (first-token x) (first-token (car s))) (car s) #f)) stack)))
(if v (let loop1 ((stack stack) (r '())) (if (not (eq? v (caar stack)))
(loop1 (cdr stack) (cons (cons (caar stack) (cdar stack)) r)) (begin
(set-cdr! (car stack) (append (cdar stack) r)) (if (pair?
(cdr stack)) (begin (set-cdr! (cadr stack) (append (cdadr stack) (list (car
stack)))) (loop (read-char) (cdr stack))) (loop (read-char) stack))))) (begin
(stdout-puts "警告:" tag "は対応関係が異常です") (loop (read-char) stack))))
(begin (if (memv (first-token tag) *omit-tag-list*) (begin (set-cdr! (car stack)
(append (cdar stack) (list (list tag)))) (loop (read-char) stack)) (loop
(read-char) (cons (list tag) stack))))))) (else (let ((s (string-append (string
c) (read-token #\<)))) (if (pair? stack) (set-cdr! (car stack) (append (cdar
stack) (list s))) (stdout-puts "警告:" s "はばどのタグにも所属してません"))
(let ((xc (peek-char))) (if (eof-object? xc) (loop xc stack) (loop #\< stack
))))))))))
stdout-putsは強制的に標準出力などに吐くputsです。
(with-input-to-fileを使用してるので)
putsは最後に改行するdisplay*です。
display*は引数リスト全てにdisplayを適用する関数です。
0649632
NGNG(define *omit-tag-list*
'("br" "BR" "hr" "HR" "meta" "META" "input" "INPUT"))
0650デフォルトの名無しさん
NGNG本来なら「今はliの中だから、来て良いタグはこれとこれ」という
文脈情報を使って、<p>や閉じてない<li>を処理するんだろうね。
この辺をデータ駆動にしてきちんとやるとSGMLパーザになっちゃう。
難しさは、
SGML parser >> validating XML parser >> non-validating XML parser
だから、右から作っていかない? XHTML目標で。
0651632
NGNG(define (get-href s)
(define (proc x)
(if (string-ci=? (first-token x) "A")
(let ((pos (substring-ci? "href" x)))
(if pos
(puts (substring x pos))))))
(define (seq x)
(if (pair? x)
(cond
((pair? (car x))
(begin (seq (car x)) (for-each seq (cdr x))))
((string? (car x)) (proc (car x)) (for-each seq (cdr x)))
(else (for-each seq (cdr x)) ))
#t))
(seq s))
0652632
NGNGその辺は一応考えてみました。(*omit-tag-list*参照)
ただ、こちらの思いこみで処理を書いてる可能性が多々有るので、
あれで全てうまくいくかどうかは判りません。
それと、HTMLのコメントを考慮して無かったので、<!-->〜などはネスト
してしまいます。ブラウザはそんな出力も一応読みこんでくれてますが。
>>644
そういう風に単純化できるとは思いつきませんでした。
現在、タグと属性の分割方法を検討してます。
(できればhtml->sexprも短くして欲しい・・・)
>>650
あんまり厳密にやろうとすると工数ばっかり掛かる(割にあまり面白くなさそうな)
んで、とりあえず今回はこれにちゃんとしたタグと属性を付ける所までを目指します。
ところで、
>SGML parser >> validating XML parser >> non-validating XML parser
HTMLはどこに当てはまるんでしょうか?
思ったより素のschemeで文字列処理をするのはしんどいです。
特に、文字をlistで溜め込んだり、substringで新しい文字列を作って抜き出す
事に抵抗を感じたりします。(直接オフセットが使えないもどかしさ、等)
Guileは共有文字列とかいうのでこの辺のコストを軽減できるみたいですが、
良さそうな方法は無いでしょうか。
0653デフォルトの名無しさん
NGNGchar-listを作って、最後にreverse & list->string
どっちがいいんだろうねえ
0654デフォルトの名無しさん
NGNG何のためのLisp/Scheme, GCか?
考えずにGC任せもまたよし。
0655デフォルトの名無しさん
NGNGプログラムが正しいかを証明するプログラムを作れますか?
プログラムが正しいかを証明するプログラムが正しいかを証明するには
プログラムが正しいかを証明するプログラムで正しいかを証明する事で、
プログラムが正しいかを証明するプログラムが正しいかの証明になりますか?
0656デフォルトの名無しさん
NGNGプログラムが正しいかを証明するプログラムが正しいかを証明するには
プログラムが正しいかを証明するプログラムでは役不足だ。
プログラムが正しいかを証明するプログラムが正しいかを証明するプログラム
でないと証明できない。
0657デフォルトの名無しさん
NGNG0658デフォルトの名無しさん
NGNGプログラムが正しいかを証明するプログラムが正しいかを証明するプログラム
を作らないと駄目って事ですか?
プログラムが正しいかを証明するプログラムが正しいかを証明するプログラム
が正しいかを証明するにはどうしたらいいんですか?
0659デフォルトの名無しさん
NGNGプログラムが正しいかを証明するプログラム
で十分。
0660デフォルトの名無しさん
NGNGなんとなく。
0661デフォルトの名無しさん
NGNG0662デフォルトの名無しさん
NGNGいう意味かによる。これらを定義せんと作れるとも作れないとも
言えん。
例えば、「1階の型付きλ計算のプログラムが任意の引数につい
て停止して正しい型の値を返すかどうか」なら判定できる。
「オレが思う通りの結果をちゃんと返すかどうか」なら、「オレ
が思う結果」(仕様)をきちんと書いて入力に渡す必要がある。
「任意のSchemeプログラムが、ある引数について停止するかどう
か」なら、そういう判定をするプログラムは書けない。
0663デフォルトの名無しさん
NGNG>>SGML parser >> validating XML parser >> non-validating XML parser
>HTMLはどこに当てはまるんでしょうか?
HTMLの文書型定義をデータとして与えて動くようなものならSGML parserそのもの。
HTML専用にハードコードしてあるなら、validating XMLとどっちが楽だろ?
0664デフォルトの名無しさん
NGNG>(できればhtml->sexprも短くして欲しい・・・)
考え方だけだけど...
(define (parse-node tag attributes sub-tags)
(let ((subnodes '()))
(case current-token
(tag
(let ((desc (assq token-value dtd)))
(or (null? desc)
(begin
(next-token)
(parse-node (car desc)
(parse-attributes (car desc))
(cdr desc))))))
(close-tag
(if (eq? token-value tag)
(next-token))
`(,tag ,attributes ,(reverse subnodes)))
(text
(set! subnodes (append-text token-value subnodes))))))
ただし、next-tokenは、次のトークンを1つ読み込んで、その種類を
current-tokenに、値をtoken-valueに入れる手続き。
読んだ文字列 current-token token-value
<TAGNAME tag シンボルTAGNAME
> gt 不定
</TAGNAME> close-tag シンボルTAGNAME
= eqsign 不定
" quote 不定
それ以外 text 文字列(空白または区切り記号まで)
変数dtdには、(TAGNAME その中に直接あらわれるTAG名のリスト)
のリストが入っている。
(define dtd '((html head body) (body ul ol p ... ) (ul li) ...))
(append-text string list)
は、リストの先頭が文字列なら、その後ろに空白とstringをappendし、
文字列でなければリストの先頭にstringをconsしたリストを返す。
(parse-attributes tag)は、「attrib1=value1 attrib2=value2 ...>」を
parseして((attrib1 . "value1") (attrib2 . "value2") ...)を返す。
(べつに逆順でも良い。)
0665664
NGNG(define (parse-node tag attributes sub-tags)
(let ((subnodes '()))
(letrec ((loop
(lambda ()
(case current-token
(tag
(let ((desc (assq token-value dtd)))
(cond ((null? desc)) ; 知らないタグは無視
((member token-value sub-tags)
;; 自分の子供
(next-token)
(set! subnodes
(cons (parse-node
(car desc)
(parse-attributes (car desc))
(cdr desc)))
subnodes))
(else
;; 自分の子供でない
;; 今のノードを暗黙の内に閉じる。
`(,tag ,attributes ,(reverse subnodes))))))
(close-tag
(if (eq? token-value tag)
;; 今のノードが閉じた。>を読み飛ばす。
(next-token))
;; いずれにせよ、今のノードを閉じる。
`(,tag ,attributes ,(reverse subnodes)))
(text
(set! subnodes (append-text token-value subnodes))
(next-token)
(loop))))))
(loop))))
(define (html->sexpr filename)
...
(next-token) ; トークンを1つ先読み。(ホントは何かタグが出てくるまで)
(parse-node tag ...))
うーん…
0666666
NGNG普通にCALL, CALL, .... RETURN, RETURN, ... と,
全然末尾再帰されていないように感じたのですが,scmのtraceが変なだけ?
0667デフォルトの名無しさん
NGNG0668デフォルトの名無しさん
NGNGなにげに十分短いのではないかと。
副作用のある部分をなんとかしたいところだけど。
0669LV
NGNG0670デフォルトの名無しさん
NGNG正しいかどうか分からないプログラムから
正しい結果が出力されることを期待してはいけない。
よって、
'プログラムが正しいかを証明するプログラム'が正しいことを、
'プログラムが正しいかを証明するプログラム'によって証明する為には、
前提条件として、
その 'プログラムが正しいかを証明するプログラム' が正しいということが
既に証明されていなければならない。
0671デフォルトの名無しさん
NGNGネストの深い処理やwith系関数を、後付けで任意のポイントからポイントまで
の区間に適用する機構です。
;骨組み
(define (divide-continueation-prototype proc)
(let ((resume #f)(after #f)(result #f))
(call/cc(lambda(suspend)
(set! result (proc (lambda()
(set! after (call/cc(lambda(cont)
(set! resume cont)
(suspend #t)))) ;call/cc set!
))) ;proc lambda set!
(if after (after #t))
)) ; suspend
(if resume (lambda()(resume (call/cc(lambda(c)c)))result) #f)
)) ;let def
;使用例)任意の区間の出力を文字列として得る
(define (escape-string)
(divide-continueation-prototype (lambda(divide-point)
(with-output-to-string (lambda ()
(divide-point))))))
(define end (escape-string)
(display "出力")
〜
(end)
=>"出力〜"
0672デフォルトの名無しさん
NGNG0673デフォルトの名無しさん
NGNG(tag)
<tag></tag>
記述量が倍違う。
は冗談として、
そのままLISPリーダーとして活用できたりするとか。
(with-input-from-string
"<begin><display>hello world!<newline></begin>"
html->sexpr)
=>(begin (display "hello world!") (newline))
(eval(with-input-from-string
"<begin><display>hello world!<newline></begin>"
html->sexpr))
hello world!
0674デフォルトの名無しさん
NGNG0675デフォルトの名無しさん
NGNGHTMLがS式になったなら、それでHTMLがパーズできたってことじゃん。
あとはLispで加工できる。
0676デフォルトの名無しさん
NGNGeval通るっつーのはいいね
0677デフォルトの名無しさん
NGNG(define (split-quote-string s)
(let loop ((si 0)(i 0)(quote? #f)(r '()))
(if (< i (string-length s))
(cond
((char=? #\" (string-ref s i))
(loop si (+ i 1) (not quote?) r))
((and (not quote?) (memv (string-ref s i) '(#\tab #\space #\newline)))
(loop (+ i 1) (+ i 1) quote? (if (= si i) r (cons (substring s si i) r))))
(else (loop si (+ i 1) quote? r)))
(reverse(if(= si i)r(cons (substring s si i) r))))))
(define (split-tag-string s)
(let ((tag (split-quote-string s)))
(if (nlength? 2 tag)
(cons (string->symbol (car tag)) (cdr tag))
(string->symbol (car tag)))))
>(split-tag-string "A HREF=\"http://\" target=\"_blank\"" )
=>(A "HREF=\"http://\"" "target=\"_blank\"")
タグだけシンボルにしてみました。
この辺はperlなら数行で出来てしまえるかも
0678デフォルトの名無しさん
NGNGがんばってね
0679デフォルトの名無しさん
NGNGやっぱ連想listにしないと検索しにくいよ…
0680デフォルトの名無しさん
NGNGという問題が。
0681680
NGNG0682デフォルトの名無しさん
NGNG#1 [misc] XML
最近、みるたび思う。「なんで S 式にせんかった!」
これが、S 式だったら、今ごろ、世の中は Java ではなくて Scheme だったかも。
そっか。 世の中が Perl や Java だったから S 式になんなかったのか。ガクッ。
0683デフォルトの名無しさん
NGNGhttp://www.ipa.go.jp/NBP/12nendo/12mito/mdata/12-7h.htm
なんでしょうこれ
0684デフォルトの名無しさん
NGNG(("A HREF=\"http://\" target=\"_blank\"") ...)
を
(A ((HREF "\"http://\"") (target "\"_blank\"")) ...)
に変換するフィルタープログラムを作るというのはどうか。
0685デフォルトの名無しさん
NGNG拡張可能アプリケーションの設計 第3回
: ブラック・ボックスはどんなとき、どこで、どのように最もよく機能するかを調べる
http://www-6.ibm.com/jp/developerworks/java/020315/j_j-diag1120.html
拡張可能アプリケーションの設計 第4回
: S式がどのように軽量のブラック・ボックス拡張性を実現するか
http://www-6.ibm.com/jp/developerworks/java/020322/j_j-diag1211.html
0686デフォルトの名無しさん
NGNGhttp://www.netfolder.com/DSSSL/
0687デフォルトの名無しさん
NGNGそこまで大袈裟にしたくないんでしょ
0688デフォルトの名無しさん
NGNG結局S式じゃダメだと気づいて、皆が捨てたからでしょ。
0689デフォルトの名無しさん
NGNGなにがだめなんですか
0691デフォルトの名無しさん
NGNGXMLは外部とのやりとりに使えば?
XMLはコスト掛かりすぎだよ。
ここで議論するのもアレだな。
0692デフォルトの名無しさん
NGNGLispがそうさせるから
0693デフォルトの名無しさん
NGNG0694デフォルトの名無しさん
NGNGなにしろツールやライブラリの蓄積が違う。
いちいち仕様考えながら作ってたんじゃ追い付くわけがない。
0695デフォルトの名無しさん
NGNG考えろよ
0696デフォルトの名無しさん
NGNGなにかの冗談でしょ?
0697デフォルトの名無しさん
NGNGってどういう意味?教えて。ください。
0698デフォルトの名無しさん
NGNG>>690
0699デフォルトの名無しさん
NGNG0700デフォルトの名無しさん
NGNG0701デフォルトの名無しさん
NGNGスレ違いだからアルゴリズム総合スレへでも逝った方が良いと思うが、
ひょっとしてSICPの話だったりするのかな?
0702632
NGNGこんな感じでしょうか。
(define (string-resize s n)
(if (<= n (string-length s))
(substring s 0 n)
(string-append s (make-string (- n (string-length s))))))
(define (read-token endc)
(let ((s (make-string 128)))
(let loop ((c (read-char))(i 0))
(if (or (eof-object? c) (char=? c endc))
(substring s 0 i)
(begin
(cond ((< i (string-length s)) (string-set! s i c))
(else (set! s (string-resize s (* 2 (string-length s))))
(string-set! s i c)))
(loop (read-char)(+ i 1)))))))
0703デフォルトの名無しさん
NGNG車輪の再発明ばっかりする伝統があるのかな。
なんでDSSSL使わないんだよ?
0704デフォルトの名無しさん
NGNGすいません。使い方わかりません。
どうやって使うんですか?
例をください。
0705デフォルトの名無しさん
NGNG国際規格になったようなものは使わないという反骨精神なんだろ、きっと。
せっかくSchemeの応用が大っぴらに規格化されたのにね。手をこまねいているうちに
XSLTができて「Schemeはヤパリ洋梨」ということになっちゃった。
0706デフォルトの名無しさん
NGNG0707デフォルトの名無しさん
NGNGDSSSLって何?
0708デフォルトの名無しさん
NGNGなんかSchemeに恨みでもあるのかね?
0709デフォルトの名無しさん
NGNG今さらSchemeでHTMLパーザ書いたりしてるからでは?
>>707
ちょっとくらい前の発言を読めば?
0710デフォルトの名無しさん
NGNGSGMLベースの本格的なタグ記述言語が欲しいと思った。
Javaにうつつを抜かしている漏れを差し置いて、
SunとMSはコソーリXMLを作っていた。
今、一部の人々は S式と XMLの関係に夢中になっている。
数年後に結果が出ていればいいなーと、マジで思う。
0711705 (!= 703)
NGNGSchemeコミュニティにはこう自殺傾向というか
過去の財産をあっさりすてて一から書き直してはまた崩しての
非建設的なことばかりする傾向があるのかイライラしてるだけ。
XMLの世の中になったってのに「S式使えば何でも解決!」しか
言わない奴もいるし…
0712デフォルトの名無しさん
NGNG創作意欲を摘み取る様な事言うなよ。
君の都合で今さらパーサ書いたらいけないのか?
それはともかく、DSSSLの使い方がわからんので
やさしく説明してくれ。
0713712
NGNG0714デフォルトの名無しさん
NGNGsexpにまみれていられるし。
0715デフォルトの名無しさん
NGNG>過去の財産をあっさりすてて一から書き直してはまた崩しての
そう見えるのはコミュニティが弱小だから、情報が集まり
にくいってのがあると思う。特に日本では。
Variantな処理系が沢山ある割に、
横のつながりが弱いっていうか。
0716デフォルトの名無しさん
NGNGせめてどうやって使うとか、サンプルソースコードでもなんでも
情報提供してくれれば悪い印象にもならないと思うけど。
0717デフォルトの名無しさん
NGNGLisperもSchemerもみんな独自に処理系を作りたがるから、
伊達を気取りたくなるんだよ。
0718デフォルトの名無しさん
NGNG>>686のリンク先にあるだろ。
0719デフォルトの名無しさん
NGNG0720デフォルトの名無しさん
NGNG>>718みたいに、英語サイトのリンク先示すだけで終わるのも
問題のひとつだと思うよ。
0721デフォルトの名無しさん
NGNG0722デフォルトの名無しさん
NGNGあーあ、期待してたのに。
そうやって突き放すから、新規ユーザーも増えないし、
閉鎖的になるんだよ。
0723デフォルトの名無しさん
NGNGもしかして対話してる相手が1人だけだとでも思ってるのか?
0724デフォルトの名無しさん
NGNGエディタで人望を得た。
0726デフォルトの名無しさん
NGNGlispで遊ぶのが目的ではなくて、完全に手段としてだからね。
1つの処理系で統合されてるというのもある。
分家はあるけど。
0727デフォルトの名無しさん
NGNG0728デフォルトの名無しさん
NGNG0729デフォルトの名無しさん
NGNGおめーはだまってる!
0730デフォルトの名無しさん
NGNG視認性 Sexpr>>>XML
柔軟度 Sexpr>>>XML
処理系 Sexpr>>>XML
互換性 XML>>>Sexpr
知名度 XML>>>Sexpr
実装難度 XML>>>Sexpr
本の多さ XML>>>Sexpr
0731デフォルトの名無しさん
NGNGこれだよ!LISPも本を沢山出版するんだ!
・・・そして在庫の山
0732デフォルトの名無しさん
NGNG両方作った人いるのかな。
XMLのパーザくらいなら
CommonLispの実装作るより
ずいぶん簡単だと思うんだが。
0733デフォルトの名無しさん
NGNGCommonLispとXMLを比較すんなよ
ここのスレ住人は揚げ足取りばっかだな
0734デフォルトの名無しさん
NGNG0735デフォルトの名無しさん
NGNG0736デフォルトの名無しさん
NGNGじゃ何と比較すんだよ。
実装って何だよ。
0737デフォルトの名無しさん
NGNG0738デフォルトの名無しさん
NGNG(゜Д゜)ハァ?
頭が固いのは今どきS式マンセーとかいってるヤツらだろ。
0739デフォルトの名無しさん
NGNGS式じゃないの?
ま、なにがなんでもXMLを勝たせたいわけね。
0740デフォルトの名無しさん
NGNGS式の実装がS式?
馬鹿ばっかだな…
0741デフォルトの名無しさん
NGNG0742デフォルトの名無しさん
NGNGきみがバカなだけだとおもうよ
0743デフォルトの名無しさん
NGNG実装の容易さ XML>>>Sexpr
ってことで。
〜〜〜〜〜〜〜〜〜〜〜〜 糸冬 了 〜〜〜〜〜〜〜〜〜〜〜〜
これにツッコムやつは粘着厨房。
0744デフォルトの名無しさん
NGNG0745デフォルトの名無しさん
NGNG0746デフォルトの名無しさん
NGNGXMLはクソ。これ定説。
0747デフォルトの名無しさん
NGNG0748デフォルトの名無しさん
NGNG禿げ同。
XMLスレの惨状見れば明らか。
0749デフォルトの名無しさん
NGNG0750デフォルトの名無しさん
NGNG0751デフォルトの名無しさん
NGNG無言電話掛けるってパターンかな。
0752デフォルトの名無しさん
NGNGアンチパターンやね
0753デフォルトの名無しさん
NGNG0754デフォルトの名無しさん
NGNG潔く認めて次の話題逝こうや。
まず、S式を廃止してXML化するには
0755デフォルトの名無しさん
NGNG0756デフォルトの名無しさん
NGNG0757デフォルトの名無しさん
NGNG─fin.
0758デフォルトの名無しさん
NGNG(eval 'XML)
=>"<クソ>"
0759デフォルトの名無しさん
NGNGフ゜quoteも評価できないevalって壊れてるよ。
0760デフォルトの名無しさん
NGNG晒しage
0761デフォルトの名無しさん
NGNGメタ意識が足らんよ
0762759
NGNG(eval 'XML) => XML
じゃないの?
0763デフォルトの名無しさん
NGNG説明しよう。
(eval 'XML)を評価する段階でまず
eval => <primitive eval>
'XML => (quote XML) => XML
と、なるわけだ。これで全ての引数の評価が終了した。
次の段階で適用(apply)が起き、
XMLはどこかで"クソ"とbind(XML . "クソ")されてるんで、
(apply <procedure eval> XML)
の適用結果は"クソ"と、なるわけだ。
0764デフォルトの名無しさん
NGNGしかも変だし。
しかもさっきと結果違ってるし。
0765デフォルトの名無しさん
NGNG0766デフォルトの名無しさん
NGNGSICPでも読んどけ
0767デフォルトの名無しさん
NGNG0768デフォルトの名無しさん
NGNG764の言ってることは正しいと思うが? 何とbindされてようが
クォートされてるアトムをエバッたら困るし、
"<クソ>"と"クソ"が違ってる。
0769デフォルトの名無しさん
NGNG0770デフォルトの名無しさん
NGNG0771764
NGNG0772763
NGNGそうだな。
どうせクソだからどうでもよかったんだが、
XMLは"<クソ>"が正解だ。
0773デフォルトの名無しさん
NGNG0774デフォルトの名無しさん
NGNG読んでその結果なら、もう関わるなよ。
0775デフォルトの名無しさん
NGNG0777デフォルトの名無しさん
NGNG0778763
NGNG>間違いを指摘してもらったら感謝するのが
ありがとう。
>知ったかぶってごまかすんじゃなくて。
君に言われたくないね(藁
0779デフォルトの名無しさん
NGNG>>777
どう見てもそんな展開には見えません。
0780デフォルトの名無しさん
NGNG0781デフォルトの名無しさん
NGNG=>"クソ"
0782デフォルトの名無しさん
NGNG0783764
NGNGそれにapplyの最後の引数はリストじゃないとダメなんだけど…
0784デフォルトの名無しさん
NGNG0785デフォルトの名無しさん
NGNG難しいこと言うから厨房が逃げちまったじゃねーかヴォケが!
0786デフォルトの名無しさん
NGNGschemeとはどこにも書いてないし、
applyは例で書いたんだと思うよ。
んで、そろそろウザイよ?>きみら
0787764
NGNGSchemeじゃないのにリストの最初の要素を評価するの?
…チッ、またごまかしてやがる。
0788デフォルトの名無しさん
NGNG0789デフォルトの名無しさん
NGNG0790デフォルトの名無しさん
NGNG0791デフォルトの名無しさん
NGNG0792デフォルトの名無しさん
NGNG763はただの知ったか消防で、764は神で、XMLはクソじゃありませんでした。
■■■■■■■■ 終 了 ■■■■■■■■
0793デフォルトの名無しさん
NGNGどうせまともに答えられないんだから。
0794デフォルトの名無しさん
NGNG0795デフォルトの名無しさん
NGNGevalなんて喜んで使う奴はScheme使いとしては三流に
決まってるんだから、問い詰めたってしょうがねえだろ。
XMLは糞だがオマエも糞じゃ。
0796デフォルトの名無しさん
NGNGつか、みんな痛すぎ。特に>>763。
初心者を装った764の手にうかうか載ってどうする。
0797名無しさん@XEmacs
NGNGオレモナー
0798デフォルトの名無しさん
NGNG(´-`).。oO(……自分の嫌いなもののスレにノコノコあらわれるのは何故だろう……
0799デフォルトの名無しさん
NGNG0800デフォルトの名無しさん
NGNG猥褻物陳列罪と予想。
0801デフォルトの名無しさん
NGNG764の方がいたいと思うけど。っていうかそれもネタ?
普通 schemerなら evalなんて使わないし。
っていういか、なんで R5RSで入ったの? 消してほしいものだ...
compiler makerはどうしてるの?
0802デフォルトの名無しさん
NGNGftp://mirror.cybercomm.nl/pub/tucows/linux/files/gnome/office/galway-0.43.0.tar.gz
0803デフォルトの名無しさん
NGNG(tag attr-list contents..)の形に直しました。(attrは相変わらず文字列です。)
元HTMLに対しては正確ではないですが、以下の様な可逆変換が可能です。
(with-output-to-file "out.html" (lambda()
(sexpr->html
(with-input-from-file "read.html" (lambda()
(html->sexpr))))))
たまにタグの対応関係が取れない場合があります。
これは元HTMLが正常である場合、バックトラック解析によるまちがい修正で
それなりに回避できそうですが、read-charやset!等の副作用関数がむきだし
なのでそれを直す必要があります。
以下、全ソース
0804デフォルトの名無しさん
NGNG(let loop ((si 0)(i 0)(quote? #f)(r '()))
(if (< i (string-length s))
(cond
((char=? #\" (string-ref s i))
(loop si (+ i 1) (not quote?) r))
((and (not quote?) (memv (string-ref s i) '(#\tab #\space #\newline)))
(loop (+ i 1) (+ i 1) quote? (if (= si i) r (cons (substring s si i) r))))
(else (loop si (+ i 1) quote? r)))
(reverse(if(= si i)r(cons (substring s si i) r))))))
(define (string-resize s n)
(if (<= n (string-length s))
(substring s 0 n)
(string-append s (make-string (- n (string-length s))))))
(define (read-token endc . first-char)
(let ((s (make-string 128)))
(let loop ((c (if (pair? first-char)(car first-char)(read-char)))(i 0))
(if (or (eof-object? c) (char=? c endc))
(substring s 0 i)
(begin
(if (= i (string-length s))
(set! s (string-resize s (* 2 (string-length s)))))
(string-set! s i c)
(loop (read-char)(+ i 1)))))))
(define (first-token s . opt)
(if (pair? opt) (set! opt (car opt)) (set! opt 0))
(if (string? s)
(let ((pos (or(substring? " " s opt)(string-length s))))
(if pos
(substring s opt pos)
s))
s))
(define (split-tag-attr s)
(let ((tag (split-quote-string s)))
(if (nlength? 2 tag)
(list (string->symbol (car tag)) (cdr tag))
(list (string->symbol (car tag)) '()))))
(define *omit-tag-symbol-list* '(br hr meta input BR HR META INPUT))
(define *reuire-endtag-list* '("B" "TEXTAREA" "b" "textarea"))
0805デフォルトの名無しさん
NGNG(define (require-endtag? node)
(or (pair? (cddr node))
(memv (symbol->string(car node)) *reuire-endtag-list*)))
(if (pair? node)
(let ((tag-name (car node)))
(display* "<" tag-name)
(if (pair? (cdr node))
(for-each
(lambda (pair)
(display " ")
(if (string? pair)
(display pair)
(begin
(display (car pair))
(display "=")
(write (cdr pair)))))
(cadr node)))
(display ">")
(if (require-endtag? node)
(begin(for-each sexpr->html2 (cddr node))
(display* "</" tag-name ">"))))
(display node)))
0806デフォルトの名無しさん
NGNG(define (omit-tag? tag)
(find
(lambda (s) (eq? (car tag) s))
*omit-tag-symbol-list*))
(define (find-tag tag-string stack)
(let ((tag (string->symbol (first-token tag-string 1))))
(find
(lambda (s)
(and (eq? tag (car s)) (car s)))
stack)))
(define (make-tag tag) (split-tag-attr tag))
(let loop
((c (read-char)) (stack '()))
(cond
((eof-object? c)
(if (pair? stack) (car stack) stack))
((char=? c #\<)
(let ((tag-string (read-token #\>)))
(if (char=? #\/ (string-ref tag-string 0))
(let ((v (find-tag tag-string stack)))
(if v
(let loop1
((stack stack) (r '()))
(if (not (eq? v (caar stack)))
(loop1 (cdr stack) (cons (car stack) r))
(begin
(set-cdr! (car stack) (append (cdar stack) r))
(if (pair? (cdr stack))
(begin
(set-cdr!
(cadr stack)
(append (cdadr stack) (list (car stack))))
(loop (read-char) (cdr stack)))
(loop (read-char) stack)))))
(begin
(stdout-puts
"警告:"
tag
"は対応関係が異常です。読み飛ばします。")
(loop (read-char) stack))))
(let ((tag (make-tag tag-string)))
(if (omit-tag? tag)
(begin
(set-cdr!
(car stack)
(append (cdar stack) (list tag)))
(loop (read-char) stack))
(loop (read-char) (cons tag stack)))))))
(else
(let ((s (read-token #\< c)))
(if (pair? stack)
(set-cdr!
(car stack)
(append (cdar stack) (list s)))
(stdout-puts "警告:" s "はどのタグにも所属してません"))
(let ((xc (peek-char)))
(loop (if (eof-object? xc) xc #\<) stack)))))))
0807デフォルトの名無しさん
NGNG荒らしはやめて
0808デフォルトの名無しさん
NGNG0809デフォルトの名無しさん
NGNG全ソース貼り付けるのはいかがなものかと。
0810デフォルトの名無しさん
NGNG0811デフォルトの名無しさん
NGNG>>808
放置も出来ない厨房はすっこんでろと言われる罠
0812デフォルトの名無しさん
NGNG確かにcar板やcdr板はあるけどさ
0813デフォルトの名無しさん
NGNGプログラム板をLisp板と勘違いしているだけ。
Lisp以外、眼中にないから。
0814デフォルトの名無しさん
NGNGそんなに括弧まみれが好きなの?
0815デフォルトの名無しさん
NGNGlisperにとって括弧は空気みたいなものです。
0816デフォルトの名無しさん
NGNG0817デフォルトの名無しさん
NGNG言ってくる愚か者がいるんですが。みなさんはどう対処します?
高級言語の中でも、Lisp が最も顕著なもののひとつかなと思って。
0819デフォルトの名無しさん
NGNGCトランスレータ使うとか。
トランスレータが吐いたコードをメンテナンスする
気にはならんだろうけど。
0820デフォルトの名無しさん
NGNG0821デフォルトの名無しさん
NGNG(lambda (le)
((lambda (f) (f f))
(lambda (f)
(le (lambda (x) ((f f) x)))))))
0822デフォルトの名無しさん
NGNGLISPからCへのトランスレータってlambdaとかあるから一筋縄じゃいかなそう。
一旦bytecode化してからやるのかな。
0823デフォルトの名無しさん
NGNG0824デフォルトの名無しさん
NGNGACL体験版使ってみれば?
普通のLISP関数と同様に扱えるのが強み。
ただしVariantが沢山ある。
実際、チープな処理系でもマクロの様なものがあればCLOSモドキは
いくらでも生産できる。これは凄いことなのかもしれないけど、
各々で独自のObjectSystem作れる事が逆に災いして、
そのシステム上でのプログラムを作っても他と交流できず
いつのまにか消滅して発展しないってパターンが多い気がする。
0825デフォルトの名無しさん
NGNG0826デフォルトの名無しさん
NGNGlist->csv csv->list
作ってください。宿題とかではないです。
インタフェースは、
(list->csv l)でリストlをcsvに直して標準出力に吐く、
(csv->list)で標準入力のcsvをlistにする。
入出力に使用するリストは
((r1c1 r1c2 r1c3 ...)
(r2c1 r2c2 r2c3 ...)
(r3c1 r3c2 r3c3 ...)
...)
こんな感じで。
csvの引用符の処理は適当でいいです。
0827デフォルトの名無しさん
NGNG0828デフォルトの名無しさん
NGNG0829デフォルトの名無しさん
NGNG0830デフォルトの名無しさん
NGNG0831デフォルトの名無しさん
NGNGGaucheで
(use text.csv)
(define (csv->list) (port->list (make-csv-reader #\,) (current-input-port)))
(define list->csv (let ((w (make-csv-writer #\,))) (lambda (l) (for-each (lambda (r) (w (current-output-port) r)) l))))
0832デフォルトの名無しさん
NGNGやっぱバカ正直に1文字ずつ読みこんで懐石してくのは
インタプリタでは荷が重いな。最低read-lineだな。
0833デフォルトの名無しさん
NGNGhttp://mappy.mobileboat.net/~seek/co/
0834デフォルトの名無しさん
NGNGmake-csv-writer
こんな関数あるの?
0835デフォルトの名無しさん
NGNGいるいる。しかも情報系の大学教授あたりでも。
卒論発表なんかで関数型言語の話をすると、
「CやJavaのような実在の言語には適用できないのでは?」とか発言するDQN教官。
お前らのせいでプログラミング言語の進歩が阻害されとるんじゃゴルァ
0837デフォルトの名無しさん
NGNGlambdaそのものは、常にクロージャ(=「関数へのポインタ+自由変数の値」の構造体)
を作ることにすば、バイトコードにまでしなくても、わりと楽にできそう。性能はともかく。
それよりもガベコレが問題かも。
Boehm GCっていう、CやC++用のガベコレが使える環境ならいいんだけど。
0838デフォルトの名無しさん
NGNGてすごい。
エヴァ好きなら要チェック。↓整形板
http://life.2ch.net/test/read.cgi/seikei/1021620014/l50
0839デフォルトの名無しさん
NGNG(let loop()(display 'hoge)(loop))
=>(((lambda(loop)(set! loop(lambda()(display "hoge")(loop)))) '()))
これをCとかに変換しようと考えると、鬱になってきます。
tail_recursion_loop:
display("hoge");
goto tail_recursion_loop;
named-letのまま考えた方がいいんでしょうか。
0840デフォルトの名無しさん
NGNGうん。
0841839
NGNGどれぐらいのコード書かないといけないんでしょうか。
if文や関数を(f)->f()に変換するぐらいはできますが、
末尾再帰の認識や変数のバインディングのところで躓いてます。
(gcなどの問題は棚上げして考えてます)
1)
(define (list->csv l)
(for-each1
(lambda (col)
(let loop ((s col))
(if (pair? s)
(begin
(display (car s))
(if (pair? (cdr s))
(write-char #\,)
(newline))
(loop (cdr s))))))
l))
2)
obj_t list2csv(obj_t l) {
obj_t result = nil;
obj_t args = l;
for_each1:
if (pairp(args)) {
obj_t col = car(args);
obj_t s = col;
loop:
if (pairp(s)) {
display(car(s));
if (pairp(cdr(s))) {
write_char(',');
} else {
newline();
}
s = cdr(s);
goto loop;
}
args = cdr(args);
goto for_each1;
} else {
result = t;
}
return result;
}
0842デフォルトの名無しさん
NGNG禿しく外出な話題だが、
なぜアリ物(Gambit-Cなど)ではだめなのか? 趣味?
まあ、あんまり凄い解析しないでちゃんと末尾再帰まで
実装するなら、Cのスタックは使わず、trampolineを使う
のが良いでしょう。
1. 元のSchemeプログラムは、関数呼び出しごとに別の
C関数に分けて変換する。
2. グローバルな変数fun, valと、引数を渡す仕組み
(グローバル変数や、配列で作ったスタック)を用意する。
3. トップレベルでは、
while (1) {
(*fun)();
}
みたいにする。
4. Scheme関数を呼び出すコードは、
(1)環境を閉じ込めた継続を作り、
(2)継続を配列で作ったスタックやヒープに退避し、
(3)引数をセットし、
(3)funに呼びたい関数を入れてreturnする。
5. Scheme関数からreturnするコードは、
(1)返す値をvalueに入れ、
(2)継続を取り出してfunにセットしreturnする。
頑張って解析すれば、継続や環境をなるべくヒープに
割り当てないようにできる。
(SICPが参考になる。)
0843839
NGNGありがとうございました。
継続も考えるとさらに鬱になってきますね。
>なぜアリ物(Gambit-Cなど)ではだめなのか? 趣味?
趣味です。
アリ物でシンプルなやつがあればそれ参考にしたいんですけどね。
0844デフォルトの名無しさん
NGNG末尾再帰の判定は関数内を辿っていって、
例えば
(if test true false)ならば
test x
true false o
(begin seq1 ... seqn)ならば
seq1 ... x
seqn o
と末尾再帰可能か?を伝播していけばいけるんじゃないかと。
0845デフォルトの名無しさん
NGNG認識は簡単だけど、Scheme関数1つをC関数1つに変換するという
方針では、末尾再帰を実装できないよね。自分自身に再帰する
特殊な場合だけはgoto使えば良いけれども。
0846839
NGNG>>844
その様ですね。
条件式、関数の引数についてはx
とか。
>>845
named-letは多用するんで、
その辺をまず考えていきたいと思います。
ちょろっと書いてみましたが、
(sexpr->c
'(let loop ((s col))
(if (pair? s)
(begin
(display (car s))
(if (pair? (cdr s))
(write-char #\,)
(newline))
(loop (cdr s))))))
という入力に対し、
=>"{
obj_t s=col;
loop:
if (pair?(s)) {
display(car(s))
if (pair?(cdr(s))) {
write-char(,)} else {
newline()}
loop(cdr(s))
}
}
"
という文字列を返すところまでできました。
いまのところコード中には副作用無しです。
式文の終端のセミコロンや、letの右側のバインド式など、まだ課題は沢山ありますが。
0847デフォルトの名無しさん
NGNGってな具合いに変換するのは、すぐ壁に突き当たると思う。
SICPの5.5節を嫁。
0848デフォルトの名無しさん
NGNG0849839
NGNGいまのところソースは100行ぐらいです。
解析関数にローカル変数のリストを加えたので
末尾再帰loopシンボルの処理まではできました。
for-eachはlambda限定で1リストの決め打ちです。
(sexpr->c
'
(for-each
(lambda (col)
(let loop ((s col))
(if (pair? s)
(begin
(display (car s))
(if (pair? (cdr s))
(write-char #\,)
(newline))
(loop (cdr s)))))) l)))
=>"
{
obj_t g162=l;
for_each_g162:
if (pairp(g162)) {
obj_t col=car(g162);
{
obj_t s=col;
loop:
if (pair?(s)) {
display(car(s))
if (pair?(cdr(s))) {
write-char(,)
} else {
newline()
}
s = cdr(s);
goto loop;
}
}
g162 = cdr(g162);
goto for_each_g162;
} else {
result = t
}
}
"
※実際はこんな綺麗にインデントはされません
0850デフォルトの名無しさん
NGNG0851839
NGNG末尾再帰判定で弾かれるので最初の出力の様な、ただの関数呼び出しになります。
今のところloop関数は別途出力される予定はないので、おかしな事になります。
手動でコピペして修正する必要があります。
0852デフォルトの名無しさん
NGNGO(log n)の関数フェルマーテストを使って実験しました。
1009と1000003では、2.3倍
10007と100000007では、2.4倍になりました。
2倍になってません。違いを説明できません。
助けてください。
http://mitpress.mit.edu/sicp/full-text/book/book-Z-H-11.html#%_sec_1.2.6
0853デフォルトの名無しさん
NGNG小さい整数と大きい整数の演算では速度が違うからね。
そのくらいのずれはしょうがない。ぴったり2倍になるわけはない。
0854デフォルトの名無しさん
NGNG0855デフォルトの名無しさん
NGNG解答:誤差だと思われ。
でいいんですね。ありがとうございますた。
0856デフォルトの名無しさん
NGNG0857デフォルトの名無しさん
NGNG横着なソースだと関数引数やifの条件式の中にletとかあったりするよね。
(func (let ...))だったら
(let ((tmp (let ...))) (func tmp))
みたいにすればいいかな。
0858デフォルトの名無しさん
NGNG0859デフォルトの名無しさん
NGNG0860デフォルトの名無しさん
NGNGS式をインタプリトするのと比較して?
元のインタプリタにもよるけど、
単純な変換だと、実はそれほど速くならない。
高速なインタプリタと比較すると、
普通のリスト処理だと3倍くらいじゃないか。
整数演算とかだと、うまく型宣言すると
30倍くらいになる。
まず、「S式をたどって式の種類を判別する」
オーバーへッドを省くだけで、やることが変わ
らないような変換だとせいぜい3倍。関数をイ
ンライン展開しないとそれ以上の速度向上は
望めない。
次に、GCが遅いようなインタプリタだとどう
やってもだめ。例えば処理時間の40%がGC時間
のインタプリタは、どんな凄い最適化をしても
(メモリ割り付け量が減らない限り)2.5倍に
しか速くならない(アムダールの法則だね)。
0861デフォルトの名無しさん
NGNG開発速度は桁違いに早くなるでしょう。実行速度はわからん。
全体として見れば、下手な奴が書く C プログラムよりずっと良いと思う。
0862839
NGNGschemeコード副作用なしで、500行ぐらいです。
まだ普通の再帰、継続、クロージャその他もろもろに未対応ですが。
ここまで思ったより短い期間で作れたんで満足してます。以上。
変換結果
obj_t list_to_csv(obj_t l) {
obj_t result = nil;
{
obj_t g2 = l;
for_each_g2:
if (pairp(g2)) {
obj_t col = car(g2);
{
obj_t s = col;
loop:
if (pairp(s)) {
display(car(s));
if (pairp(cdr(s))) {
write_char(',');
} else {
newline();
}
s = cdr(s);
goto loop;
}
}
g2 = cdr(g2);
goto for_each_g2;
} else {
result = t;
}
}
return result;
}
0863デフォルトの名無しさん
NGNGいっときはクソスレに片足突っ込んでたのに(w
0864デフォルトの名無しさん
NGNGのcopy-alistの説明を理解できないんだけど誰か教えてくれない?
(setq alist '((a . 1) (b (2))))
=> ((a . 1) (b (2)))
(cdr (car (cdr alist)))
=> ((2))
(cdr alist)
=> (b (2))
(car (b (2)))
=> (b)
(cdr (b))
=> nil
としか思えない…
0865デフォルトの名無しさん
NGNG(cdr alist) => ((b (2)))
(car ((b (2)))) => (b (2))
(cdr (b (2))) => ((2))
0866デフォルトの名無しさん
NGNG=> (b (2))
(cdr '(b (2))) => ((2))
じゃねーの?
慣れると
cadr→2番目
cdr→残り
と脳内変換されるよ。
0867デフォルトの名無しさん
NGNG0868デフォルトの名無しさん
NGNG0869デフォルトの名無しさん
NGNG0870デフォルトの名無しさん
NGNG自分で作れ
0871デフォルトの名無しさん
NGNG0872デフォルトの名無しさん
NGNGリストってVBで表現できたっけ?
Variant型の配列使うしかないのかな。
0874デフォルトの名無しさん
NGNGWin32 LISPで検索しろ
0875デフォルトの名無しさん
NGNG0876デフォルトの名無しさん
NGNGVBに変換してどうするんだろう
0877デフォルトの名無しさん
NGNG0878デフォルトの名無しさん
NGNG変換後、すぐ実行できるし。
メンテは大変かもしれないけど。
0879デフォルトの名無しさん
NGNG実際オープンソースでネイティブ変換してるやつ、
ググって探してみたけど無いもんだね。製品ばっかり。
JavaVMはKawaってのがあるみたいだけど。
0880デフォルトの名無しさん
NGNGを
(object.method ...)
ってやってる処理系ってありませんか?
'.'をフックすればできるのかな。
見た目的にマルチメソッドではなくなってしまうだろうけど。
0881デフォルトの名無しさん
NGNGCommonLispで '.' のリーダーマクロを書いて、x.y を (slot-ref x 'y)
と読ませるようにしたことはあります。
0882881
NGNG0883デフォルトの名無しさん
NGNGありがとう。
x.y.zの場合は(slot-ref (slot-ref x 'y) 'z)か。
>Arcが x.y を (x y) と読む、とかいう略記法を採用していたような。
Arcって実装は存在するのかな。
0884デフォルトの名無しさん
NGNG全部とは言わないけど、ほとんどマクロでなんとかなると思う。
既存のsyntaxに対しての上書きもあるのが問題だけど。
Arcのラッパーマクロ集みたいなの公開してくれないかなあ。
0885デフォルトの名無しさん
NGNG組み込み apply を再定義できないものでしょうか。
オブジェクトを表現するのにクロージャとタグを使って、
(define apply
(let ((orig-apply apply))
(lambda (proc args)
(cond ((object? proc) (dispatch proc args))
(else (orig-apply proc args))))))
みたいな感じで出来ればいいなぁ、と。
0886デフォルトの名無しさん
NGNGSLIBが動く様な処理系ならapplyの再定義なんかは普通にできると思うよ。
あれのtranscriptの実装は入出力全部再定義してるし。
0887デフォルトの名無しさん
NGNGあ、良く見たら組み込みapplyの方ですか。
CommonLispみたいにフックを登録できる様な処理系じゃないと。
現状のschemeの規格範囲内では無理です。
0888デフォルトの名無しさん
NGNGもう一段上でdispatchする方法があります。(過去スレにありますけど。)
これだとscheme規格範囲内での実装ができます。
0889885
NGNGありがとう。SICP を読んでいるので、一段上で dispatch するやりかたは
愛用させてもらってます。
((obj 'msg) args ...) の形に書き換えるマクロを作ったりしたのですが、
なんだかなーと思っていた所なんですよ。
0890デフォルトの名無しさん
NGNG0891デフォルトの名無しさん
NGNGもう少し正確な論文名きぼん。
0892デフォルトの名無しさん
NGNGprocedure?とobject?のきリ分けができなくても困らない?
0894デフォルトの名無しさん
NGNGなにとなにをインストロールすればよいのでしょうか?
OSはWindowsです。
0895デフォルトの名無しさん
NGNG例えば
(define object1 (make-object <a-class>))
として<a-class>に属するobject1を作ったとして、
そのobject1が<a-class>なのかプリミティブなのかを判定したくても、
中身はclosureそのものだから、(class? object1)
とかが作れない。
(define (class? object) (procedure? object))
でもいいの?ってこと。
クラスメソッドとして(object 'typeof)というのを作っても解決しないし。
0897デフォルトの名無しさん
NGNGいや、タグを付けるのはいいんだよ。
けどそうなると特別扱いしなくてなならんので、その辺どうなのかということ。
どのみち処理系に手を加えるなりしないとこの問題は解決しそうにない。
(method object)形式なら話は簡単なんだけど。
0898デフォルトの名無しさん
NGNG(object.method-a.method-b)
に対して
(method-b(method-a object))
や
((object 'method-a) 'method-b)
に変換するのは可能でしょう。
あたかも事前に
(define (object.method-a.method-b) ...)
としていたかの様に使える。
既存のdot表記とは、シンボルとくっついてる限り区別できるから
互換性が保てるはず。
0899デフォルトの名無しさん
NGNG((if (foo) object1 object2).method1 ...)
これは無理だよね。
0901デフォルトの名無しさん
NGNGこういうのできたら面白いよね
>(define a (list 'b 'c 'd))
>(a.car)
=>b
>(a.cadr)
=>c
>(a.cdr)
=>(c d)
0902897
NGNG(object method)に対してapplyしたい>>885
↓
objectをclosureにすればいい>>888
↓
そうなるとprocedureとの区別がつかない>>892
↓
意味がわからない>>893
に対してのレスのつもりなんだけど。
特別扱いはapplyの時ね。
0903デフォルトの名無しさん
NGNG>>897の言うように実装を隠す機構が必要だと思うな。
それにarg1でdouble dispatchingするくらいなら、
CLOS風のgeneric functionがelegantだと思うし。
0904デフォルトの名無しさん
NGNGあくまでもシンボル(読みこみ時に解決)に対してだから、
lambdaやletかますしかないかと。
((lambda(a)(a.method1 ...)) (if (foo) object1 object2))
(let ((a (if (foo) object1 object2)))(a.method1 ...))
あと、右辺に適用できるのが1引数を取る関数になってしまう様な。
(a.method1 b)みたいなことはできないと思う。
(a.method1 b)を
((lambda args (apply method1 (cons a args)) b)
に変換するならできるかもしれないけど。
0905デフォルトの名無しさん
NGNGデータ構造みたいなんだけど、googleとかで探しても
使ってる場面しか見つからなくて、意味が
わかりません。
0906デフォルトの名無しさん
NGNGここを見る限りだと
「Defining New Types (Smobs)」
http://www.red-bean.com/guile/notes/data-rep/data-rep.html#SEC25
Guile(とその派生元のSCM)に対して新しいschemeオブジェクトを
定義するインタフェースだね。
Cで組み込みデータ型を作る時に使うんでしょう。
'smob'の名前の意味はわからんけど。
0907デフォルトの名無しさん
NGNGfrom "small object", referring to the fact that only the CDR and part
of the CAR of a smob's cell are available for use.
0908デフォルトの名無しさん
NGNGの略と↓に書いてあった。
http://www.red-bean.com/guile/notes/data-rep/data-rep_foot.html
0909908
NGNG0910デフォルトの名無しさん
NGNG*dot-hook*というドット連結シンボルを読みこみ時に呼び出される
フック関数があるとしたら、こんな感じになる。
;argsはドットから切り離されたシンボルのリスト
(define (*dot-hook* args)
(let loop ((x (cdr args))(expand (car args)))
(if (pair? x)
(loop (cdr x)
(if (pair? (cdr x))
;ドット連結が続くなら1引数を取る関数しか使えない
(list (car x) expand)
;最後のシンボルに対しては外部から引数を取ることができる様にする
`(lambda args (apply ,(car x) (cons ,expand args)))))
expand)))
>(define a 'string)
>(a.symbol->string.string-append "-append")
=>"string-append"
(a.symbol->string.string-append "-append")
は
((lambda args (apply string-append (cons (symbol->string a) args))) "-append")
と変換される。
名前でアクセスする必要がある&途中の関数に対しては1引数しか取れない、
という限定的なものだけど。
0911905
NGNGどうもありがとうございます。
0912デフォルトの名無しさん
NGNGいっそのこと、
a.method<c,d>
=>(method a c d)
に変換するってのはどお?
a.methodとした場合はclosureを返す。
a.method<c,d>.method<e,f>
(a.method<c,d>.method e f)
こういう風に両方で書けるし。
でも結局<>内はシンボルなんだなあ。
0913デフォルトの名無しさん
NGNGいいね。
ただしカンマの間に間違えて空白とか入れちゃうと意味変わるのが怖いけど。
ただのa.method<c,d>.methodというシンボルに対してのリーダー展開
マクロってだけだからねえ。
これ以上はname<〜>を別の意味に解釈する(内部)readを作る必要があるね。
0914デフォルトの名無しさん
NGNG1つのS式の読みこみ毎に呼ばれる*READ-HOOK*関数を定義できるとすれば、
もうなんでもありだと思う。
1つのS式つーのは、読みこむS式が
(e (a b c) (d))
だとすると
(a b c) ... x
(d) ... y
(e x y)
のパターンそれぞれで呼び出されるってこと。
xとyはそれぞれの*READ-HOOK*の結果が入る。
S式の一番根っこの時点でexpandかければ、macroの展開も同時に
作用させられる。
CommonLispにも同様の機能があるけど、S式の読みこみ段階で
1度処理が走るだけだから、後のeval実行プロセスには影響ない
ってのがかなり使えると思う。
処理系を自作で持ってたるする人は試してみよう。
0915デフォルトの名無しさん
NGNG0916デフォルトの名無しさん
NGNG>のパターンそれぞれで呼び出されるってこと。
evalの評価順序と逆になる?
eがマクロだとしたら、(a b c) (d)を先に変更するのはまずい気が。
eがcaseみたいな特殊なカッコの使い方をする時とか。
0917900
NGNG最近忙しくて、返信が遅くなってしまいました。
ずーっとこの問題について考えていたんですが、やっぱり
(method object args ...) が一番な気がしてきました。
0918デフォルトの名無しさん
NGNG0919デフォルトの名無しさん
NGNGカンマ→ピリオドじゃねーの?
,はbackquoteで使うよん。
0920デフォルトの名無しさん
NGNGCase sencitiveなSchemeの
string->symbol と string->symbolは、
1-to-1 だと仮定して大丈夫なんでしょうか? また、
その二つの合成関数は常にidentityと仮定してよいんでしょうか?
0921デフォルトの名無しさん
NGNG>string->symbol と string->symbolは、1-to-1 だと仮定して大丈夫なんでしょうか? また、
symbol->stringとstring->symbol
の間違いじゃない?
この辺は規格書とr4rstest.scm見ればわかると思う。
>その二つの合成関数は常にidentityと仮定してよいんでしょうか?
identityってなに?
0922デフォルトの名無しさん
NGNG>evalの評価順序と逆になる?
逆になります。
S式の根っこで呼び出した方がいいかも。
0923デフォルトの名無しさん
NGNG0924920
NGNGそうです。
R5RSをちらっとみてみた範囲では、例はあげられていたものの、
単射でなければならないとは書いてないような気がして。
ところで、RnRS以外の規格書ってあるんですか?
identity 云々は、
∀x (xはSchemeのオブジェクト)
{(string->symbol (symbol->string x))
≡ (symbol->string (string->symbol x))
≡ x}
(あるいは、
{(lambda (x) (string->symbol (symbol->string x)))
≡ (lambda (x) (symbol->string (string->symbol (x))
≡ (lambda (x) x))}
は仮定して大丈夫なんでしょうか?という意味です。
0925920
NGNG∀x (xはSchemeのシンボル)
{(string->symbol (symbol->string x)) ≡ x}
∧
∀x (xはSchemeの文字列)
{(symbol->string (string->symbol x)) ≡ x}
なのかどうか、です。
(後半の式もかっこの対応が変だけど。)
0926KOKUYO
NGNG第1引数を探索して取り除くように拡張した関数はどうやって
作ればいいんですか?
0927デフォルトの名無しさん
NGNGなんだマルチか。
関数型言語スレにヒント書いておいたよ。
0928デフォルトの名無しさん
NGNGmemberを自作してcarがconspな時に再帰する様にしてけばつくれるよ。
取り除くって事は破壊/非破壊の2パターン作れるかと。
この場合非破壊バージョンはちょっと難易度高いかも。
0929デフォルトの名無しさん
NGNG>(lambda (x) (string->symbol (symbol->string x)))
>(lambda (x) (symbol->string (string->symbol x)))
>(lambda (x) x)
これ、それぞれの意味全く違うと思うけど。
何がしたいの?
0930929
NGNG>(lambda (x) (string->symbol (symbol->string x)))
引数と戻値はeqv?で一致すると保証されてる。
>(lambda (x) (symbol->string (string->symbol x)))
引数と戻値はeq?で一致すると保証されてる。
>(lambda (x) x)
引数と戻値はeq?で一致すると保証されてる。
これでいいかな?
symbolはuniqueなので比較は同一だけど、
一旦stringになった場合、それが同値(コピー)なのか同一なのか
は保証されていないって事で。
0931929
NGNG>(lambda (x) (string->symbol (symbol->string x)))
引数と戻値はeq?で一致すると保証されてる。
>(lambda (x) (symbol->string (string->symbol x)))
引数と戻値はeqv?で一致すると保証されてる。
0932920
NGNGどうもありがとうございます。
よく考えたみたら、そりゃそうですよね。疑問点を
頭の中で明確にする前に質問書込んでしまいました。
すみません。
0933デフォルトの名無しさん
NGNGおねがいします。
0934デフォルトの名無しさん
NGNG知ってるかもしれないけどcygwinでguileコンパイルする方法が載ってるよ。
ttp://www.geocities.co.jp/SiliconValley-PaloAlto/7043/
gtkについてはわかんない。
cygwinでもXは動くらしいから不可能ではないんでしょ。
0935デフォルトの名無しさん
NGNGなんでだろね。対称性悪いよね。
Gaucheにはsubseqがあるな。
(use gauche.sequence)
(subseq '(a b c d e) 1 4) => (b c d)
(subseq '#(a b c d e) 1 4) => #(b c d)
(subseq "abcde" 1 4) => "bcd"
0936デフォルトの名無しさん
NGNGちょっと(or たくさん)外してるかも知れませんが、
common lisp の
Read-read consistency
Print-read consistency
Print-print consistency
を調べてみると、考えをまとめる手がかりになるかも知れません。
この辺を突っ込んで行くと、2-lisp、3-lisp とどんどん腐海世界に
(scheme からは離れて行っちゃうけど)入り込んで行けます。
0937デフォルトの名無しさん
NGNG0938デフォルトの名無しさん
NGNGdebuggerとはソースの修正も入るやつ?
インテリジェントなやつは多分ないと思う。
エラー個所の特定ならtraceするって手段があると思うけど。
たぶんそれぐらい入ってると思う。(この手はLISP系だと作るのが簡単)
ステップ実行もできるといいとは思うけどね。
evalされる毎に式を表示してリターン押すと実行とか。
0939デフォルトの名無しさん
NGNG> substringはあるのにsublistやsubvectorが無いのは何ででしょうか。
そう言う意味での「完全さ」を求めるとCommon Lispみたいに肥大しちゃう
から。(stringとlistはそもそもn番目の要素のアクセス法が全く異なるし。)
0940デフォルトの名無しさん
NGNGCommonLispみたいに汎用的なのはマクロで作って、
:stringみたいに型を明示的に指定するってのはどうですか。
実行時判定を行わずに展開時で切り分けできるし。
0942デフォルトの名無しさん
NGNG申し訳ありませんが 2-lisp,3-lispについて解説しているページを教えて戴けませんか?
ぐぐっても、まともにヒットしてくれません。
0943無名λ式
NGNGhttp://www2.parc.com/publications/pubs-hst.html の
Interim 3-LISP Reference Manual
Brian C. Smith, Jim des Rivieres, July 1984
The Implementation of Procedurally Reflective Languages
Jim des Rivieres and Brian C. Smith, July 1984
Reflection and Semantics in LISP
Brian C. Smith, June 1984
;; "3-Lisp"と引用符付けてる?
0944デフォルトの名無しさん
NGNGどこに説明が?
0945デフォルトの名無しさん
NGNGAllegroって凄く高いですよね?
0946デフォルトの名無しさん
NGNGhttp://www.shiro.dreamhost.com/scheme/index-j.html
>>945 clisp, gcl(kcl) あたりはいかが?
CommonLispはよくわからん
0947デフォルトの名無しさん
NGNGそれ知りたい。今使ってるのはGCLだけど、他にあれば教えてください。
0948デフォルトの名無しさん
NGNG確かに高いが、すごくってほどでもない。
個人じゃ手が出ないが
0949デフォルトの名無しさん
NGNGじゃ2年ローンで・・
>>945
LinuxだったらGNUの洗礼を受けたgclかな。
メンテナンスされてるのか知らないけど。
0950デフォルトの名無しさん
NGNG桁が一つ違う
0951デフォルトの名無しさん
NGNGマジで?
0952デフォルトの名無しさん
NGNGLinuxでもACLのTrial版動くみたいだけど。
http://www.franz.com/downloads/
0953デフォルトの名無しさん
NGNGcmucl http://www.cons.org/cmucl/ がよさげ。
gcl のコンパイラ遅杉。
0954デフォルトの名無しさん
NGNGWindowsバイナリがみあたらないんですが、
無いんでしょうか。
0955デフォルトの名無しさん
NGNG>2002年6月26日(水)から6月28日(金)に東京ビッグサイト(有明)で開催
>される 「第11回 ソフトウェア開発環境展 SODEC」(リード エグジ
>ビション ジャパン(株)主催) で、新日鐵ソリューションズ(株)
>ブースにおいてAllegro CL6を出展いたします。
興味のある人は行ってみたら?無料招待券と貰えるのか知らんけど。
ソフトウェア開発環境展
http://web.reedexpo.co.jp/SODEC/japanese/index.html
0956デフォルトの名無しさん
NGNGWin厨は氏ね
0957デフォルトの名無しさん
NGNG0959デフォルトの名無しさん
NGNG>価格
>・デスクトップタイプ プロフェッショナル版 130万円〜
>_ エンタープライズ版 200万円〜
>・サーバータイプ プロフェッショナル版 260万円〜
>_エンタープライズ版 400万円〜 アカデミックプライスもあります。
ACL5だから情報がちょっと古いとはいえ、
こりゃ個人では手がでませんな。
関係ないけど
>MOEBIUS (メビウス)
>Common Lisp to C translator 理想の言語変換ツール
>価格
>1,000,000円より
ってどんなだろ。
lispをcに変換するのは、schemeをcにするよりは継続とかがない分
簡単かも。
CommonLispを完全に変換するのは量的に苦労しそうだけど。
0960デフォルトの名無しさん
NGNGライブラリとしてインタプリタを持っていて、変換しきれない分はインタプリタで実行。
perlccと同じ
0961名無しさん@Emacs
NGNG> cmucl http://www.cons.org/cmucl/ がよさげ。
に二票。
Debian ならパッケージがあるし、
/etc/apt/sources.list に
deb http://www-jcsu.jesus.cam.ac.uk/ftp/pub/debian local lisp
を加えておけば、AllogroServe や UnCommonSQL も使える。
0962無名λ式
NGNGすまん、論文本体ここにはないね。しかもどこでも見つからん…
手元にあるのもthesis.psなんて名前で検索しようがない…
http://www.amazon.co.jp/exec/obidos/ASIN/4320025350/qid%3D1023006305/250-7641766-9377045
の最後の節「メタプログラミングとリフレクション」田中二郎で許して。
0963デフォルトの名無しさん
NGNG0964デフォルトの名無しさん
NGNGそろそろ次スレ立ててください。
自分は「スレッド立てすぎです・・」が出てしばらく立てられそうにないです。
0965デフォルトの名無しさん
NGNG0966デフォルトの名無しさん
NGNGLISP Scheme Part5
http://pc.2ch.net/test/read.cgi/tech/1023091882/
0967デフォルトの名無しさん
NGNG0968デフォルトの名無しさん
NGNG0969デフォルトの名無しさん
NGNG0970デフォルトの名無しさん
NGNGだれかスタンダードなLISPてどれか教えていただけませんか
処理系がおおくて。
0971デフォルトの名無しさん
NGNGcommonという名を持つLISPがいますがね。
0972デフォルトの名無しさん
NGNGCommon Lispなら、
GCL, CLISP, LispWorks(パーソナルはフリー)などなど。
探せばいくらでもあると思うんだけど。
0973踊る名無しさん 12
NGNG0974デフォルトの名無しさん
NGNG定義が載ってないので stream 系の例題が全部試せないし、自分で書こうにも
stream も macro もわかってないのでお手上げです。(多分 macro で書けるん
だろうと思っているのですが)
;; stream 系の手続き実装してる処理系使うのが一番早いんでしょうけど。
0975デフォルトの名無しさん
NGNG0976デフォルトの名無しさん
NGNG0977デフォルトの名無しさん
NGNG素直に delay 使えば出来ません?
0978デフォルトの名無しさん
NGNGフランジャーのほうが良い。
0979デフォルトの名無しさん
NGNGこのドアホ
0980デフォルトの名無しさん
NGNG0981デフォルトの名無しさん
NGNG0982デフォルトの名無しさん
NGNGLISP Scheme Part5
http://pc.2ch.net/test/read.cgi/tech/1023091882/l50
レス数が950を超えています。1000を超えると書き込みができなくなります。