CommonLisp Scheme Part12
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん
NGNGPart1: http://piza2.2ch.net/tech/kako/987/987169286.html
Part2: http://pc.2ch.net/tech/kako/1002/10025/1002584344.html
Part3: http://pc.2ch.net/tech/kako/1008/10082/1008220265.html
Part4: http://pc.2ch.net/tech/kako/1016/10162/1016211619.html
Part5: http://pc3.2ch.net/tech/kako/1023/10230/1023091882.html
Part6: http://pc3.2ch.net/tech/kako/1031/10315/1031560687.html
Part7: http://pc5.2ch.net/tech/kako/1042/10421/1042167213.html
Part8: http://pc5.2ch.net/tech/kako/1058/10582/1058263391.html
Part9: http://pc2.2ch.net/test/read.cgi/tech/1069594582/
Part10: http://pc5.2ch.net/test/read.cgi/tech/1075630259/
Part11: http://pc5.2ch.net/test/read.cgi/tech/1091456033/
関連リンクは>>2-10あたり
0002デフォルトの名無しさん
NGNG日本Lispユーザ会(日本語)
http://jp.franz.com/jlug/index.html
ここにかなりの情報があります。
http://jp.franz.com/
削るとAllegro Common Lispのページへ
プログラミング言語Scheme(日本語)
ttp://www.sci.toyama-u.ac.jp/~iwao/Scheme/scheme.html
Schemeの人はまずここを見ましょう。
Lisper への道(日本語)
ttp://www.geocities.co.jp/SiliconValley-Oakland/1680/rakup.html
判りやすいLISP入門サイト。
Schemeへの道(日本語)
ttp://www.stdio.h.kyoto-u.ac.jp/~hioki/gairon-enshuu/SchemeNotes/scheme.html
ここはschemeの入門サイト。
0003デフォルトの名無しさん
NGNGhttp://buri.sfc.keio.ac.jp/lisp/menu.html
Practical Scheme(日本語)
ttp://www.shiro.dreamhost.com/scheme/index-j.html
「普通のやつらの上を行け」など、興味深い文書を沢山翻訳されてます。
(Gaucheという完成度の高いscheme処理系作者さんのページでもあります。)
Scheme Hash(英語)
http://okmij.org/ftp/Scheme/index.html
S式でXMLを使える様にするSXMLなど
John McCarthy's Home Page
http://www-formal.stanford.edu/jmc/
LISPの生みの親、J・マッカーシーのページだそうです。
Association of Lisp Users
http://www.alu.org/alu/home
米国のLispユーザ会
0004デフォルトの名無しさん
NGNGSICP(英語)
http://mitpress.mit.edu/sicp/full-text/book/book.html
「計算機プログラムの構造と解釈」の原書です。
全てオンラインで読めます。
計算機プログラムの構造と解釈 第二版 (snip) に関連するホームページ
http://www.ipl.t.u-tokyo.ac.jp/sicp/
SICPの回答集
http://www.melt.kyutech.ac.jp/~gogogo/sicp_ex/
http://pluto.aurorasd.co.jp/~mkama/sicp/
http://www.ipl.t.u-tokyo.ac.jp/sicp/solution.root.html
http://www.sampou.org/scheme/sicp/answer/
0005デフォルトの名無しさん
NGNGSchemeで書かれた正規表現ライブラリ
ttp://www.cs.rice.edu/~dorai/pregexp/pregexp.html
幻の「入門Scheme」
ttp://www4.ocn.ne.jp/~inukai/scheme_primer_j.html
オンラインで読める
各種scheme処理系をcygwin上からビルドする方法など。
ttp://www.geocities.co.jp/SiliconValley-PaloAlto/7043/
Bit - Implantation compacte de Scheme
http://www.iro.umontreal.ca/~dube/
mini-schemeよりも小さい(?)bytecode変換系
Lisp 言語処理系: CAMPUS LIsP, Lemon version
http://aten.aial.hiroshima-u.ac.jp/~kakugawa/clisp/index-ja.shtml
Cコードによるわずか1000行の実装
Cliki
http://www.cliki.net/index
CommonLispのプログラムがたくさん紹介されているのでここを当たるべし。
0006デフォルトの名無しさん
NGNGhttp://www.isr.ist.utl.pt/library/docs/encycmuclopedia/doc/
cmucl以外でも有益なはず
CMUのLisp Repository
ftp://ftp.cs.cmu.edu/afs/cs/project/ai-repository/ai/lang/lisp/0.html
新旧様々なプログラムが置いてある
Tiny CLOS Tutorial
http://home.adelphi.edu/~sbloch/class/272/tclos/tutorial.shtml
Schemix
http://www.abstractnonsense.com/schemix/
Linuxのkernelへのパッチで、/dev/として扱えるTinyScheme
Bibliography of Scheme-related Research
http://library.readscheme.org/
Scheme関連の論文リンク集
0007デフォルトの名無しさん
NGNGawkで書かれたわずか500行のLispインタプリタ
awklispを読めばLispが理解できる
ttp://www.accesscom.com/~darius/
Emacs Lisp 2
http://pc2.2ch.net/test/read.cgi/tech/1068467385/
* Hotdog Scheme http://rover.cs.nwu.edu/~scheme/
MS が金出してたみたい
* Bigloo http://www-sop.inria.fr/mimosa/fp/Bigloo/
CLR 用のコードを吐けるようになったらしい
継続
なんでも継続
ttp://www.shiro.dreamhost.com/scheme/docs/cont-j.html
Schemeへの道:継続
http://www.stdio.h.kyoto-u.ac.jp/~hioki/gairon-enshuu/SchemeNotes/continuation.html
継続の使い方
http://www.geocities.co.jp/SiliconValley-PaloAlto/7043/index.html#continuation
継続の使用法
http://www.ice.nuie.nagoya-u.ac.jp/~h003149b/lang/block.html
CPS(継続渡しスタイル)の説明
http://www.csl.sony.co.jp/person/masui/Forum/data/20011215023622/
Kahua: 継続ベースのアプリケーションサーバー
ttp://www.kahua.org/
0008デフォルトの名無しさん
NGNGCLtL2: Common Lisp the Language 2nd edition
http://www-2.cs.cmu.edu/Groups/AI/html/cltl/cltl2.html
CLHS: Common Lisp Hyper Spec
http://www.ai.mit.edu/projects/iiip/doc/CommonLISP/HyperSpec/FrontMatter/Chapter-Index.html
R5RS: Revised(5) Scheme(ja)
http://www.sci.toyama-u.ac.jp/~iwao/Scheme/r5rsj/html/r5rsj.html
便利な情報リソース)
The Common Lisp Cookbook: いわゆる Cookbook
http://cl-cookbook.sourceforge.net/
小さい実装)
SECDR-Scheme: SECD machine model に基づく実装
ttp://lily.fan.gr.jp/~kmd/adhoc/view.rhtml?n=SECDR-Scheme_woyomu
Minischeme: 1 ファイルに凝縮された Scheme 処理系
http://tinyscheme.sourceforge.net/minischeme.tar.gz
TinyScheme: Minischeme を色々弄ったもの
http://tinyscheme.sourceforge.net/
KI-Scheme, AM-Scheme, etc...
http://www.nifty.com/download/dos/prog/lisp/
LispMe: Palm 上で動く Scheme 処理系. これも SECD virtual machine.
http://www.lispme.de/lispme/
0009デフォルトの名無しさん
NGNGhttp://ruku.qp.tc/dat2ch/0403/01/1069594582.html
独習 Scheme 三週間
http://www.sampou.org/scheme/t-y-scheme/t-y-scheme-Z-H-1.html
Schemeの教科書
よろずや
http://www.geocities.co.jp/SiliconValley-SanJose/7474/
lispの実用的な情報が色々。
0010デフォルトの名無しさん
NGNG0011デフォルトの名無しさん
NGNG大いに賛成です。個人的には、ぜひともここ↓を活用・発展させていただきたく。
http://www.komaba.utmc.or.jp/~flatline/wiliki.cgi
0012デフォルトの名無しさん
NGNG0013デフォルトの名無しさん
NGNGflatline自体コテハンみたいなものだとしても
0014名無しさん@お腹いっぱい。
NGNG001514
NGNG0016デフォルトの名無しさん
NGNG0017デフォルトの名無しさん
NGNGリスト内の任意のシンボルに対して、unquote付加を自動的に行いたい
という要件が発生しました。
以下の様なただのリストの入力に対し、指定したシンボル全てにunquoteを付加し、
擬似リストとして返す関数quotifyを実装してください。
ただし、リスト内のlambda文の変数スコープ規則を解釈する事。
書式: (quotify <unquoteしたいシンボルを列挙したリスト> <入力リスト>)
呼び出し例:
(quotify '(proc list)
'((lambda (f r rr list)
(while (pair? list)
(set! rr (cons (proc (car list)) '()))
(if (pair? f) (set! r (set-cdr! r rr)) (set! r (set! f rr)))
(set! list (cdr list)))
f) '() '() '() list)))
期待する出力結果:
`((lambda (f r rr list)
(while (pair? list)
(set! rr (cons (,proc (car list)) '()))
(if (pair? f) (set! r (set-cdr! r rr)) (set! r (set! f rr)))
(set! list (cdr list)))
f) '() '() '() ,list)
つまり、この出力をそのまま実行するとunquote部分がカレント環境で変換されます。
上の例の変数listの様にきちんとlambdaの中と外を区別する必要があります。
ただの変換なら簡単ですが、lambdaの解釈で多少複雑になると思います。
0018デフォルトの名無しさん
NGNG0019デフォルトの名無しさん
NGNGたとえばchez(petite)なら
(sc-expand '(let ((x 1)) (let ((y 1)) (+ x y) (proc list))))
-->
((lambda (#{x |?dp~%SaUTn<X\\*|})
((lambda (#{y |?dp~%SaUTn<X\\+|})
(+ #{x |?dp~%SaUTn<X\\*|} #{y |?dp~%SaUTn<X\\+|})
(proc list))
1))
1)
てな感じだから
>lambda文の変数スコープ規則
ってやつは考えなくて良くなるような気がする。
ただ、sc-expandはquotifyマクロの展開中に使われてもトップレベルで展開してしまうので。
(let ((expr (quotify '(...) '(...)))) (expr ...))
みたいなやつはどうなるかな?
実験してみたいが、時間がないので直感だけですまね。
002019
NGNG>関数quotify
ってあるけど、quotifyが`(,proc ,list)みたいなものを返したとしても、これを評価するにはevalしないといけないと思うのだが、それは意図した事だろうか?それともquotifyマクロの書き間違いかな?
0021デフォルトの名無しさん
NGNG他の macro から呼び出して使うとか。
# macro だから Schemer は syntax-rules で書くこと、とか言われたら一気に大変になりそうだし。
特定の symbol を置き換えてくような処理は、
ELisp だと CL package の lexical-let 辺りが似たようなことをしてるね。
私も簡易名前空間作ろうとして、そんな感じのコード書いたことあるし。
002217
NGNG入力はマクロ構文等が全て展開された後のリスト、ということにしておいてください。
lambdaに対応しとけば他に応用もできると思いますので。
これ考えたときはlambdaに渡される引数を与えてquotifyを呼び、
結果をevalだけでα変換できるというのがありでしたが、
unquoteする代わりに直接置換リストを与えても良かったかもしれません。
>>19
たぶんそのsc-expandの名前付け替えと同じことをします。
例えばquotifyの応用で簡単なインライン展開処理が書けると思います。
((lambda (x) ((lambda (y) (+ x y) (proc list)) 1)) 1)なら
((lambda (x) ... ) 1)という並びに注目し (quotify '(x) '((lambda (y) (+ x y) (proc list)) 1)) => `((lambda (y) (+ ,x y) (proc list)) 1)
この結果からさらに
((lambda (y) ... ) 1)という並びに注目し (quotify '(y) '((+ ,x y) (proc list))) => `((+ ,x ,y) (proc list))
という感じでquotifyを再帰的に適用してx=1 y=1の環境でevalすると
((+ 1 1) (proc list))というシーケンスが得られます。
ただしこの変換はxやyが変数や定数の場合に限定されます。
(もしxが呼び出しだったら意味が変わってしまうので。)
>>20
マクロを書け、となるとschemeではややこしくなるので、
ただのリスト変換関数ということにしておいてください。
要は任意のシンボルにタグ付けするということです。
こっちで用意した解答は週末ぐらいに貼り付けます。
0023デフォルトの名無しさん
NGNGこんな感じでよいのかな?
もうちょっとちゃんとしたやつは時間がないから今は書けん。
このままでは(lamda arg ...)とか(lamda (arg . rest) ...)とかはだめだよん。
(define quotify-rest
(lambda (ids vars expr)
(if (pair? expr)
(cons (quotify-head ids vars (car expr))
(quotify-rest ids vars (cdr expr)))
expr)))
(define quotify-head
(lambda (ids vars expr)
(if (pair? expr)
(cond
((eq? (car expr) 'lambda)
(list 'lambda (cadr expr) (quotify-head ids (append (cadr expr) vars) (caddr expr))))
(else (cons (quotify-head ids vars (car expr))
(quotify-rest ids vars (cdr expr)))))
(if (and (memq expr ids) (not (memq expr vars)))
(list 'unquote expr)
expr))))
(define quotify
(lambda (ids expr)
(list 'quasiquote (quotify-head ids '() expr))))
002423
NGNG002523
NGNG(define quotify-rest
(lambda (ids vars expr)
(if (pair? expr)
(cons (quotify-head ids vars (car expr))
(quotify-rest ids vars (cdr expr)))
expr)))
(define quotify-head
(lambda (ids vars expr)
(if (pair? expr)
(cond
((eq? (car expr) 'lambda)
(list 'lambda (cadr expr) (quotify-head ids (append (cadr expr) vars) (cddr expr))))
(else (cons (quotify-head ids vars (car expr))
(quotify-rest ids vars (cdr expr)))))
(if (and (memq expr ids) (not (memq expr vars)))
(list 'unquote expr)
expr))))
(define quotify
(lambda (ids expr)
(list 'quasiquote (quotify-head ids '() expr))))
0026デフォルトの名無しさん
NGNGにはどういう出力を期待しますか?
0027デフォルトの名無しさん
NGNG(quotify '(x) '((lambda (x) (display x)) '(lambda (x y) (+ x y)))
で後ろのquoteされたlambdaのxの方もシャドウする?
002817
NGNG可変引数はあまり本質的ではないと思いますので
省略でも良いです。
>>26
その場合の出力は
=> `(lambda (x) 'x)
ということで変化なしです。
あと書き忘れましたが、正当なlambda関数かどうかの判定は
リストのcarがシンボルlambdaの場合のみです。
(a b c lambda ...) の様なリストは関数とみなしません。
(lambda <引数リスト> ... )で始まるリストのみとします。
>>27
考えてませんでした。
その例ではたまたま結果は変わりませんが、
=> `((lambda (x) (display x)) '(lambda (x y) (+ x y)))
つまり入力リスト内にquoteがあっても特別な解釈は不要です。
quoteタグリスト内でlambdaが出現したら他と同じ様に解釈してください。
あまり凝った実装しても逆に使いにくくなると思うので。
0029デフォルトの名無しさん
NGNG'((lambda (lambda) (lambda (a b) (list a b))) list)
みたいな入力リストがあったら、3番目のlambdaは束縛変数になる
わけだが、それはどうしよう。
出題者はLisp-2を考えてるみたいだから考えなくてもいいんかな。
003123
NGNG(define quotify-iter
(lambda (ids vars expr head)
(if (pair? expr)
(if (and head (eq? (car expr) 'lambda))
(append (list 'lambda (cadr expr)) (quotify-iter ids (append (cadr expr) vars) (cddr expr) #t))
(cons (quotify-iter ids vars (car expr) #t)
(quotify-iter ids vars (cdr expr) #f)))
(if (and (memq expr ids) (not (memq expr vars)))
(list 'unquote expr)
expr))))
(define quotify
(lambda (ids expr)
(list 'quasiquote (quotify-iter ids '() expr #t))))
(quotify '(a) '((lambda (x y a) (+ x y a)) (a b c)))
-->`((lambda (x y a) (+ x y a)) (,a b c))
(quotify '(a) '((lambda (x y a) (+ x lambda a)) (a b c)))
-->`((lambda (x y a) (+ x lambda a)) (,a b c))
(quotify '(a b) '((lambda (x a b c) (x a b c)) ((lambda (a) (+ a b)) x a b)))
--> `((lambda (x a b c) (x a b c)) ((lambda (a) (+ a ,b)) x ,a ,b))
(quotify '(a b c) '((lambda (x c) (list a b c)) '(1 2 3 . c)))
--> `((lambda (x c) (list ,a ,b c)) '(1 2 3 . ,c))
どかな?
0032デフォルトの名無しさん
NGNGhttp://translate.google.com/translate?hl=ja&sl=en&u=http://mitpress.mit.edu/sicp/&prev=/search%3Fq%3Dsicp%26hl%3Dja%26lr%3D%26c2coff%3D1%26sa%3DG
0033デフォルトの名無しさん
NGNG0034デフォルトの名無しさん
NGNG石田さんより訳が上手だね。
0035デフォルトの名無しさん
NGNG「送りなさい。」にワロタ
0036デフォルトの名無しさん
NGNG暇だったら訳してあげる。
0037デフォルトの名無しさん
NGNGSICP・・・とか言ってみる。
0038デフォルトの名無しさん
NGNGAMOP
SICPは平易な英語なので、英語の勉強ついでに読むのが良いと思った。
0039デフォルトの名無しさん
NGNG004017
NGNG>>23さんご参加ありがとうございました。
ほぼ同じ内容になってしまったので可変引数と>>29のケースに対応してみました。
(define (quotify unqlist x)
(define (last-cdr x)
(if (pair? x) (last-cdr (cdr x)) x))
(define (dotlist->list x)
(let ((r (last-cdr x)))
(if (null? r) x (reverse! (cons r (reverse x))))))
(define (seq x vars)
(if (pair? x)
(cons (q (car x) vars) (seq (cdr x) vars))
(q x vars)))
(define (q x vars)
(if (pair? x)
(cond
((and (not (memq (car x) vars)) (eq? (car x) 'lambda)) ;; >>29のケース
(list*
'lambda
(cadr x)
(seq (cddr x)
(append (dotlist->list (cadr x)) vars)))) ;; 可変引数
(else
(seq x vars)))
(if (and (not (memq x vars))
(memq x unqlist))
(list 'unquote x)
x)))
(list 'quasiquote (q x '())))
0041デフォルトの名無しさん
NGNG0042デフォルトの名無しさん
NGNG0043デフォルトの名無しさん
NGNGlispなら掲示板作るのが楽そうなので。
004417
NGNGseqは例えば(a b c lambda ... )というリストに引っかかるのを防ぐため、
リストの頭にあるかどうかを区別するために必要です。(>>28)
>>23さんのコードでもseq相当をheadというフラグで処理しています。
それとdotlist->listが動かないという意味がわかりませんでした。
試した処理系など、もう少し詳細を教えてください。
Scheme的には大丈夫だとは思っておりますが。
>>42
let等はマクロとして展開可能なのでlambdaだけにしました。(>>22)
0045デフォルトの名無しさん
NGNG0046デフォルトの名無しさん
NGNGcgiじゃだめなのか?
どうしてもサーブレットを使いたいならkawa + tomcatでできるかも
0047デフォルトの名無しさん
NGNGできたらノウハウ公開して欲しい、かも。
0048デフォルトの名無しさん
NGNGwebサービスやりたいんじゃないのか?
0049デフォルトの名無しさん
NGNGCGI?
LISPでどうやってCGIをやるのですか?
当方LISP初心者ですが、LISPでCGIできるのなら
やりたいです。windowsでも出来ますか??
0050デフォルトの名無しさん
NGNGこれがtomcatの代わりになるのだろうか??
0051デフォルトの名無しさん
NGNG0052デフォルトの名無しさん
NGNG0053デフォルトの名無しさん
NGNG何かを知るところから始めれ。
0054デフォルトの名無しさん
NGNGお前が知障。死ね
そしてオヤスミ♪
0055デフォルトの名無しさん
NGNG0056デフォルトの名無しさん
NGNGあ、 apache は別にいらないから念のため
0057デフォルトの名無しさん
NGNG(reverse '(a . b))
がSCMじゃエラーだな。
0058デフォルトの名無しさん
NGNGPaul Graham, ANSI Common Lisp の練習問題の解答を載せた
ホームページ等、ご存知でしたら教えていただけませんでしょうか。
0059デフォルトの名無しさん
NGNG0060デフォルトの名無しさん
NGNG「"ANSI Common Lisp" 練習問題 解答」でぐぐれ。
……出てこないね。漏れの使ってるYahooだとそれっぽいの出るんで試してみれ。
>>59
あ、ほんとだ。Bugsに報告されて重い腰を上げたのかな? (・∀・)
0061デフォルトの名無しさん
NGNG0062デフォルトの名無しさん
NGNGCGIできてますよ。
0063デフォルトの名無しさん
NGNG0064デフォルトの名無しさん
NGNGLISPのWikiって他にあるかなあ?
0065デフォルトの名無しさん
NGNG0066デフォルトの名無しさん
NGNGその計算を行う関数を作りたいのですが、四則演算やカッコの優先順位付けに
かなり苦戦しています。一応再帰でカッコを順にはずす関数を作ってはみたんですが・・・
(defun flat (x)
(calc
(cond ((null x) NIL)
((atom x) x)
((atom (car x)) (cons (car x) (flat (cdr x))))
(T (append (flat (car x)) (flat (cdr x))))
)
)
)
実際に計算するcalc関数ができない上、この方法だと実装不可能なような気も。
どなたか別なアプローチで組める方いませんか?
【入力】 【期待する出力結果】
(calculate '(1 + 2)) → 3
(calculate '(1 + 2 * 3)) → 7
(calculate '(1 + 2 * (3 + 2)))→ 11
0067デフォルトの名無しさん
NGNG普通に左から右に読んでくだけだと思うけど
難しく考えすぎじゃないかな
優先順位の括弧とリストの括弧ごっちゃにしてる気がする
LISPでやるとしたら
中置記法→LISPの前置記法に直してevalするだけ
(1 + 2 * (3 + 2))なら(+ 1 (* 2 (+ 3 2)))に変換してeval → 11
0068デフォルトの名無しさん
NGNG普通かっこの部分はcalculateに渡して再帰させるんじゃない?
006966
NGNG>>(1 + 2 * (3 + 2))なら(+ 1 (* 2 (+ 3 2)))に変換してeval → 11
おっしゃる通りです。
再帰で階層をどんどん潜らせて、リストの中のリストに含まれる演算子を捜して、
「×」を見つけたらその前後を含めてリストを作らせるというようなことをやりたいのですが、
ソースがどうもわからなくて。
友人がlengthを使って要素数を判定させながらひたすら二項演算のカッコ(←つまりリストの中のリスト)を
作る方法はどうだと言ってましたが、それもコーディングがよくわかりません・・・。
>>68
calculateはこの場合flatを呼び出す再帰のときに実行されると思うのですが、
全く的はずれなことをしているのでしょうか・・・?
0070デフォルトの名無しさん
NGNG優先順位がめちゃくちゃになるよ。
足し算、引き算にぶつかるまでずっとたどっていけばいい。
で繰り返して使う。
0071デフォルトの名無しさん
NGNGこんなかんじでできるのでは。
例: '(1 + 2 * 3 / 4 - 3)
;とりあえず最初の二項を。
'(+ 1 2)
* ;+より強いので第二引数を書き換え。
'(+ 1 (* 2 3))
/ ;+より強いので第二引数を書き換え。
;/は*と同じなので(* 2 3)の外側に。
'(+ 1 (/ (* 2 3) 4))
- ;+と同じなので外側に。
'(- (+ 1 (/ (* 2 3) 4)) 3)
007266
NGNG考え方としてはflatはリストの中のリストの()の中身を計算して
その後にカッコをはずすという関数にしたかったのですが、
現段階では確かに計算順序がくずれるかも・・・。
つまり式のカッコははずさずに演算子に注目する>>71さんと同じ考え方でしょうか?
>>71
丁寧な説明ありがとうございます!これは入力されたリストAとは別に新しくリストの変数Bを宣言して、
Aを見ながら、Bにどんどん上書き更新していくという感じでしょうか?
そうすると再帰的な関数で組めるかかなり不安です(´・ω・`)
0073デフォルトの名無しさん
NGNG(define operator-prec-alist
'((* 20)
(/ 20)
(+ 10)
(- 10)))
(cadr (assq '+ operator-prec-alist))
(define (compare-operators-by-precedence comp op1 op2)
(comp
(cadr (assq op1 operator-prec-alist))
(cadr (assq op2 operator-prec-alist))))
(define (parse exp)
(cond
((not (list? exp)) exp)
((= (length exp) 1) (car exp))
(else
(parse-op (parse (list-ref exp 0))
(cdr exp)))))
0074デフォルトの名無しさん
NGNG(define (parse-op arg1 restexp)
(let ((op1 (list-ref restexp 0)))
(cond
((= (length restexp) 2) (list op1
arg1
(parse (list-ref restexp 1))))
(else
(let ((op2 (list-ref restexp 2)))
(if (compare-operators-by-precedence < op1 op2) ; eg. op1=+, op2=*
(list op1
arg1
(parse (list-tail restexp 1)))
(parse-op (list op1 arg1 (parse (list-ref restexp 1)))
(list-tail restexp 2))))))))
0075デフォルトの名無しさん
NGNG>>73
> (cadr (assq '+ operator-prec-alist))
これは無視してください。
007671
NGNG> そうすると再帰的な関数で組めるかかなり不安です(´・ω・`)
簡単に書けるよ。二変数A, Bを取る末尾再帰の関数で、
f (A:入力リスト) (B:空リスト) で呼び出して、
で入力Aを削りつつ、Bを書き換えていって、Aが無くなったらBをかえす。
007766
NGNGちょっと知らない命令(cadr assq parse等)が多い感じなので勉強しながら
読み解いてみたいと思います。Common Lisp ・・・ですよね?
関数定義の仕方が微妙に違うのはLispから派生した言語とかだからでしょうか?
一応自分はxyzzyとemacsを併用して考えております(;´Д`)
>>76
末尾再帰は一度調べたことあるのでもっかいググってきます!
希望の光が見えてきた(ノ∀`)
0078デフォルトの名無しさん
NGNG安直で冗長だが
* or / が出てきたら前後の項をあわせて括弧でくくる
というやり方でもいける
(defun sub (exp)
(cond ((atom exp) exp)
((case (length exp)
(1 (sub (car exp)))
(3 (cons (cadr exp) (list (sub (car exp)) (sub (caddr exp)))))
(t (case (cadr exp)
((* /) (sub (cons (list (car exp) (cadr exp) (caddr exp)) (cdddr exp))))
((+ -) (list (cadr exp) (sub (car exp)) (sub (cddr exp))))))))))
0079デフォルトの名無しさん
NGNG既存の infix パッケージ使えば?
http://www.cliki.net/infix
0080(define (´∀`) 'マターリ)
NGNG(let ((stack '()))
(while (consp exp)
(if (memq (car exp) '(* /)) (setq stack (cons (funcall (car exp) (calc (car stack)) (calc (cadr exp))) (cdr stack))
exp (cddr exp))
(setq stack (cons (car exp) stack)
exp (cdr exp))))
(while (consp stack)
(if (memq (car stack) '(+ -)) (setq exp (funcall (car stack) (cadr stack) exp)
stack (cddr stack))
(setq exp (car stack)
stack (cdr stack))))
exp))
0081(define (´∀`) 'マターリ)
NGNGは
(if (memq (car exp) '(* /)) (setq stack (cons (funcall (car exp) (calculate (car stack)) (calculate (cadr exp))) (cdr stack))
0082(define (´∀`) 'マターリ)
NGNGは
(if (memq (car stack) '(+ -)) (setq exp (funcall (car stack) (culculate (cadr stack)) (culculate exp))
0083(define (´∀`) 'マターリ)
NGNG無駄なcalculateの再帰が多くてすみません。
(defun calculate (exp)
(let ((stack '()))
(while (consp exp)
(if (memq (car exp) '(* /)) (setq stack (cons (funcall (car exp) (calculate (car stack)) (calculate (cadr exp))) (cdr stack))
exp (cddr exp))
(setq stack (cons (car exp) stack)
exp (cdr exp))))
(while (consp stack)
(if (memq (car stack) '(+ -)) (setq exp (funcall (car stack) (calculate (cadr stack)) exp)
stack (cddr stack))
(setq exp (calculate (car stack))
stack (cdr stack))))
exp))
0084(define (´∀`) 'マターリ)
NGNG(let ((stack '()))
(while (consp exp)
(if (memq (car exp) '(* /)) (setq stack (cons (funcall (car exp) (car stack) (calculate (cadr exp))) (cdr stack))
exp (cddr exp))
(setq stack (cons (if (consp (car exp)) (calculate (car exp)) (car exp)) stack)
exp (cdr exp))))
(while (consp stack)
(if (memq (car stack) '(+ -)) (setq exp (funcall (car stack) (cadr stack) exp)
stack (cddr stack))
(setq exp (car stack)
stack (cdr stack))))
exp))
0085デフォルトの名無しさん
NGNG0086デフォルトの名無しさん
NGNG#'consを作れ。
carとcdrは使って良い。
それ以外はとくに指定しないけど、#'consと同等の機能を果たすもの、高階関数などは当然不可。
実はANSI Common Lisp3章の問題にあります。
0087デフォルトの名無しさん
NGNG0088デフォルトの名無しさん
NGNG0089デフォルトの名無しさん
NGNG0090デフォルトの名無しさん
NGNG0091デフォルトの名無しさん
NGNG引数リストのを使うわけか。
0092デフォルトの名無しさん
NGNG0093デフォルトの名無しさん
NGNG(multiple-value-bind (read-from-string ...) ...)
で読むより
(let ((s (make-string-input-stream ...)))
で (read s) した方が速いんですね.cmucl でしか試していませんが.
常にこうなるものですか? stream を作るって大した仕事じゃないのかな?
0094デフォルトの名無しさん
NGNG多値ってのはそんなに多くの数を想定してるわけじゃないから。
009666
NGNGソースありがとうございます!xyzzyで実行したのですが、memqで怒られました。
シンボルの一致のeqlのことでしょうか?そこを変えて実行したら以下のようになりました。
まだスタックが使えないのでエラーの原因がわかりませんが・・・。
(calculate '(1 + 2 * 3 + (43 - 3))) → 1
0097デフォルトの名無しさん
NGNG(defun memq (item list)
(member item list :test #'eq))
0098デフォルトの名無しさん
NGNG0099デフォルトの名無しさん
NGNGXYZZY
0100デフォルトの名無しさん
NGNGmapcar が見辛いという理由で loop の collect を使ってしまいます.
他にもエディタに助けてもらいたいことがいろいろあります (失念).
それと,みなさんの (format t str ...) の str の書き方が知りたいです.
これが長い場合,C 言語みたいに "abc" "def" <===> "abcdef" になれば
次の行に書くことができますが,そうはいかないので
どうしたものかと思っています.
コーディングスタイル tips のサイトがあればいいのですが...
0101デフォルトの名無しさん
NGNGあいにくSchemeしか知らんのでSchemeですまぬ
(define transform-1
(lambda (head rest)
(if (null? rest)
(transform head)
(case (car rest)
((+ -) (list
(car rest)
(transform head)
(transform-1 (cadr rest) (cddr rest))))
((* /) (transform-1
(list
(car rest)
(transform head)
(transform (cadr rest)))
(cddr rest)))
(else 'syntax-error))))))
(define transform
(lambda (expr)
(if (and (pair? expr) (not (memq (car expr) '(+ - * /))))
(transform-1 (car expr) (cdr expr))
expr)))
(define calc
(lambda (expr)
(eval (transform expr))))
0102101
NGNG(calc '(((1 + 2) - 6) * 3 )) == -9
(calc '(1 + 2 * 3 + (43 - 3))) == 47
(calc '(1 + 2 * (3 + 2)) ==> 11
0103101
NGNG9行目の
(transform-1 (cadr rest) (cddr rest))))
は
(transform (cdr rest))))
だった
0104デフォルトの名無しさん
NGNG0105101
NGNG(define transform-1
(lambda (head rest)
(if (null? rest)
head
(case (car rest)
((+ -) (list
(car rest)
head
(transform (cdr rest))))
((* /) (transform-1
(list
(car rest)
head
(transform (cadr rest)))
(cddr rest)))
(else 'syntax-error))))))
(define transform
(lambda (expr)
(if (and (pair? expr) (not (memq (car expr) '(+ - * /))))
(transform-1 (transform (car expr)) (cdr expr))
expr)))
(define calc
(lambda (expr)
(eval (transform expr))))
こうか?
0106デフォルトの名無しさん
NGNGもいらないだろ。
一回変換したやつを省いているだけだろ。
010766
NGNG>>101-103
丁寧にありがとうございます!
Schemeはまだ守備範囲外なのでソースとっておいて勉強します!
逆ポーランド記法に基づいて計算をする関数を
同じくCommon Lispで今考えているのですが、
スタックを使わなくてできる方法ってないですか?
リストでできるらしいのですが・・・。
0108デフォルトの名無しさん
NGNG0109デフォルトの名無しさん
NGNG0111デフォルトの名無しさん
NGNGformat文字列が長くなるときは
(format t "abc~
def~
ghi")
みたいに書いたりするね。(表示は"abcdefghi"、インデント部分は消える)。
エディタのautoindentが効かないのがちょっとアレだけど。
0112デフォルトの名無しさん
NGNGdef")
>> abcdef
=>> nil
0113デフォルトの名無しさん
NGNGあっちはlengthでの判定が入ってるけど実は省けて、省くと>>101とほとんど一緒。
0114デフォルトの名無しさん
NGNG'(a := b := 1 + 2 + (c := 3))
=> (:= a (:= b (+ 1 2 (:= c 3))))
(:= c 3)はschemeなら(begin (set! c 3) c)という感じのマクロつーことで
0115デフォルトの名無しさん
NGNG知らなかった...
format の書式は膨大だなぁ.
これを elisp の lisp-mode がサポートしてくれないだろうか.
0116デフォルトの名無しさん
NGNGトランプの種類(スーツ)を数える関数ってどうすればいいですか?
(count-suit 'spades *my-hand*) -> 2
0117デフォルトの名無しさん
NGNG(do ((y (memq x (map cadr y)) (memq x y))
(n 0 (+ n 1)))
((not y) n)))
0118デフォルトの名無しさん
NGNG(length (apply append (map (lambda (z) (if (eq? (cadr z) x) (list x) '())) y))))
0119デフォルトの名無しさん
NGNG(define (count-suit suit hand)
(count (lambda (card) (eq? (cadr card) suit)) hand))
CL
(defun count-suit (suit hand)
(loop for card in hand count (eq (cadr card) suit)))
0120デフォルトの名無しさん
NGNG(apply + (map (lambda (z) (if (eq? (cadr z) x) 1 0)) y)))
0121デフォルトの名無しさん
NGNG(defun count-suit (suit hand)
(count suit hand :key #'second))
0123デフォルトの名無しさん
NGNG0125デフォルトの名無しさん
NGNG0126デフォルトの名無しさん
NGNGSchemeだったら作れるでしょ
0128デフォルトの名無しさん
NGNG(確かドイツ人だったような)
その人がなんか作ってたと思う。SCMかCLISPか忘れたけど。
0129デフォルトの名無しさん
NGNGttp://www.rainer-keuchel.de/software.html
0130デフォルトの名無しさん
NGNGサンプルデモにグラフィックスの表示とかあった。
0131130
NGNGttp://www.mazama.net/scheme/pscheme.htm
0132デフォルトの名無しさん
NGNGhttp://pc5.2ch.net/test/read.cgi/tech/1101386936/
18 名前:デフォルトの名無しさん sage 投稿日:04/11/29 00:45:51
今のCommonLispに足りないもの
>>11 GUI
>>12 cgi
>>13 Win32
>>17 DB
↑誰か反論の書き込みしてきてくれんか?
0133デフォルトの名無しさん
NGNG反論:いや、なにより一番足りないのは「人気」だ・・・
0134デフォルトの名無しさん
NGNG0135デフォルトの名無しさん
NGNGCommon Lisp にゃ規格には足りないけどライブラリや処理系独自拡張で大抵あるけどな.
GUI : Tk (ltk), GTK (lambdaGTK), CLX, CL-SDL, OpenGL, CLIM, CAPI, Allegro の GUI ...
cgi : AllegroServe, PortableAserve, WebActions, Araneida, CL-HTTPD, ...
Win32 : スマン,Windows 良くしらん.FFI では駄目なん?商用処理系ならそれなりに
サポートがあると思うけど…
DB : 今なら CLSQL か?処理系によっては PostgreSQL, MySQL, Oracle, SQLite2/3 あたり
へのインターフェースを備えているし
つーかスレッドとかネットワーク API も処理系毎にバラバラだしなー.そんあ
欠点はわかっちゃいるけどね.止められないなぁ.
0136デフォルトの名無しさん
NGNG0137デフォルトの名無しさん
NGNGそれは欠点から目を逸らそうとしているだけにしか見えないのですが…。
0138デフォルトの名無しさん
NGNG0139デフォルトの名無しさん
NGNGなんも楽しくないよ。
0140デフォルトの名無しさん
NGNG0141デフォルトの名無しさん
NGNG0142デフォルトの名無しさん
NGNG0143デフォルトの名無しさん
NGNGまぁ記号微分でも書くのがいいんじゃないかと.
でも正直,Lispでなければできないことって最近あまりない希ガス.
洩れはプロトタイピングだったらRubyで済ませることが多い.
現在,Lispでなければできないことといったら,on Lispで解説されたテクニックに代表される,
マクロを駆使したメタプログラミング/プログラム変換/部分評価による大規模開発だよね.
「人間の扱い切れない複雑膨大なコードをLisp処理系に書かせる」みたいな.
入門者は普通やらないよな...
「構文に対する抽象化」ってのの存在を知るだけでも後々ご利益があるとは思うけど.
Lispの普及度がある臨界を超えれば,
現在の様々な問題領域における標準的なDSL定義環境として重宝されると思うんだけどな...
GUIしかりRDBしかりXML Webサービスしかり.
Paul Grahamが言うには「ある言語が普及するには,
クールなシステムの標準スクリプト言語としての位置づけが必要」だってさ.
CはUnixのスクリプト言語だって.N88-Basicもそのクチかもね.
0144デフォルトの名無しさん
NGNG一応Hyperspecもつつきまわしてみましたが、載ってないので……。
continuationって他の言語(特にC++とか)と組み合わせるのを
とっても難しくしてるように思うんですけど、そんなことないですかね?
0145デフォルトの名無しさん
NGNG脱出だけならブロックがあるからそれを使う.
On Lispにはマクロとクロージャでcontinuationまがいを実装する話が載ってるけど,効率悪そう.
C++の例外も他の言語と組み合わせるのにハードルだよね.
ちょっと複雑な言語になればそう簡単に組み合わせるわけにはいかなくなるんじゃないかな.
0146デフォルトの名無しさん
NGNG「オマエのACLフルバージョンくれよ」ってポストしてたバカが居たね。
商用処理系の割れ物を欲しがる奴が居るってことはまだ死んでないのかな。Lisp.
0147デフォルトの名無しさん
NGNGまぁ,そのへんは基本だから我慢してみてよ.動作を含めてあたりまえだと思えるよ
うになればいろいろ便利な事がある.reverse カンペキだと思ったら C 言語でリスト
構造とその reverse 処理を書いてみてください.
>>143
Lisp は(当時は比較的クールだった) Lisp マシンの標準スクリプト言語だったけ
ど普及しなかったじゃん….
0148デフォルトの名無しさん
NGNG0149デフォルトの名無しさん
NGNG0150デフォルトの名無しさん
NGNG0151デフォルトの名無しさん
NGNGLisp試験紙を口につっこんでみて、Lispの文字が浮き上がってきたら悟ってる。
0152デフォルトの名無しさん
NGNGその「いろいろ便利な事」を先に教えてあげればやる気が出るんじゃない?
0153デフォルトの名無しさん
NGNGLispマシン自体の「普及」が限られていたからね…
Lispマシン業界にSUNが出現しなかったことが不幸だったのかな。
0154デフォルトの名無しさん
NGNG0155デフォルトの名無しさん
NGNG0156デフォルトの名無しさん
NGNG0157デフォルトの名無しさん
NGNG0158デフォルトの名無しさん
NGNG0159デフォルトの名無しさん
NGNGVB の代わりの Visual Lisp が厨房向け言語になってただろう。
Common Lisp は Microsoft の横槍によってもっとグダグダになり、
Allegro 等の ISV はすでに生き残ってないかも。
0160デフォルトの名無しさん
NGNG0161デフォルトの名無しさん
NGNG0162デフォルトの名無しさん
NGNG0163デフォルトの名無しさん
NGNGプログラムを書いたところ、エラーがでて、その原因をお伺いしたかったのですが、このスレでよかったでしょうか?
SICP 問題1.37 連分数展開の問題
”コード”
(define (cont-frac n d k)
(define denom (d k));分母
(define numer (n k));分子
(define (cont-fraction p)
(if(> p 1)
((set! denom (+ (d (- p 1)) (/ numer denom)))
(set! numer (n (- p 1)))
(cont-fraction (- p 1)))
))
(cont-fraction k)
(/ numer denom)
)
”入力”
(cont-frac (lambda(i) 1.0)
(lambda(i) 1.0)
10)
”エラー”
procedure application: expected procedure, given: #<void>; arguments were: #<void> #<void>
”環境”
Dr.scheme
0164デフォルトの名無しさん
NGNG0165デフォルトの名無しさん
NGNG分かっていないと思われ。
補足すると、Schemeインタープリタはリストの最左端を手続きとみなすが、
((set! denom (+ (d (- p 1)) (/ numer denom)))
(set! numer (n (- p 1)))
(cont-fraction (- p 1)))
というリストの最左端は (set! denom (+ (d (- p 1)) (/ numer denom)))
という式になっていて、それが返す値が #<void> だ、ということ。
もしこれが何かの手続きを返すのなら意味があるだろうけど、ここでは
それは意図していることではない。
(+ 1 1)
に対して、
(let ((plus +))
(plus 1 1))
とか、
((if #t +) 1 1)
とか、
((lambda (a b) (+ a b)) 1 1)
とかを比べてみればいい。
0166デフォルトの名無しさん
NGNG(define (cont-fraction p denom numer)
(if (> p 1)
(cont-fraction (- p 1) (+ (d (- p 1)) (/ numer denom)) (n (- p 1)))
(/ numer denom)))
(cont-fraction k (d k) (n k)))
0167デフォルトの名無しさん
NGNG0168デフォルトの名無しさん
NGNG>このスレでよかったでしょうか?
気味の悪い日本語やめろ。Schemeの前に日本語やれよ。
0169デフォルトの名無しさん
NGNGそれね、京都のファミレスでウェイトレスがよく使う言葉だよ。
慣れるとどうってことないよ。
0170デフォルトの名無しさん
NGNGちょっと前に全国の飲食店のバイトが良く使う間違った敬語として有名だ
0171デフォルトの名無しさん
NGNG0172デフォルトの名無しさん
NGNGなれればシンタックスエラーも気にならないってか。
京都人の神経はわからん。
0173デフォルトの名無しさん
NGNGそれが正しいことである根拠を示せ。(有名というのは根拠に非ず)
0174デフォルトの名無しさん
NGNG言語学
http://academy3.2ch.net/gengo/
0175デフォルトの名無しさん
NGNG0176デフォルトの名無しさん
NGNG一般的なコンパイラが出すsyntax errorと同様に考えてはいけない。
それは即失敗していることを意味するが、自然言語の場合は自分が普段使っている
言語の表現と違った表現をしていたとしても、それは誤りではない。
現にその表現を使っているシーンを何度も見ている人はその表現の意味を理解できる。
私には>>172の神経は解かるよ。一般的なコンパイラと人を同一視してしまっている
んだ。
0177デフォルトの名無しさん
NGNG説明できないから、相手の能力を否定することで説明逃れをするつもりか?
低能だな。
0178デフォルトの名無しさん
NGNG使用感とかどうでしたか?
LispWorks フリー版: http://www.lispworks.com/downloads/index.html
0179デフォルトの名無しさん
NGNG自然言語は意味が通じるからといってそれだけで問題無しとしてはいけない。
プログラミング言語のように技術的な便益だけで考えてはいけないからね。
0180デフォルトの名無しさん
NGNGおまいはこのCommonLispスレで、
「質問されてもいない内容を、さも既に質問済みであって
これが二回目の問いであるかのように過去形で述べる事の
押付がましさの、本来敬語が持つべき敬意とか遠慮とかとの
相容れなさ云々」とか長々と聞きたいのか?
0181デフォルトの名無しさん
NGNG疑問に思った事は聞いておきたい。
それがスレタイと関係なくても問題はない。
なぜなら、スレタイはスレ内容を縛るものではないからだ。
0182デフォルトの名無しさん
NGNG日本語の進化は京都が最先端。そこから全国へ下っていく。
0183デフォルトの名無しさん
NGNG言葉は変わる。
0184デフォルトの名無しさん
NGNG0185デフォルトの名無しさん
NGNG0186デフォルトの名無しさん
NGNG0187デフォルトの名無しさん
NGNG0188デフォルトの名無しさん
NGNG0189デフォルトの名無しさん
NGNG0190デフォルトの名無しさん
NGNG自然言語は変わり続ける。
0191デフォルトの名無しさん
NGNG0192デフォルトの名無しさん
NGNG0193not 178
NGNG4.3のEnterprise Edition評価版ちろっと使った経験しかないから漏れからなんとも。
いまこれが動かせればACL 7.0リリース版とベンチ採って比較したりできたんだけどな。
0194デフォルトの名無しさん
NGNG0195デフォルトの名無しさん
NGNG変わるのと変えるのは違うし
正しいものを正しいものと言い続ける事は大切だ
自然言語だろうと関数型言語だろうと
0196デフォルトの名無しさん
NGNG0197デフォルトの名無しさん
NGNG誰かが変えたと言わなくても変わるもの。
大昔の日本語と現在の日本語は誰かが変えたと言ったわけでもないのに変わっている。
そして、その変化に順応している。
正しいかどうかという問題ではない。
ただそこにあるということだけだよ。
それに、自然言語とコンピュータ言語の出自は全く異なっている。
0198デフォルトの名無しさん
NGNG見掛ける「友達のスーパーハカー」と同様、噴飯ものなんだよね。
ちゃんと議論したいのなら専用の板にいらっしゃい。
0199デフォルトの名無しさん
NGNGttp://www.lisp.org/mop/
んでここには
> The book The Art of the Metaobject Protocol, sometimes called the AMOP,
> includes the CLOS Metaobject Protocol specification as chapters 5 and 6.
> These chapters are reproduced here in hypertext.
とあるんだけど, >>167 はここをもう見た上で「第1-4章がないのか?」と質問してるのかな?
0200デフォルトの名無しさん
NGNGそうです。全部読むことはできないのかなと。。
0201デフォルトの名無しさん
NGNGこれはどうするかは実装まかせで例えば即座にabort()しちゃっても
許されるということでしょうか?
0202デフォルトの名無しさん
NGNGたとえば、JPEG ファイルをロードする関数 (jpeg-load filename) があるとして、
filename で指定されたファイルが存在しない、読み取れない、JPEG 形式でない、
などのエラーがあった場合、それぞれに対応するエラーコードを返すという設計が
一般的ですか?
0203デフォルトの名無しさん
NGNG読み込んだJPEGファイルをオブジェクトとして操作する予定があるならクラスにして
おいてloadメソッドを定義しておいて、メソッドの値をオブジェクトそのものにするか
失敗したらnilにするかしておくかな。状態を調べるのはスロットの値を覗け、と。
まぁ、アクセサ定義しとけばいいんだけど。
一般的とか正しい方法なんてのはあってないようなもんなんで、好きに書けばいいじゃん。
0204デフォルトの名無しさん
NGNGまぁ何だ,買え(ぉ
# 1-4章はチュートリアルらしいね
0205199
NGNG(断片的だけど)これでも読んで...
ttp://dolphin.c.u-tokyo.ac.jp/~nisimu6/comp/clos/chap2.html
0206デフォルトの名無しさん
NGNGそうです。abort()したって、ランダムな値を返したって、「R5RS準拠」と
名乗ることはできます。
それが本当に使える実装かどうかは別問題。
0207デフォルトの名無しさん
NGNGなるほど。ありがとうございました。
さすがにランダムな値を返す実装はそうはないと思いますけど、
プログラムカウンタがsemanticに正しくないコードにきてしまった時点で
そこから先は未定義になるってことでしょうか。
こう書くと杓子定規の最たるものみたいですが、
「お前は本当はこうしたいんだろ? こうに違いない! 俺にまかせとけ!」
てな具合に勝手に(必要ならコードを書き換えて)動作を続けていってくれるのも
R5RS準拠なのかもw
0208デフォルトの名無しさん
NGNG> Lisp で関数を定義する場合、C と同じようにエラーコードを返す設計でよいのでしょうか?
> たとえば、JPEG ファイルをロードする関数 (jpeg-load filename) があるとして、
> filename で指定されたファイルが存在しない、読み取れない、JPEG 形式でない、
> などのエラーがあった場合、それぞれに対応するエラーコードを返すという設計が
> 一般的ですか?
Common Lispが規定しているライブラリ的な関数の挙動を参考にすると、
エラーが発生した時、関数は、エラーコードを返すのではなく、error(というLisp Object)を
error関数で発信(signal)する。
プロトタイプ的にどんどん書くときは、
(error "file ~A is not in jpeg format." filename)
などとsimple errorを発信しておいて、後から仕上げをするときに、適切な
型のerrorを発信するようにする。
0209デフォルトの名無しさん
NGNGCHEZ SCHEMEのVersion7でるようですね。(6で自然消滅かと思ってましたご免なさい)
個人で買える値段だといいんだけどなぁ...
0210デフォルトの名無しさん
NGNG0211デフォルトの名無しさん
NGNG0212デフォルトの名無しさん
NGNGたしかこのスレか前スレあたりで似た話があったのを思い出したんだけど
(そのときの結論はたしかguileだけ純インタプリタなので変態的に動作する)、
syntaxをfirst-class objectにしておいて、実行時にsyntaxがapplyされると
evalが走るようにすればどうでしょうね。
もちろん引数は先に評価されちゃうわけだけど、それは覚悟の上ということで。
(apply and (list #t #f 何かの式))
とすると、「何かの式」は評価されてしまうが、
(eval (cons and (#t #f 「何かの式」の値)))
と同義な動作をするというようにするのです。
goshだとsyntaxをapplicable objectにすればできると思うんですけど。
(define-method object-apply ((syntax <syntax>) . args)
(eval (cons syntax args) (interaction-environment)))
とかすればできるのかしら。でもやってみると無限ループに入ってしまいました。
object-applyが優先されちゃうんですかね。
0213デフォルトの名無しさん
NGNGでいいじゃん (srfi-1)
andに限らず引数先に評価していいなら普通に高階関数化できるでしょ
0214デフォルトの名無しさん
NGNG年内にリリース予定でしたっけ。
ユニコードのサポートしてくれないかなあ。
>>212
arc はマクロをファーストクラスにする予定らしいですね。
実行時に展開するかコンパイル時に展開するかは
宣言で調整できるっていう感じの話だったような。
http://www.paulgraham.com/ilc03.html
0215デフォルトの名無しさん
NGNG0216デフォルトの名無しさん
NGNG(let loop ((l function-list)
(r #t))
(cond ((null? l) r)
(((car l)) => (lambda (x) (loop (cdr l) x)))
(else #f))))
(functional-and) => #t
(functional-and (lambda () 'a) (lambda () 'b)) => b
(functional-and (lambda () 'a) (lambda () #f) (lambda () 'b)) => #f
0217デフォルトの名無しさん
NGNG(define (functional-and . function-list)
(or (null? function-list)
(and ((car l)) (apply function-and (cdr function-list)))))
0218デフォルトの名無しさん
NGNGなにがありますか?
Common Lispだと CMUCL、Schemeだと Gaucheが良いんですが、
他にもあるでしょうか。
0219デフォルトの名無しさん
NGNG0220デフォルトの名無しさん
NGNG単語だけ聞きかじって具体的なこと何も知らないのに知った風なこと言うヤシ.
自分は一度でもFFI使って意味のあるプログラム作ったことあんのかね.
0221デフォルトの名無しさん
NGNG0222デフォルトの名無しさん
NGNGschemeならbiglooが良いよ
0223デフォルトの名無しさん
NGNG記憶だと guile, scsh もオッケーのはず。他の処理系でもあったはず
だけど思い出せない。
0225218
NGNG0226デフォルトの名無しさん
NGNGbigloo よさげだよね。
でも Windows の GUI プログラム書ける?
0227デフォルトの名無しさん
NGNGUNIXのシステムコール呼びたいんじゃなかったの?
0228デフォルトの名無しさん
NGNGLispWorks 4.4がリリースされてます。
$1100...マタネアゲシテイルヨウナキガ○| ̄|_
0229デフォルトの名無しさん
NGNGお、安いな。買いだ買い!
で、日本語通るのか?
0230デフォルトの名無しさん
NGNG0231228
NGNG4.2 Personal版では通りました。(UNICODEですが、エディタとかもデフォルトで化けないで表示されます)
速度的にはどうか私も知りたいのですが、ACL7持ってませんです。
0232デフォルトの名無しさん
NGNGわかりました。しかし、Gaucheにはないようなのですが、何か、
深い理由でもあるのでしょうか?
作るならこう?
(define (atom? x)
(and (not (pair? x))(not (null? x))))
0233デフォルトの名無しさん
NGNG0234デフォルトの名無しさん
NGNGと思うんですが、define-macroみたいにメタな場合分けってできないんでしょうか。
だとしたらパワーが全然違うと思うんですけど。
0235デフォルトの名無しさん
NGNG同じ機能の not-pair? があります。
0237デフォルトの名無しさん
NGNGLW4.3との比較であればBill Clementson's Blogにベンチマーク採ったの載ってるよ。
LW4.3からLW4.4でどの程度高速化されたか早く知りたい。買わないけど。
0238デフォルトの名無しさん
NGNG世の中にはdefine-syntaxだけでquasiquoteの展開を書く人もいるわけだが....(汗
やっぱりsyntax-caseかdefine-macroがないとつらいよね。
0240デフォルトの名無しさん
NGNG0241デフォルトの名無しさん
NGNG非共有性に基づいて型を定義している以上、当然ではあるけれども。
0242デフォルトの名無しさん
NGNG研究室遊びに行って後輩捕まえて代わりに買ってもらおうかな(w
0243デフォルトの名無しさん
NGNG学生じゃなくても個人ユースならその値段で売って欲しいぞ。
0244デフォルトの名無しさん
NGNG0245デフォルトの名無しさん
NGNG同名のメソッドは引数を合わせないといけないので、
パッケージを分けたくない時は、javaとかでいう抽象クラス名みたいなものを
プレフィクスに付けたりしないと名前が被りますよね。
メッセージ伝達モデルのほうが型ごとに名前空間を分離できるし、
タイプ量も減って手軽だと思うんですけど、
普段は、そういうオブジェクトシステムを使ってるって人いないですか?
0246デフォルトの名無しさん
NGNG>>同名のメソッドは引数を合わせないといけないので、
何言ってんのあんた。
0247デフォルトの名無しさん
NGNGパラメータリストを整合的にしないといけないということです。
メッセージ伝達モデルだと、関係の無いクラスで
同名の引数の数が違うメソッドが定義されていないかなどといったことは
気にしませんから、それがわずらわしく感じないかということを言いたかったのですが。
0248デフォルトの名無しさん
NGNG言いたいことがよく判らない。
簡単なものでいいから、具体例を出して説明して頂けないか。
0249デフォルトの名無しさん
NGNG0250247
NGNG変数名 . 動詞or名詞
と普通のオブジェクト指向言語では書けるところが、
(パッケージ名:動詞 変数名)
あるいは、
(型名-動詞or名詞 変数名)
となって、タイプ量が増えて面倒だと言いたいだけです。
普通はパッケージ名は書かないのかもしれませんが、
複数のパッケージからインポートして、それぞれに整合的でないメソッドが
含まれている場合、シンボルのインポートを諦めるか、
メソッド名に基底クラス名等のプレフィクスを付けるか、
全く違う名前に変更してユニーク性を確保する羽目になります。
型の名前やパッケージ名が繰り返し書かれると、
情報の多重化になりますから、名前を変更する時も面倒です。
本当に複数の引数の型でディスパッチしたい状況というのは少なそうですから、
この負担が割りにあってるかは疑問です。
日常的に使いたくなるのはメッセージ伝達モデルの方であり、
総称関数を使いたい状況の方がむしろ特殊じゃないかと。
オブジェクトをキーワードやシンボルを引数に取るクロージャにして
(funcall 変数名 '動詞)
Schemeなら単に (変数名 '動詞)
と書けるようなオブジェクトシステムを実装するのは簡単なので
やってる人は結構いるんじゃないかと思ったのですが。
総称関数モデルとメッセージ伝達モデルのトレードオフくらい
ここの人は分かってると思ったので、単に
「メッセージ伝達モデルの奴が欲しいんだけど、いいのない?」
みたいな聞き方でも充分通じると思ったのですが。
0251デフォルトの名無しさん
NGNG0252デフォルトの名無しさん
NGNGいや、だから具体例を出してくれはしないだろうか。
何で generic function の名前に型名をつける必要があるのか理解できない。
パッケージについても、まあ名前の衝突はありうるけれども、
それがメッセージ伝達型だと何で解消できるの?
それは総称関数モデルの問題じゃなくて、
Common Lisp のパッケージシステムの問題じゃなかろうか。
取りあえず、何というか、手続きの総称化ということについて
よく判っていないのではないかという印象を受けた。
ちなみにメッセージ伝達モデルの oo については
Paul Graham の"ANSI Common LIsp" で例題として実装している。
まあ、Common Lisp でわざわざ oo 実装するやつも少ないので、
Scheme の方で探して、気に入ったのがあったら移植でもしたらいいんじゃない?
CLOS like なのしか思い浮かばないんで、紹介は出来ないけど。
0253デフォルトの名無しさん
NGNG> よく判っていないのではないかという印象を受けた。
俺も。何か気の毒だからちゃんと勉強して出直すことを期待。
0254デフォルトの名無しさん
NGNG推奨されてるのに。
0255デフォルトの名無しさん
NGNG1番目の add と2番目の add の引数が違うのでだめじゃんってのが問題なんじゃない
(defclass surface ()
((poins :initform () :accessor points)))
(defclass point ()
((x :initarg :x :accessor x)
(y :initarg :y :accessor y)))
(defmethod add ((surface surface) (point point))
(push point (points surface)))
(defmethod add ((surface surface) x y)
(add surface (make-instance 'point :x x :y y)))
0256デフォルトの名無しさん
NGNGあと、それとは逆でラムダリストはたまたま合同になるけど、処理の内容が
ほとんど別のことを表しているときはどうだろう。なんとなく気持が悪くない?
パッケージで分割できればいいけど。
0257デフォルトの名無しさん
NGNGん?
今 Common Lisp の処理系が手元にないので Gauche で試したけど、
それ、ちゃんと動くよ? CLOS だと駄目だったっけ?
0258デフォルトの名無しさん
NGNGstklosとかgaucheは制限が緩い。
CLOSでだめなのは最適化かなんかの都合なの?
0259247
NGNG>>256
言いたいのはそういうことです。良い例をありがとうございます。
>>258
それは知りませんでした・・・
てっきり回避不可能に近い制限なのだろうと思ってたので。
その仕様だと、効率を除けばデメリットは無いですよね・・・
gaucheでいろいろ試してみます。
0260234
NGNGquasiquoteの展開ってこういうのじゃ駄目でしょうか?
(define-syntax qq
(syntax-rules (uq)
((_ ()) '())
((_ (uq a)) a)
((_ (a . b)) (cons (qq a) (qq b)))
((_ a) 'a)
))
理論上は define-syntaxでなんでも書けるらしいですね。
なにか面白いマクロネタありませんかね。
0261234
NGNG(define-syntax q
(syntax-rules (uq)
((_ ()) (qq ()))
((_ (uq a)) (list (qq uq) (q a)))
((_ (a . b)) (cons (q a) (q b)))
((_ a) (qq a))
))
うーん、なんか見落してる気がする。
0262234
NGNGevalじゃないだろうし、どうやったらいいか想像できないです。
unquoteがマクロ展開時に計算されるっていうのは、処理系がマクロ展開時、実行時
の2ステップに分かれていれば意味あると思うんですけど、そうでない場合
なにか意味あるんでしょうか? 計算結果は変わらないですよね。
0263sage
NGNG(rember* 'b '(a b c (a b c))) => (a c (a c))
これをcall/ccを使った大域脱出させたいです。
(rember* 'b '(a b c END d (a b c)) => (a c END (a b c))
しかし下のコードでは希望する動きをしません。
=> (rember* 'b (a c END (a c))
下のコードをつかって、うまく脱出する方法はあるでしょうか?
(define rember*
(lambda (a l)
(call/cc (lambda (escape)
(cond ((null? l) '())
((not-pair? (car l))
(cond ((eq? (car l) a)
(rember* a (cdr l)))
((eq? (car l) 'END)(escape (cons 'END '())))
(else (cons (car l) (rember* a (cdr l))))))
(else (cons (rember* a (car l))
(rember* a (cdr l)))))))))
0264sage
NGNG見やすく書き込む方法はあるのでしょうか?
2ちゃんねる初心者です(^^;
0265デフォルトの名無しさん
NGNGなんとなくは分かるが、前半の例と後半のコードが一致しないし、typo も多いし、
正しくはどうやりたいのかがみえない。
0266デフォルトの名無しさん
NGNGとりあえず、下げたいのなら、sageはメール欄に書こうな。
0267デフォルトの名無しさん
NGNG` ' (半角スペース) を ` ' に置換する.
0268デフォルトの名無しさん
NGNG0269デフォルトの名無しさん
NGNG何がしたいのかわかんねえよヴォケ
0270デフォルトの名無しさん
NGNG説明不足でご迷惑かけました。改めて
手続きrember* a l は、リスト「l」から再帰的に「a」を除くものです。
(rember* 'b '(a b c (a b c) ((a) (b) (c))))
; -> (a c (a c) ((a)()(c)))
-------------------
(use srfi-1)
(define rember*
(lambda (a l)
(cond ((null? l) '())
((not-pair? (car l))
(cond ((eq? (car l) a)
(rember* a (cdr l)))
(else (cons (car l) (rember* a (cdr l))))))
(else (cons (rember* a (car l))
(rember* a (cdr l)))))))
0271デフォルトの名無しさん
NGNG実際にやりたい処理は次です。
『'END にぶつかったならば、処理を終了して、最後に"LAST" を付け
たリストを得る』
具体的には、下のような処理です。
(rember2* 'b '(a b c (a b c END d e) ((a) (b) (c))))
;-> (a c (a c "LAST") ((a) (b) (c)))
こういう処理は、270以外のやり方の方がいいのかもしれません。
ただ、270は「The Little Schemer」で紹介されている定石なので、
270から発展させた解決策をしりたいです。
アドバイスをお願いします。
PS >>268 call/cc はいらないですね。ども。
0272デフォルトの名無しさん
NGNG下のrember2* では、....((a)(b)(c))) にはなりません。再帰がとまらないのです。
(rember2* 'b '(a b c (a b c END d e) ((a) (b) (c))))
;-> (a c (a c "LAST") ((a) () (c)))
(define rember2*
(lambda (a l)
(cond ((null? l) '())
((not-pair? (car l))
(cond ((eq? (car l) a)
(rember2* a (cdr l)))
((eq? (car l) 'END)
(cons "LAST" '()))
(else (cons (car l) (rember2* a (cdr l))))))
(else (cons (rember2* a (car l))
(rember2* a (cdr l)))))))
0273デフォルトの名無しさん
NGNG(define rember2*
(lambda (a l)
(letrec ((iter (lambda (a l c)
(cond ((null? l) (c #t l))
((not-pair? (car l))
(cond ((eq? (car l) a)
(iter a (cdr l) c))
((eq? (car l) 'END)
(c #f '("LAST")))
(else (iter a (cdr l) (lambda (b ll) (c b (cons (car l) ll)))))))
(else (iter a (car l) (lambda (b ll) (if b (c #t (cons ll (iter a (cdr l) (lambda (b l) l)))) (c #f (cons ll (cdr l)))))))
))))
(iter a l (lambda (b l) l))
)))
0274273
NGNG(else (iter a (car l) (lambda (b ll) (c b (cons ll (if b (rember2* a (cdr l)) (cdr l)))))))
の方が綺麗かな。
0275(define (´∀`) 'マターリ)
NGNG(let loop ((l l) (cont (lambda (x) x)) (end (lambda (x) x)))
(cond ((null? l) (cont l))
((eq? (car l) a) (loop (cdr l) cont end))
((eq? (car l) 'END) (end (list "LAST")))
((list? (car l))
(loop (car l)
(lambda (x) (loop (cdr l)
(lambda (y) (cont (cons x y)))
(lambda (y) (end (cons x y)))))
(lambda (x) (end (cons x (cdr l))))))
(else (loop (cdr l)
(lambda (x) (cont (cons (car l) x)))
(lambda (x) (end (cons (car l) x))))))))
0276デフォルトの名無しさん
NGNGLISPの思想に近いらしく、基本はすべて
object method(...)
らしい。ただ、これとは別に演算子もある。
これはこれでかなりまとも(というか普通)な発想だと思う。
また、objectとmethodに対するありがちな.(ドット)連結を廃止して、
symbol symbolという並びをobject methodに簡略化した点でも評価できる。
methodの引数をそのまま関数引数形式にしたのもC/C++勢力にも受けると思う。
さて、
object method1(...) method2(...)
とすればmethod1の結果のオブジェクトに対してmethod2を連鎖適用できる。
この書き方はC/C++でもほぼ同じだから馴染み深い。
LISP(Scheme)の関数は適用がいつも先頭引数という決まりなので
(method2 (method1 object ...))
と、見た目の順序が逆になる。
((object method1 ...) method2 ...)
という風にも書けないことはないが、
細工をしない限り機能しない。(言い換えればLISPの一般的な書き方ではない。)
※ここでいう細工とは、マクロで専用インタフェースを書くか、
自分でメソッドディスパッチする必要があるという事。
ここで思うことは、主流のオブジェクト指向をする際、
この連鎖適用における順序の違いが思考の妨げになるのではないかということ。
今主流の言語は(関数型でさえも) object method形式だから、
LISP(Scheme)でやろうとする場合、専用の頭が必要になる。
0277デフォルトの名無しさん
NGNG0278デフォルトの名無しさん
NGNG0279デフォルトの名無しさん
NGNGIoではifなどの構文もメソッドであるという。
メソッドというからには何かのオブジェクトに従属するはずだが、
Ioでは暗黙のrootオブジェクト(Lobby)という概念を作ってカバーしたらしい。
例えばif式だと
if(test_part, then_part, else_part)
という書き方になる。
構文要素をカンマで区切る辺りが少し不気味な気がするが、
LISPの怒濤の括弧ほどショッキングではないのかもしれない。
ここで注目したいのは、Ioの構文はメソッドであるため、
どうやらマクロの様な特殊な機構は必要ないらしい。
ただし肝心の評価順序の制御がどういう原理で行われるのか正確には不明。
(thisMessage という機構でえらい騒ぎになるらしい)
構文に対する特殊化を先送りしているだけにすぎない様な気もするが、
表向きメソッドとして統一した事に意義があるのだと思う。
ただ、構文をメソッドとして定義するということは、マクロの様に展開する機会がなく、
毎回作成した専用構文の解釈を行うということになるので、
実行効率はかなり犠牲なるはず。
マクロ的な展開機構が導入されれば解決するのかもしれないが、
その辺はかなり道のり遠そうである。
この辺を追求していくとIoの雲行きが怪しくなってくる。
ともあれ、実用性や効率に目をつむればかなり洗練された言語であることは間違いない。
0280デフォルトの名無しさん
NGNG0281デフォルトの名無しさん
NGNGLISPでもシンプルなオブジェクト指向ってできねーのかなと思って。
似た言語の筈のIoと何が違うのかなって知識の整理。
要はIoの構文はマクロの代わりにメッセージという裏技でカバーってことね。
基本概念違うから(CLOS程大きいシステムならともかく)適用してもあんま旨みがない。
0282デフォルトの名無しさん
NGNG0283デフォルトの名無しさん
NGNGおれは逆にえらい違いだと思ってるわけで。
object method1(...) method2(...)
に対して
(method2 (method1 object ...)...)
((object method1 ...) method2 ...)
やっぱ連鎖適用で括弧がネストするのは美しくないなと。
Ioでは現状おまけみたいなものだけど、
連鎖適用とメッセージを駆使すれば適当な構文が書けたりする。
if (test_part) then (then_part) else (else_part)
とか。
たぶんこれ遅いんだろうなあ。
0284デフォルトの名無しさん
NGNG0285デフォルトの名無しさん
NGNGこれはLispの表記法と一緒だよね。おれはこの部分でLispに違和感を感じたことはない。
0286デフォルトの名無しさん
NGNG0287デフォルトの名無しさん
NGNG0288デフォルトの名無しさん
NGNGないかい? 算数や数学でこの表記法に慣れているから。
0289デフォルトの名無しさん
NGNGobject methodの書式の話なわけで。
Ioの
object method1(...) method2(...)
はC++では
object->method2()->method2()
ね。
無理解を装ってるだけだろうけど。
0290デフォルトの名無しさん
NGNGobject->method1(...)->method2(...)
の間違いね。
LISPの場合これぐらいならフロントエンド書けばおしまいだけどね。
0291デフォルトの名無しさん
NGNGobject methodの書式の話だとして、
CLOSではメソッドが属すジェネリック関数が、普通の関数と同じ書式で呼び出せる
ということに利点を感じて、(gf1 (gf2 obj0) (gf3 obj1))なんて感じの表記に
したのでしょう。
それが主流から外れているというのなら、ふ〜んというしかないけど。
全般的に劣った表記体系かといえば、そうは思わないという話。
0292デフォルトの名無しさん
NGNGんで、その関数の引数について、こんどは右端までいかないと書けない。
これが主流のオブジェクト指向に向いてないという根拠の1つ。
数アクションぐらい余計に負担が掛かる。
0293デフォルトの名無しさん
NGNGすまん、もうねるぽ。
0294デフォルトの名無しさん
NGNGそんな表面的な部分だけ取り上げて得意気になられてもなあ
0295デフォルトの名無しさん
NGNG根幹に関わる。
0296デフォルトの名無しさん
NGNGキーボードを打つのも面倒になるのだろうな。
0297デフォルトの名無しさん
NGNG0298デフォルトの名無しさん
NGNG0299デフォルトの名無しさん
NGNGでもつまらないよ。
0300デフォルトの名無しさん
NGNGLisp にとって、構文の問題は「表面的」なんだよ。
macro 書けば解決するから。
0301300
NGNG0302デフォルトの名無しさん
NGNG「mしてね、o君」というのでも、オブジェクト指向なんじゃないの、
S式は、後者に適しているというだけなんじゃないの。
0303デフォルトの名無しさん
NGNG0304デフォルトの名無しさん
NGNGo君、m1してね p1とp2で その後 m2してね p3とp4で
後でm2してね、最初にm1してね、o君、 p1とp2で ところでm2の件だけどp3とp4使ってね
わかりますか?
0305デフォルトの名無しさん
NGNG前者が
object method1(p1, p2) method2(p3, p4)
後者が
(method2 (method1 object p1 p2) p3 p4)
なわけです。
後者は文章にするのも大変だということがわかりますか?
0306デフォルトの名無しさん
NGNG↓でも参考にして好きなようにすれば?
ttp://www.cliki.net/infix
ttp://lambda.s55.xrea.com/20040325.html
0307デフォルトの名無しさん
NGNG0308デフォルトの名無しさん
NGNG最後にmnするんだけど、そのまえにmn-1してね、・・・
最初にm1してね、o君、
m1の件はp1とp2で。
m2の件ではp3とp4、・・・
mnの件は・・・なんだっけ?
一般人の短期記憶スタックは6〜8ネストぐらいが限界だとどこかで読んだ事がありますが、
口頭で言われた場合、理解できるでしょうか。
0309デフォルトの名無しさん
NGNG当然ながらフロントエンドについては考えてるよ。
0310デフォルトの名無しさん
NGNG(syntax-rules ()
((_ obj) obj)
((_ obj (m . args) . more)
(chain (m obj . args) . more))))
(chain obj (method1 p1 p2) (method2 p3 p4))) -> (method2 (method1 obj p1 p2) p3 p4)
0311デフォルトの名無しさん
NGNGそんなにダラダラ書いたらどんな記法であろうと分かりにくくなるのは当然だろ
なんのためのインデント、なんのための一時変数、なんのための括弧、なんのt(ry
要はあんたが前置記法では分かりにくいってだけでしょ
あんたに理解しづらいからといって他の人もそうであるとは限らない
0312デフォルトの名無しさん
NGNG横長になっちゃって見辛い、てのはあるかなあ。
適当に切り分ければいいだけの話だけど。
でも、たとえばこんな感じの関数書けば、
(define cascade
(lambda (x . fs)
(fold (lambda (f knil) (f knil)) x fs)))
こんな感じに書けるけれど、
(cascade (iota 10) (filter$ even?) (fold$ + 0)) => 20
ちょっとややこしいのになるとあんまり書きやすいと感じなかったなあ。
上記の、インデントの関係で読みやすくはあったけど。
どうしてかな、て考えてみると、自分の場合はまず、結局最後は何やるの?
ていうのを考えて、それに渡す値はどうするの?
更にそれに渡す値は……みたいな感じの思考パターンで考えることが多いみたい。
元の値から結論に向って値を下げ渡していく感じじゃなくて、
最初に結論ありきでそれに向って差し戻していくイメージっていうか。上手く言えないけど。
実際のところ、最終的に何をしたいのかていうのは、
その途中の経路よりははっきりしていることが多いと思うので、
それをまず書いちゃって、それに渡す値を作るところは適当に副関数に切り分けておいて、
後からそれを別立てで書いたほうが思考の流れに沿って作業できないかなあ。
一方で充分にライブラリが揃っていて、後はそれを糊付けしていけばいい、
てところまで状態が整っているならば、obj->metha->methb->...
みたいな書き方のほうが楽かもしれない。
結局のところ、問題の質や切り分け方で、
それに適った思考過程、対応するような記法は変わってくるだろうから、
どういう記法が優れているか、ていう単純な話ではなくて、
それぞれの記法はどのように問題を切り分けるのに向いているか、てことじゃないかなあ。
0313デフォルトの名無しさん
NGNG>>304-305
後者について、generic function model で第一引数を
特別扱いするのがそもそも間違っている気がする。
(……なんか最近似たようなことを書いた記憶があるな)
message passing model に基づいて事象をモデル化したら、
message passing model に基づいた記法で書いたほうが素直になるのは当然でしょう。
そこで後者が文章にするのも大変て言われても、それはそうでしょうな、としか言えない。
無理にオブジェクトを人として扱うなら、
「o 君、p1 と p2 で」じゃなくて、「o1 君と o2 君と o3 君で」と考えた方がいい。
もっとも、それだと三人が一人になったり、
逆に(多値を返すような場合)一人が三人になったりして不気味だけど。
そういう意味じゃ、(例えば)オブジェクトを人としてモデル化したいような場合には
generic function model は確かに向いてないかもしれない。
でも、モデルなんて結局のところ問題把握のための道具でしかないんだから。
通用する範囲で便利に使えればいいし、無理があるような場合には脇に置いといたり、
場合によってはあっさり捨ててしまってもいいんじゃないかな。
どっちのモデルであれ、あるいはそれ以外のどのモデルであっても、固執するのは馬鹿らしいと思う。
ていうか、ひとつの完全なモデルがみつかってなら、
何でこれほどたくさんの「オブジェクト指向」言語が作られているのか、て話になる。
で、lisp のいいところっていうのは、
記法をそこそこ柔軟にモデルに合わせて作り変えられるってとこでしょ?
散々言われてきたことだけど。
例えばあるオブジェクトについて、手続きを順々に追っかけさせる、みたいなことをしたいなら、
自分が上に書いたのや >>311 さんが書いたようなやり方で簡単に出来るわけで、
そうした方が問題をすっきり記述できると判断するなら書きゃいいじゃんてことではあるけれど、
でもそれがどの問題についても妥当であるというなら、それは了見が狭いといいたい。
0314デフォルトの名無しさん
NGNGlisp 族がメジャーになることはないんだから、わざわざ粘着するなよ
0315デフォルトの名無しさん
NGNG何か他の値を返すようなメソッドには使えないけど。
返り値がいらないようなメソッドを続けて使うのって、表示周りとかかな…
0316デフォルトの名無しさん
NGNGNULLやnilのような無効値だったらそれ以上進まないようなやつ。
リスト処理だけなら空リストで済むから問題ないんだけどね。
0317デフォルトの名無しさん
NGNG=> (let ((obj1 (f0 obj)))
(if obj1 (let ((obj2 (f1 obj1 arg1))) obj2) obj))
というマクロ->を定義するのは簡単だよね。nilになる一歩手前のオブジェクトを
返してくれる。
0318デフォルトの名無しさん
NGNG(syntax-rules ()
((_ obj n) obj)
((_ obj n (m . args) . more)
(let ((c (m obj . args)))
(if (eq? c n) n
(chain c n . more))))))
letの変数ってこれで大丈夫なのかな?
0319デフォルトの名無しさん
NGNGデータについて考えてみても、cons してから reverse (nreverse)
ってのをよくやる(見る)けど、あれ無駄な気がしてならない。
0320デフォルトの名無しさん
NGNG前半と後半の繋がりがよくわからない
0321デフォルトの名無しさん
NGNGconsセルの先頭に突っ込むのとケツに突っ込むコストが同じだというのか。キミは。
0322デフォルトの名無しさん
NGNG破壊的操作が必要になるのであまり嬉しくないけど、
計算量的にそれが必要ならやればいいだけの話。
0324デフォルトの名無しさん
NGNGいえ、すんません。巣に帰りまつ(;´Д`)
0325デフォルトの名無しさん
NGNG0326デフォルトの名無しさん
NGNG(let loop ((l l) (r '()))
(if (null? l) (reverse r)
(loop (cdr l) (cons (car l) r)))))
(define (copy-list2 l)
(let loop ((l l) (c (lambda (x) x)))
(if (null? l) (c l)
(loop (cdr l) (lambda (x) (c (cons (car l) x)))))))
(define (copy-list3 l)
(if (null? l) '() (cons (car l) (copy-list3 (cdr l)))))
(define (copy-list4 l)
(let ((n '(())))
(let loop ((l l) (r n) (end n))
(if (null? l) (cdr r)
(begin (set-cdr! end (cons (car l) '()))
(loop (cdr l) r (cdr end)))))))
速度は
copy-list1 > copy-list4 >>> copy-list2 >>>>>> copy-list3
くらいでした。copy-list4 はなんで遅いんだろ。
0327デフォルトの名無しさん
NGNGリストの長さや処理系によっても随分違うものになるだろうから
それらを特定しない比較には意味が無いような
0328デフォルトの名無しさん
NGNGリストの長さを変えても傾向は変わらなかったのか?
0329デフォルトの名無しさん
NGNG(apply list l))
0330デフォルトの名無しさん
NGNGほんとですね。とりあえず、
(define (fact f n)
(if (= n 1) f (lambda (x) ((fact f (- n 1)) (f x)))))
(define (num-list n)
(let loop ((n n) (r '()))
(if (zero? n) r (loop (- n 1) (cons n r)))))
として
((fact copy-list1 X) (num-list Y))
みたいな感じで計ってみました。
Yを大きくすると copy-list4が速くなると思ったんですが、
copy-list1の方が速かったです。処理系は Gaucheです。
他の処理系でも試してみます。
0331デフォルトの名無しさん
NGNGcopy-list1,copy-list4がそれぞれどれくらいの時間でできるか計算してごらん。
copy-list1はgcの時間をのぞいたら変わらないと思うよ。
0332デフォルトの名無しさん
NGNG(let loop ((l l) (r '()))
(if (null? l) r
(loop (cdr l) (cons (car l) r)))))
(define (copy-list6 l) (my-reverse (my-reverse l)))
としたら copy-list4 > copy-list6 でした。
つまり copy-list1は組み込みのreverseを使っているから速いってことでしょうか。
リストの長さをNとすると copy-list1は 6N、copy-list4 は 5Nくらいの計算量に
なるんですかね。
0333デフォルトの名無しさん
NGNGちなみに Gauche組み込み対決では
list-copy と (lambda (l) (reverse! (reverse l)))
が互格でした。
こういうリスト全体の処理では組み込みの reverseを使った方がいいってことですね。
あとからリストの後ろに破壊的に要素を足していきたい場合は deque方式と。
0334デフォルトの名無しさん
NGNGそうです。
copy-list1は2回cdrをたどってるから2N、copy-list4はNで
reverseがどんなに速くても、copy-list1はNより速くならないと考えるかもしれないけど、
copy-list1は6N、copy-list4は5Nになる。
copy-list1の内reverseにかかる部分が3Nで、コンパイルしたら2倍から10倍で実行できるとすると
4.5Nから3.6Nで実行できるわけです。
実際にどれくらいの速度差で実行してるか調べてみたら?
0335デフォルトの名無しさん
NGNG0336デフォルトの名無しさん
NGNG(mapcar #'identity list))
mapcar って組み込みだろうから、ごちゃごちゃコード書くより一番速い気がする。
ご参考
http://www.lisp.org/table/style.htm#efficiency
0337デフォルトの名無しさん
NGNG0338デフォルトの名無しさん
NGNGコンパイルした方がいくない?
0339デフォルトの名無しさん
NGNG次のような感じで変換すればオーケーでしょうか?
letrecをまだ用意していないもので。
(let loop ((a foo)
(b bar)
(c baz))
body)
=>
(let ((loop #f)
(a foo)
(b bar)
(c baz))
(set! loop (lambda (a b c) body))
(loop a b c))
0340(define (´∀`) 'マターリ)
NGNG(lambda (f x) (lambda y (apply (x (f f x)) y)))
(lambda (loop) (lambda (a b c) body)))
foo bar baz)
0341デフォルトの名無しさん
NGNGfoo, bar, bazのスコープにloopが入ったらまずいんでない?
0342デフォルトの名無しさん
NGNG入るのでしょうか? 入らないように思えるのですが。
gosh> (define loop '|(゚∀゚)アヒャ|)
loop
gosh> (let ((loop #f) (a loop) (c (lambda () loop))) (list a (c)))
(|(゚∀゚)アヒャ| |(゚∀゚)アヒャ|)
0343デフォルトの名無しさん
NGNG一見しただけでは何が何やらですが、理解に努めてみました。
> (lambda (f x) (lambda y (apply (x (f f x)) y)))
これをF
> (lambda (loop) (lambda (a b c) body)))
これをL
とおくと
((F F L) foo bar baz)
になって、少し展開すると
((let (loop (F F L))
(lambda (a b c) body))
foo bar baz)
みたいになりますね。
このbodyの中でloopを呼ぶと((F F L) a b c) のに戻って繰り返すわけですね。
面白い。こういうのをストリームというんでしょうか。
0344デフォルトの名無しさん
NGNGホントですか?
Cygwin 1.5.12-1
と
Gauche0.8.3 と Gauche-gtk-0.4.1
だと
gauche-glib.cのmakeでエラーがでてしまいます。
どーやったらコンパイルできるようになるのでしょうか?
0345339
NGNG# いまんとこコンパイラを動かすにはGaucheが必要だったりするんですが
ところで自由変数を参照しない手続きを呼ぶ用語に困っているのですが、
何か適当な用語はあるでしょうか。
環境を持たないクロージャなんですが、組み込みの手続き(コンパイラが即値で
書き込む)を利用するので副作用があって関数とも呼びにくいのです。
ちなみに大域環境はありません。
0346デフォルトの名無しさん
NGNGこれからブートストラップしてくんだね。
ところで環境を持たないクロージャとは、単純にトップレベルで
作成するような関数のことかね?
すなわちその関数内部の変数参照がローカル内で完結している関数
という解釈でいいのかな。
それとも、環境を持たないクロージャというのを、
限定構文を使うなりで明示的に宣言して作成するということかね。
副作用がSchemeからは見えず、処理系の内部的な話なのであれば、
特に区別する必要もない気がするが。
明示的なものであれば、例えばCにトランスレートするのが前提の関数なら
cfuncとかcdefineとか機能や意図に基づいた名前を付けるぐらいしか
思いつかないが。
あとは既存の処理系の名前を漁ってみるしかないんじゃないかな。
0347339
NGNGどうもです。
> ところで環境を持たないクロージャとは、単純にトップレベルで
> 作成するような関数のことかね?
そうです。レキシカル変数(引数か、内部で積む環境フレーム上の変数)だけ
使うもののつもりでした。
0348デフォルトの名無しさん
NGNG0349デフォルトの名無しさん
NGNG次スレからは
http://swiss.csail.mit.edu/classes/6.001/abelson-sussman-lectures/
もテンプレに加えてちょ。 ビデオ講義がある。 居ながらにしてMITの講義が見れるぞ。
0350デフォルトの名無しさん
NGNG0351デフォルトの名無しさん
NGNGおれにはそんなの作る気力がない
まあ当面は>>2以降にだらだらでいいやね
0352デフォルトの名無しさん
NGNG他の講義のビデオも有ったりするの?
0353デフォルトの名無しさん
NGNGGauche 側の gauche.h の SCM_EXTERN から __declspec(dllimport) を削って
Gauche-gtk 側は libgauche-uvector をリンクするよう追加するだけ。
最近の ld と gcc なら dllimport は無くてもよしなにやってくれるから。
0354デフォルトの名無しさん
NGNG0355デフォルトの名無しさん
NGNGhttp://ocw.mit.edu/OcwWeb/index.htm
にMITの講義録やシラバスがあるが、ビデオは数えるほどしかない。 将来的には
もっとビデオを増やすらしい。
ここはLispスレだし、その方面のバイブルがタダで手に入って、かつ、講義まで全部見れるんだから
世の中便利になったと思います。
個人的にはSICPは冗長な気がする(特に、1〜3章)けど、4,5章は真面目に読む価値があると
思う。 実際に自分で手を動かして、Schemeのインタプリタやランタイム&コンパイラをJavaや
C++で実装するとホントに理解が深まる。 CSを勉強するときには実際に手を動かした時に学んだ
ノウハウが大きな財産になるから、暇な人はトライしてみる価値がある。
0356デフォルトの名無しさん
NGNG0357デフォルトの名無しさん
NGNG今年マリノスが勝って終わったやつ。
0358デフォルトの名無しさん
NGNG0359デフォルトの名無しさん
NGNG0360デフォルトの名無しさん
NGNG0361355
NGNGI'm a CS major at ** university. で通じるよ。
0362デフォルトの名無しさん
NGNG0363デフォルトの名無しさん
NGNG> ところで自由変数を参照しない手続きを呼ぶ用語に困っているのですが、
> 何か適当な用語はあるでしょうか。
「自由変数を参照しない手続き」といえばコンビネータだけど
ちょっとニュアンスが違うような気もしないでもない?
0364デフォルトの名無しさん
NGNGコンビネータは、普通はあまり副作用のないイメージが。
「閉じた式」(=自由変数のない式)の類推で、「閉じた手続き」じゃ駄目?
0365デフォルトの名無しさん
NGNG0366デフォルトの名無しさん
NGNG(define aaa "hello, world")
(define (bbb) 'aaa)
(ccc (bbb)) => "hello, world"
になるような手続きcccってあるんでしょうか。
evalしかないですか?
0367デフォルトの名無しさん
NGNG0368デフォルトの名無しさん
NGNGいけないんじゃない? sicpの4章を読みましょう。
0369366
NGNGとりあえずSICPも読んでみます。
0370デフォルトの名無しさん
NGNG0372デフォルトの名無しさん
NGNG副作用ももたないものを形容する言葉はありますか?
+や-などがその仲間だとおもいます。よろしくお願いします。
0373339
NGNG返事がおくれてすみません。
>>363,364
さすがにコンビネータはちょっとそぐわない気がいたします。
閉じた手続きはいいかも知れません。closed-procedureでしょうか?
>>348
そういうのは組込みの手続きを用意していてそれをコンパイラが埋め込みます。
初期化段階ではLisp/Scheme的な大域環境が(シンボルも)存在しないので。
>>372
それを関数(function)と呼ぶのではないでしょうか。
副作用があったり環境に依存するものを含めた総称がprocedureではないかと思います。
0374デフォルトの名無しさん
NGNG> それを関数(function)と呼ぶのではないでしょうか。
> 副作用があったり環境に依存するものを含めた総称がprocedureではないかと思います。
すみません、書き忘れました。Common Lispに限定しますと、規格書やコミュニティー内でも、
そのような区別はされていないようです。
(functionpなんてpredicateはそういう区別をしません。)
0375339
NGNG関数が手続き一般を指す場合、"pure function" というのが使われることが
多そうな気がします。元はfortran用語でしょうか。
0376デフォルトの名無しさん
NGNG0377デフォルトの名無しさん
NGNG(define (hoge x y) (cons x y))
(define (cons x y) ...)
はどう処理されるの?
0378339
NGNGいまのところ、そういうことはしない、というのが答です。
というのも、フルセットのScheme環境を用意するための「ローレベルScheme」
みたいなものが趣旨なので。シンボルも環境もこれを使って書くわけです。
# 今のところベクタも文字列もシンボルもありません
現状、大域変数はコンパイル単位で完結し、かつちょっと情けないですが1パスで
> (define (hoge x y) (cons x y))
ここでconsは組込み定数の参照("SCM_OBJ(&cons)"みたいな)に置き換えられ
> (define (cons x y) ...)
以降はconsに割り当てられた大域変数を参照します。
必要なら、lambda中の大域変数の操作をいったん擬似命令として出力する2パスで
今の条件でも(コンパイル単位で完結するのは変わりませんが)例のようなケースの
参照を普通のSchemeのようにできるとは思います。
今のところ大域変数の実体はコンパイル単位全体を包む最下段のレキシカル環境
フレームという身も蓋もない実装です。一段落ついたら、
defineされる大域シンボルのうち定義だけされるものと
変更されるものを区別して、後者のみCの変数を記憶場所に割り当て、
前者は定数化して参照を直接埋め込むようにする予定です。それが済めば
コンパイル単位間で大域変数を共有することも(必要性はともかく)できるはずです。
共通の大域環境を参照する普通のSchemeのコードをどうコンパイルするかは
そのうちシンボルや大域環境をローレベルschemeで書きながら決めます。
0379デフォルトの名無しさん
NGNGttp://www.cs.indiana.edu/dfried_celebration.html
0380デフォルトの名無しさん
NGNGSchemeで著明な人達の写真が見れるね。
Guy Steeleの顔ぐらいしか知らなかった。
0381デフォルトの名無しさん
NGNG0382デフォルトの名無しさん
NGNG0383デフォルトの名無しさん
NGNG小さくて速い処理系を探してまして、最も有望なBitとSECDR-Schemeのポインタが切れていたもので。
0384デフォルトの名無しさん
NGNG去年の話だけど。
0385デフォルトの名無しさん
NGNG何かお勧めのやつあれば教えてください。
サイトでも教科書でも構いませんので……
MLのスレで聞いたほうがいいのかな?
0386デフォルトの名無しさん
NGNG何かお勧めのやつあれば教えてください。
サイトでも教科書でも構いませんので……
MLのスレで聞いたほうがいいのかな?
0387デフォルトの名無しさん
NGNGMLの偉い人で、大堀先生の本はどうだろう。
共立出版 情報数学口座9「プログラミング言語の基礎理論」
http://www.jaist.ac.jp/~ohori/texts/index.html
この本に
形無しλ計算 → 型付きλ計算 → 多相型λ計算 → ML
の順番で説明されてたと思う。
0388デフォルトの名無しさん
NGNGその本にもあるかわかんないけど、
おれ論理式がよくわかんなかった。
でかい分数表記のやつ。
つーかあの辺理解できる気がしない。
実際どう動くかコードで示してほしかった・・・なんて無茶か。
0389デフォルトの名無しさん
NGNGttp://paw.s2.x-beat.com/up/img/4398.zip
zipの中身がSECDR-Scheme1.0.tgz
これのオリジナルが置いてあった場所はniftyだったと思う。
0390デフォルトの名無しさん
NGNGレスどうもありがとうです.
とりあえず図書館で探して読んでみるとです.
0391383
NGNG多謝。ドキュメントが詳しいのも良いっすな。
0392紫藤
05/01/18 11:24:21> Paul Graham, ANSI Common Lisp の練習問題の解答を載せた
>ホームページ等、ご存知でしたら教えていただけませんでしょうか
http://www.geocities.jp/shido_takafumi/pacl2.html
に書いたのでよろしかったら見てください。
せっかく書いたのに誰も見てくれないので宣伝します。
0393デフォルトの名無しさん
05/01/20 22:58:060394デフォルトの名無しさん
05/01/20 23:01:13おねがいします。
0395デフォルトの名無しさん
05/01/20 23:05:12とりあえず mini-schemeよりは速いはずです。
継続がなくて、マクロもどきや環境がファーストクラスです。
中間コードにコンパイルする方法を勉強して継続を実装したりしたいです。
http://primes.dnip.net/scheme.cpp
0396デフォルトの名無しさん
05/01/21 10:40:10たらい回ししてみようか…と思ったら、比較オペレータは定義されてなかった。
まだまだテスト版だからってことでしょうか。
ちょっと見てみると、scheme_oprtクラスとか無駄してるような…。
C++で実装するというのは、C使いの自分には面白かったです。がんばってください。
これだけのコードでまがりなりにも
処理系を作れてしまうというのが、Scheme(lisp)の良さですよね。
0397デフォルトの名無しさん
05/01/21 11:44:13比較オペレータなどを定義してみました。
scheme_oprtクラスは無駄してるでしょうか? よく分かんないです。
整数や真偽値や基本手続きをポインタではなく即値で埋めこむテクニックを知ったのですが
この先中間コードにコンパイルすることを考えると、今はどっちでもいいのかなあと思いました。
中間コードの話はSICP5章とドラゴンブック以外に参考になる文献はあるでしょうか?
特に継続の実装がさっぱり分からないです。
0398396
05/01/21 14:45:19わっ、反応早い!
scheme_oprtクラスのprintメソッドは、簡単なやり方でも、
とりあえず先にprintf("#<subr ")しておいて、if文でプロシージャ名をprintfして、
最後に">"をprintfしておいた方が、無駄な文字列データが減るはずです。
aplyメソッドも、プロシージャごとに完全なコード書かずに、汎用化するとか。
色んな意味でRHG(Ruby Hacking Guide)とGHG(Gauche Hacking Guide)は
役に立つと思いますが、すでに見ているか。
0399デフォルトの名無しさん
05/01/21 16:07:14printメソッドの話ですか。そこらへんは適当です。
Rubyのは少し見てましたが、Gaucheのは知りませんでした。
C++は細かいとこが直感的に分らないのでCで書きたくなってきました。
質問なんですが、手続き呼びだしの時、環境をコピーするより名前置き変えの方がいいですよね。
あと、SRFI-17の set!を実装するには全てのオブジェクトのサイズを同じにしないといけないんでしょうか?
0400デフォルトの名無しさん
05/01/22 01:57:46クロージャーの呼び出しでは引数を束縛して新しい環境を作るけど、これはコピーとはちょと違うし、名前の置き換えというのも何を意味しているのかちょとわからないなり。
>あと、SRFI-17の set!を実装するには全てのオブジェクトのサイズを同じにしないといけないんでしょうか?
SRFI-17のほうは例えば(define x "hogehoge") (set! (string-ref x 4) 3.14)みたいなことはエラーになるべきだから考えなくていいんじゃないかな。
0401デフォルトの名無しさん
05/01/22 03:00:08>クロージャーの呼び出しでは引数を束縛して新しい環境を作るけど、これはコピーとはちょと違うし、名前の置き換えというのも何を意味しているのかちょとわからないなり。
環境を壊したくないので、クロージャーを呼び出した時点での環境をコピーしてそれに引数の束縛を足して使うという意味です。
新しい環境を作るのにコピーはしないんでしょうか? 名前の置き変えは、環境は一つだけでかぶる引数の名前を全部置き変えるということです。
環境をリストで表現して先頭から新しい束縛を足して、検索するときは先頭から順番に調べるようにすれば、一つのポインタのコピーだけで済んで良いかなあと思いました。
ハッシュと違って検索に束縛の数に比例して時間がかかるのが欠点ですがどんなもんでしょうか。
>SRFI-17のほうは例えば(define x "hogehoge") (set! (string-ref x 4) 3.14)みたいなことはエラーになるべきだから考えなくていいんじゃないかな。
なんか勘違いしてました。ポインタの指す先を変更しないといけないのかと思ってました。
0402デフォルトの名無しさん
05/01/22 11:15:08>環境を壊したくないので、クロージャーを呼び出した時点での環境をコピーしてそれに引数の束縛を足して使うという意味です
ふむふむそういうことだったか....
最初に、クロージャーの呼び出し時にはその意味での環境のコピーはないなり。すでに存在する環境に引数から作った環境をリンクするだけなり。
次に、lambdaでクロージャーを作るときは環境をスタックからヒープに移動することはあるけれど、元のスタック上の環境は以後は使われなくなるなり。
>新しい環境を作るのにコピーはしないんでしょうか?
引数から新しい環境を作ったら以前の環境に対してリンクを張るだけなり。
このへんは >>3 の"Practical Scheme"が詳しい。
特に実装についてはその中の以下のページが素晴らしいなり。
ttp://www.shiro.dreamhost.com/scheme/stack-j.html
ttp://www.shiro.dreamhost.com/scheme/gauche/memo-stack-j.html
0403402
05/01/22 11:37:42「すでに存在する環境」はクロージャーの持っている環境のことなり。
>元のスタック上の環境は以後は使われなくなるなり
これは完全にゴミになるということなり(実際デバッグ時には"0xcafecafe"とかで破壊するとよい)
どうもShiroのようにはうまく説明できないのう。
0404デフォルトの名無しさん
05/01/22 12:00:500405デフォルトの名無しさん
05/01/22 12:36:55なるほど。ちょっと難しいですが、20%くらい分かった気がします。
名前を検索するときは envポインタからたどって、
一番下の環境->一個上の環境->もう一個上の環境 という風に探していくんでしょうか?
なんか効率が悪いような。環境一つ一つはハッシュなんでしょうか?
>次に、lambdaでクロージャーを作るときは環境をスタックからヒープに移動することはあるけれど、元のスタック上の環境は以後は使われなくなるなり。
なんで使われなくなるのか良く分からないです。これはスタックマシンのVMの話だからまた別の話なのかもしれませんけど。
0406デフォルトの名無しさん
05/01/22 13:01:52妥協案として実行時に defineや lambdaに出食わしたら、その時の環境を使ってボディを構文解析するというのを思いつきますた。
でもそれでは
(define (my-if a b c) (let ((if if)) (if a b c)))
は解析できても
(define (my-if a b c) (if a b c))
というノーマルなやつが解析できないと思いますた。でも Gaucheでは
gosh> (define (my-if a b c) (if a b c))
my-if
gosh> (define if list)
if
gosh> (my-if #t 0 1)
0
となりました。
というか上のバージョンは実行できなかったです。scmでも実行できなくて、scheme48では定義すらできませんでした。
guileでは実行できました。
という訳で、実行時に defineや lambdaに出食わしたら rootも含めた環境でボディ部を構文解析するというのでいいのでしょうか?
それとも ifを別の名前に束縛してる場合は諦めて、ifが上書きされてないか気合いでチェックして実行前に構文解析してしまうのがいいんでしょうか?
0407デフォルトの名無しさん
05/01/22 13:06:23>一番下の環境->一個上の環境->もう一個上の環境 という風に探していくんでしょうか?
基本はその通り。
>なんか効率が悪いような。環境一つ一つはハッシュなんでしょうか?
間違いなく効率が悪い。だからインタープリターでも中間コードを使ったり、コンパイラはさらに気合いを入れた最適化をするなり。
>環境一つ一つはハッシュなんでしょうか?
トップレベルだけはハッシュを使う実装が多い。
>なんで使われなくなるのか良く分からないです
これは環境の複製を作って、オリジナルと複製の両方を使うということがないという意味で書いてみたんだけと、説明の書き方が悪かったかなりね。
>>404 secd machineでぐぐれば一発でわかると思う。
いいね〜SECDマシーン。
ちなみに、SECDによるScheme実装にはLispMeもあるなり。こっちは"SECD LispMe"でググルべし。
(LispMeという名前だけどSchemeだよん)
0408デフォルトの名無しさん
05/01/22 13:33:54(define (my-if a b c)
(let ((if if))
(if a b c)))
--> syntax errorまたはunbound variable 'if みたいなエラー
(let ((if list))
(define (my-if a b c)
(let ((if if)) (if a b c)))
(if 1 2 3))
--> (1 2 3)
これはifに束縛値があれば変数として扱い、なければsyntax keywordとして扱っているからで、構文解析するときにはトップレベルから発生しているすべての束縛を記録しておく必要があるなり。これはよくcompile time environmentと呼ばれているなり。
ちなみにgaucheで実行できるのは、
gosh> (define (my-if a b c) (if a b c))
で中間コードに変換されるときにifがsyntaxのifとして中間コードに書き込まれていて後の
gosh> (define if list) の影響を受けないから。
gosh> (define if list) (define (my-if a b c) (if a b c)) (my-if #t 0 1)
とやれば(#t 0 1)が返されるはず。
gosh> (define (my-if a b c) (let ((if if)) (if a b c)))
はやはりエラーになるんじゃないかな?
最後に、どのmy-ifの定義もifと同等の定義にはなっていないよ。これは念のためなり。
0409408
05/01/22 13:39:37(let ((if list))
(define (my-if a b c)
(let ((if if)) (if a b c)))
(if 1 2 3))
は
(let ((if list))
(define (my-if a b c)
(let ((if if)) (if a b c)))
(my-if 1 2 3))
のまちがいなり。4行も書くとバグがでるなりね(笑
0410デフォルトの名無しさん
05/01/22 13:54:59ウザイ
0411デフォルトの名無しさん
05/01/22 14:05:02えっと上のやつは
(define my-if (let ((if if)) (lambda (a b c) (if a b c))))
の間違いです。アホでした。どちみちエラーなんですけど。
>これはifに束縛値があれば変数として扱い、なければsyntax keywordとして扱っているからで、構文解析するときにはトップレベルから発生しているすべての束縛を記録しておく必要があるなり。
なるほど。記録しておく、というのは束縛が発生しているかいないかくらいでいいんでしょうか。
>これはよくcompile time environmentと呼ばれているなり。
compile time environmentですか。この言葉だけで全てが分かった気になりますた。
マクロの展開の話もこれですよね。つまりSICPみたく (analyze exp)とはできず (analyze exp compiletime-environment)
でないといけないと。
0412デフォルトの名無しさん
05/01/22 14:15:07>間違いなく効率が悪い。だからインタープリターでも中間コードを使ったり、コンパイラはさらに気合いを入れた最適化をするなり。
やっぱそうですか。それが嫌で、コピーするようにしたんですよね。どうせクロージャ作る時はマージするんだろうし、と思って。
でもコピーのコストが気になるのと set!に対応できないので >>401みたいなことを考えたんです。トップレベルだけがハッシュというのも納得できる
気がします。
>これは環境の複製を作って、オリジナルと複製の両方を使うということがないという意味で書いてみたんだけと、説明の書き方が悪かったかなりね。
単純にそういうことですか。理屈で分かっても実際にどういう風に操作をするのか想像できないので、ちょっと理解できなかったです。
たぶん、単にVMを作ったことないからだと思いますが。
0413デフォルトの名無しさん
05/01/22 14:47:21弾いちゃって良いと思うけどなあ。
混乱するだけでなんも良いことないし。
それよりSchemeは名前空間関係を整備してほしい。
0414デフォルトの名無しさん
05/01/22 15:09:12ローカル変数へのset!のことを考えると、基本的に環境はコピーできない。
ただ、set!されるローカル変数は静的に解析できるので、それだけを
ヒープアロケートしたメモリに置いて間接参照し、それ以外(参照only)の
変数はコピーしてしまう、という手法はある。ディスプレイって言ったっけ?
もう記憶があやふやだが。
0415デフォルトの名無しさん
05/01/22 16:32:19いろいろな最適化を幅広く解りやすくまとめてあるので
ttp://www.ccs.neu.edu/home/will/Twobit/ultimate.html
もお勧めだ。いざ進め地獄の果てまでも(笑
0416デフォルトの名無しさん
05/01/22 16:42:14そういう方法も研究されてるんですね。調べてみます。
みんな物知りですね、ほんと。
0417デフォルトの名無しさん
05/01/23 00:21:04また一人の男が門をくぐった…その門の名は lambda の門。
ガンガレおまいらw
0418デフォルトの名無しさん
05/01/23 00:58:210419デフォルトの名無しさん
05/01/23 23:27:34set!にも対応できるし、クロージャを作るときはトップだけをコピーすればいいし問題ないように思えるんですが
(どれをpopするか覚えとかないといけないですけど)、継続が絡むと破綻するってことはあるんでしょうか?
あと Gaucheは ifだけでなく consみたいな基本手続きも埋めこんでる様なんですが、これは時に仕様に反しないでしょうか?
(define (cons a b) (cons a b))
(cons 0 0)
は無限ループになるべきだと思うんですけど。
(define (cons a b) (cons a b))は
構文解析でcons, a, bは束縛変数だと分かるのでそれらには埋め込めないですよね
consが上書きされたら自分にアクセスされなくなるので、consに自分自身を埋めこむのはありかなと思ったんですが、
(define cons2 cons) (define cons list) とかされる可能性もあるのでやっぱ埋めこめないですね。
最適化の為に目をつぶったって感じでしょうか。
>>402 のGaucheのVMのスタック操作っていうページはかなり素晴らしいですね。
環境の扱いが検索する側にとって非効率に見えるんですけどそれでもあの速度がでるんですね。
上に書いた実装じゃ継続の実装も変わってくるだろうし、総合的に見たらどうなんですかね。
あと、実行前に構文解析するようにしても速度変わりませんでした。
lambdaとifくらいしかやってないんですけど。速くなるべきなんですかね。
0420デフォルトの名無しさん
05/01/24 00:29:06クロージャを作るときにボディを構文解析して第一引数の使われる場所に間接参照(ポインタのポインタ)を置いておく。
第二引数以下の使われる場所にもそれぞれ別の間接参照を置いておく。間接参照は評価されると参照先のものになる。
applyされるとそれぞれの間接参照がそれぞれの引数を指すようにする。set!は間接参照をいじることで実現する。
っていうのでトップレベルの変数以外のlookupが無くなる気がするんですが、どうでしょうか。
evalの扱いが微妙になるとは思うんですが。
0421デフォルトの名無しさん
05/01/24 01:32:50>lambdaとifくらいしかやってないんですけど。速くなるべきなんですかね。
式のタイプによる分岐を実行前に事前にしておくのが肝なので、
他の構文や手続きの適用、シンボル等もやらないと。
速度は一割五分ぐらいよくなるかなあ。
0422デフォルトの名無しさん
05/01/24 02:01:29そうですか。かなり地道な作業ですよね。コードの量が一気に増えるので微妙にためらってしまいます。
シンボルの構文解析って意味あるんですかねえ。SICPレベルだと全然意味ない気がします。
ところで()の評価は仕様で決まってないんでしょうか?
仕様を見る限り()は式では無いように思えるんですが、実際には()を返す処理系がたくさんあります。
0423デフォルトの名無しさん
05/01/24 02:28:41環境を辿って束縛している値を探す、正味の実行時間は変わらないけど
評価のたびごとにcondの条件判定をしている部分が省けて、
手続きの適用をするだけになって高速化するわけだから。
(condの条件判定をするよりも手続きの適用の方が速いと仮定して)
型タグの値でcase文を使って分岐してるんなら、高速化の余地は少ないと思う。
0424デフォルトの名無しさん
05/01/24 03:11:55なるほど。すでに型は分かっているから多態は必要ないんですね。
C++ならファンクタでどうにかなるかもしれません。
Cなら、グローバルもしくはスタティック変数使えばできなくもないかもしれないけど、すごく難しそう。
0425デフォルトの名無しさん
05/01/24 09:21:23>あと Gaucheは ifだけでなく consみたいな基本手続きも埋めこんでる様なんですが、これは時に仕様に反しないでしょうか?
>(define (cons a b) (cons a b))
>(cons 0 0)
>は無限ループになるべきだと思うんですけど
これは具体的にはトップレベルの定義をinternal definitionとみなしてletrecで束縛する処理系ならば無限ループになる。
本来ならそうあるべきなのであろうが、そうならないGaucheが仕様に反しているかは微妙だ。なぜならインタラクティブなトップレベルの規定が不明確だからで....
例えばGaucheでも
(let ()
(define (cons a b) (cons a b))
(cons 0 0))
とやれば当然無限ループとなる。
それじゃトップレベルもそれに合わせれば良さそうだが....
(define hoge 8)
(list hoge)
(define foo +)
(foo 8)
を単純に
(let ()
(define hoge 8)
(list hoge)
(define foo +)
(foo 8))
はできない。シンタックスエラーだからだ。
どうするR6RS???(笑
0426デフォルトの名無しさん
05/01/24 10:19:26トップレベルの規定が不明確というのは
(define a 1)
(define (b) a)
(set! a 10)
(b)
として1が返ってきてもいいということでしょうか?
0427デフォルトの名無しさん
05/01/24 10:25:32>ところで()の評価は仕様で決まってないんでしょうか?
>仕様を見る限り()は式では無いように思えるんですが、実際には()を返す処理系がたくさんあります。
()は#tや#fみたいに評価すると自分自身になるオブジェクト。括弧がついてるけどリストではない。
例えば (eq? () '()) --> #tだ
ところで、#nilとかにしないで()を使うことになってるのには何か理由があるんだろうけど...だれか知ってる?
0428デフォルトの名無しさん
05/01/24 10:38:36R5RS 的には quote が必要
4.1.3 Procedure calls
Note: In many dialects of Lisp, the empty combination, (), is a
legitimate expression. In Scheme, combinations must have at least one
subexpression, so () is not a syntactically valid expression.
0429デフォルトの名無しさん
05/01/24 10:51:06扱いも明記されていないので、結局処理系依存?
0430デフォルトの名無しさん
05/01/24 11:42:33ちょっと長くなるけど....
R5RSの5.2.2 Internal definitionsより
"Such definitions are known as internal definitions as opposed to the top level definitions described above. The variable defined by an internal definition is local to the <body>. That is, <variable> is bound rather than assigned ..."
とあるので、裏を返せばtop level definitionはassignmentsつまりset!と同じ動作だと推察できる。
これによれば、
(define a 1) (define (b) a) (set! a 10) (b)
は
(set! a 1) (set! b (lambda () a)) (set! a 10) (b)
となると考えられ、結果は10になるべきだと思う。
"本来ならそうあるべきなのであろうが"と書いたのはこれを根拠としてみた。
"不明確"と書いたのは、これだけでは次の動作の説明ができないと思ったからだ。
(define (hoge x) (if x "foo" "bar")) (hoge #t) (define if list) (hoge #t)
を先のように書き直すと、
(set! hoge (lambda (x) (if x "foo" "bar"))) (hoge #t) (set! if list) (hoge #t)
でも2つのhogeが返すのは両方とも"foo"でないといけない!
じゃあ本当のところはどうすればいいのか?
でも5.2.1 Top level definitionsにはほとんど何も書いてないし.....
いずれにしても1を返すのはまずいとは思う。
0431デフォルトの名無しさん
05/01/24 11:44:06そのまんま書いてありましたね、すいません。近くまでは見てたんですが。
R5RSで invalidなものを validとして扱えてもR5RS互換といえるから大丈夫なんでしょうね。
これを validにするメリットがあるなら知りたいですが。
>>419の一段落目と >>420についてはどうでしょうか?
0433デフォルトの名無しさん
05/01/24 11:58:24>(set! hoge (lambda (x) (if x "foo" "bar"))) (hoge #t) (set! if list) (hoge #t)
>でも2つのhogeが返すのは両方とも"foo"でないといけない!
いけないっていうのは良く分かりませんが、とりあえず ifは構文なので無理矢理納得するとしても
cons でも埋めこまれてるから納得できなかったんです。
(define (hoge x y) (cons x y)) (hoge 3 4) (define cons list) (hoge 3 4)
の結果は処理系によってまちまちです。
0434デフォルトの名無しさん
05/01/24 13:38:56ちょっと説明を整理してみた。
>(set! hoge (lambda (x) (if x "foo" "bar"))) (hoge #t) (set! if list) (hoge #t)
>いけないっていうのは良く分かりませんが
最初に、トップレベルでは(set! if list)はできない。
これはトップレベルのifが変数でないことを意味する。
次に、(define if list) (if 1 2 3) -> (1 2 3)
これは新しい変数ifを作りlistを束縛して呼び出し、結果の(1 2 3)を得ている。
では(define if list)の前に使われたifをどうするか?
そこではifは変数ではないので値を書き換える事はできない。
これが
(define (hoge x) (if x "foo" "bar")) (hoge #t) (define if list) (hoge #t)
でhogeが両方"foo"を返さなければならない理由。
>(define (hoge x y) (cons x y)) (hoge 3 4) (define cons list) (hoge 3 4)
>の結果は処理系によってまちまちです。
これは主なトップレベルの実装方法に2種類あるためで、明確な規定が無い為どっちが正しいとも間違いとも決められない現状ではしかたのないことではなかろうか。
ちなみに最初の方法は、
*すべてのシンボルが<undefined>という特別な状態に束縛されているとする。
*defineをset!として解釈する。
これは5.2.1 Top level definitionsに"Some implementations ..."と書いてある方法だ。
これによれば、次の様に解釈する
(set! hoge (lambda (x y) (cons x y))) (hoge 3 4) (set! cons list) (hoge 3 4)
結果は (3 . 4)と(3 4)
もう一つの方法は、トップレベルの式をbeginのシーケンスの様に解釈する。つまり
(begin (define (hoge x y) (cons x y)) (begin (hoge 3 4) (begin (define cons list) (begin (hoge 3 4)))))
みたいに扱う。
(注:実際のトップレベルでは(begin ...)の最初の式を評価した結果をディスプレイなりに出力する特別なbeginにする)
結果は(3 4)と(3 4)となる。
どっちにするかは好みだが、5.2.2との絡みから個人的には最初の方法に一票入れたい。
0435デフォルトの名無しさん
05/01/24 14:03:17(3 4)と(3 4)を返す処理系ってあるんでしょうか?
guile gosh scm scheme48 csi(checkin) biglooでは guileと goshが (3 . 4) (3 . 4)を返します。他は(3 . 4) (3 4)です。
(define kons cons) (define (hoge x y) (kons x y)) (hoge 3 4) (define kons list) (hoge 3 4)
にすると goshだけになります。
トップレベルの実装方法の違いというより最適化の問題の気がします。
goshは上の例でも(3 . 4)を返しますし、(set! cons 1)とできるからです(ifでもできます)。
ちなみに上の中で(set! cons 1)ができないのは scheme48だけです。
0436434
05/01/24 14:17:23ちなみに
(begin (define (hoge x y) (cons x y)) (begin (hoge 3 4) (begin (define cons list) (begin (hoge 3 4)))))
をそのまま評価すると(3 4) (3 4)となるけど、これは処理系がdefineをletrecに変換してしまうからで。
それで勘違いしてたです。中身をflattenしないbeginと思って読んでくださいませ。
0437434
05/01/24 14:35:20> (define kons cons) (define (hoge x y) (kons x y)) (hoge 3 4) (define kons list) (hoge 3 4) にすると goshだけになります。
ふむ。 たしかにその振る舞いは最適化に問題がありそうですね。
>goshは上の例でも(3 . 4)を返しますし、(set! cons 1)とできるからです(ifでもできます)。
goshで(set! if ...)ができてしまうとは.....意外だ。
0439デフォルトの名無しさん
05/01/25 01:11:30最低でも警告出すか、エラーにしてしまってもいいとさえ思える。
0440デフォルトの名無しさん
05/01/25 10:59:19オブジェクトのサイズが大きくなるから現実的ではないかもしれませんが。
構文解析後のオブジェクトはSICP風にやるなら環境を引数にとるメソッド一つがあれば十分なので、
それを関数ポインタメンバとして持つ、という感じでいいんでしょうか。
0441デフォルトの名無しさん
05/01/25 17:41:55slibを使おうとしたらslib:eval-loadが未定義だったので
まずslib.scmを修正してコメントアウトされていたslib:eval-loadを有効にし、
(use slib)
(require 'syntax-case)
しました。
しかしdefine-syntaxでsyntax-caseを使おうとすると
*** ERROR: define-syntax needs a syntax-rules form, but got (lambda(x)(syntax-case (以下略
というエラーが出て、どうもsyntax-rulesしか使えないような気がします。
UNIXでsyntax-caseを問題なく使える処理系があれば教えてください。
目的はsyntax-caseの練習です。
0442デフォルトの名無しさん
05/01/25 18:03:49に思いっきり書いてありました。ただ >>435の例のも OKなのかは良く分かりませんが。
>A program may use a top-level definition to bind any variable. It may subsequently alter
>any such binding by an assignment (see 4.1.6). These operations do not modify the behavior
>of Scheme's built-in procedures. Altering any top-level binding that has not been introduced
>by a definition has an unspecified effect on the behavior of the built-in procedures.
>>441
良く知らないけど Chikenというので使えるらしいです。
0443デフォルトの名無しさん
05/01/25 18:53:48slibのマクロ実装って、repl(もしくはload)を乗っ取らないといけない
んじゃなかったっけ。もし対話的に実行してるなら、goshのプロンプト直接
じゃなく、slibのreplを起動する必要があるはず。
そうしてるのにエラーが出たなら、gaucheのslibサポートが不完全なんだろう。
0444デフォルトの名無しさん
05/01/25 19:32:51>目的はsyntax-caseの練習です
それなら ttp://www.scheme.com/csv6.9c/ のpetite chez schemeがお勧めだ。(バイナリーで動くシステムが限られてるけど....)
なんといってもsyntax-caseの家元だからね!
0445デフォルトの名無しさん
05/01/26 18:58:02それは確かに道理なので、Petite Chez Schemeを入れてみました。
おお、syntax-caseが使える! 日本語使えないけど(Windows版)
しばらく遊んでみます。
うーん、これがどの処理系でも使えるようになればいいんだけど、
R6RSでは使えるようにしてくれたりはしないのかしら。
ところでsyntax-caseってidentifierとかのコンテクスト周りが
ややこしそうなんですよね。皆さん使いこなせるんでしょうか。
0446デフォルトの名無しさん
05/01/26 23:40:47よくわからないような、ちょっとわかったような。
(syntax-object->datum obj)
"datum"を返すらしいが、ようするにシンボルとかquoteされたS式
(テンプレートに入ってる式の字面)が入っていると考えればいいんだろうか。
(free-identifier=? obj1 obj2)
変数として束縛されていない場合のみマッチさせたい場合は
free-identifier=?を使うということでいいのかしら。
(bound-identifier=? obj1 obj2)
bound-identifier=? ってのは同じ束縛を参照してるってことなんかなあ。
これが一番よくわからない。
0447デフォルトの名無しさん
05/01/29 02:19:45http://www.schemers.org/Documents/Standards/Charter/2004-10-13.pdf
0448デフォルトの名無しさん
05/01/30 01:59:20前スレで既出。
0449万物流転
05/02/03 09:20:18(ref (sys-localtime (sys-time)) 'mon) => 1
になるのは私だけでしょうか?
0450デフォルトの名無しさん
05/02/03 09:45:40自分もなりますけど、何か問題あるっけ?
一応言っておくと、
monをrefして返る数字は0-11、つまり1が2月ですよ。
以下を参照。
http://www.shiro.dreamhost.com/scheme/gauche/man/gauche-refj_131.html
0451万物流転
05/02/03 10:45:41マニュアルをきちんと読まない私が馬鹿でした。
お騒がせしました。
0452デフォルトの名無しさん
05/02/03 11:20:10【SICP】計算機プログラムの構造と解釈【Scheme】
http://pc5.2ch.net/test/read.cgi/tech/1107345738/
ついでに、下のスレッドも紹介しておきます。
【一日】CommonLisp【一門】
http://pc5.2ch.net/test/read.cgi/tech/1106587515/
0453デフォルトの名無しさん
05/02/03 11:45:20よい経験をなさいましたな。
小生、テスターに届いたときには既に時限爆弾で期限切れとなっていたというベータ版を知っております。仕様の勘違いから1ヶ月計算がずれたわけですな。
今では懐かしい想いで..... はあと。
0454デフォルトの名無しさん
05/02/03 20:13:45Cのスタックをそのまま使って evalと applyの相互再帰で実装すると
わりと簡単にスタックオーバーフローで segmantation faultになって
しまいませんか?
やっぱスタック(もしくはCPS?)から自作しないといけないんですかねえ。
0455デフォルトの名無しさん
05/02/03 21:25:06規格上は末尾再帰でなかったらスタックをバカ食いしてもOKだと思う。
0456デフォルトの名無しさん
05/02/03 22:02:04メモリ使用量の話ではなく、スタックオーバーフローの話です。
ヒープに自作スタックを置けばメモリの許す限り使えるし、
連続した領域じゃなくてもいいかもしれないから、良いことが多いん
じゃないかと。継続も実装しやすいでしょうし。
デメリットとしてスタック積むのが遅くなったりするのかも知れませんが
どの程度か良くわからないです。
schemeでたかが5000回程度の再帰で溢れてしまうので問題かなあと思ったんですが
guileはもっと浅くても溢れてしまうので OKなんでしょうか。
SECDR(これは当たり前?)や minischemeでさえ溢れないのに。
0457デフォルトの名無しさん
05/02/03 22:11:390458デフォルトの名無しさん
05/02/03 22:56:15落ちる処理系はとても使いにくい。テストデータで通って、
いざ本番を流してみたら入力データの特異点 (たまたまひとつだけ
再帰が非常に深くなるようなもの) で落ちてくれると、髪を
かきむしりたくなる。
0459デフォルトの名無しさん
05/02/04 00:42:36あまりないと思うんだけどそうでもないのかな?
0460デフォルトの名無しさん
05/02/04 01:04:14そうなのかもしれませんね。継続のことを考えないで作り始めたので、
途中で困ったんですが guileのソース見て真似して作りました。
マシンスタックをそのまま使っているので激しく環境依存だと思われます。
マシンスタックそのまま使う方法だと自動的に、作るときと実行するとき
両方でスタックをコピーすることになるので、とても効率が悪いと思います。
他の方法に比べると実装がとても楽なのが良い点だと思います。
まあいろんな意味でスタックもしくは継続を自作した方がいいってことですかね。
マシンスタック使う方が速いってことはあるんでしょうか?
SCMはマシンスタック使ってるのに、スタックが溢れない気がするので
そこらへん調べてみます。
0461デフォルトの名無しさん
05/02/04 18:06:31ただしcall/ccと継続の起動は遅い。マシンスタックを全部セーブするから。
スタックオーバーフロウで止まらないのは、スタックを継続としてヒープにセーブしてスペースを空けてるから。
call/ccと継続の起動が無ければやっぱマシンスタックの方が早いね。
ところで最近「lambda の門」が賑わってるね、ラムダ饅頭でも作って仲見世で売ってみるかな(笑
0462デフォルトの名無しさん
05/02/04 23:00:07>SCMはマシンスタックだねえ。そのかわり環境は全部ヒープに作る。でも環境キャッシュがあるので早いけど。
素朴な疑問なんですがヒープよりスタックの方がアクセスが速いんでしょうか?
>スタックオーバーフロウで止まらないのは、スタックを継続としてヒープにセーブしてスペースを空けてるから。
なるほど継続として扱ってスタックを退避させてるんですね。Gaucheと一緒ですね。
>call/ccと継続の起動が無ければやっぱマシンスタックの方が早いね。
やっぱりそうですか。マシンスタック使うのは Cでないと無理だし環境依存だし美しくないので
どうにかしたいものですが。
ベクタってなんで評価できないんでしょうか? 単なるデータだから自分自身を返してもいい気がするんですけど。
評価できないオブジェクトって束縛されてないシンボル、不正なリスト、ベクタの3種類だけですよね。
0463デフォルトの名無しさん
05/02/04 23:23:27> ベクタってなんで評価できないんでしょうか?
SCM:
> #(1 2 3)
#(1 2 3)
ってことじゃなくて?
0464デフォルトの名無しさん
05/02/04 23:27:420465デフォルトの名無しさん
05/02/05 00:43:37クォート付けないといけないって仕様に書いてあるんで。
実行前の構文解析をして実行時の条件分岐や仮想関数呼び出しを無くしたんですが
逆に遅くなりました。型タグでの分岐や仮想関数呼び出しは大したネックにはならない
んですかね。速くする方法が分からないんですが、VM化すれば3,4倍くらい速くなるんでしょうか?
0466デフォルトの名無しさん
05/02/05 00:59:490467デフォルトの名無しさん
05/02/05 01:13:31どういう風にしたんですか?
実行時の条件分岐や仮想関数呼び出しよりも高速な形式にしなきゃ速くならないでしょう。
0468デフォルトの名無しさん
05/02/05 01:32:07構文解析済みオブジェクトに関数ポインタメンバを持たせて evalする時は
それを呼びだすという感じです。
struct analyzed_obj {
func_ptr ev;
scheme_obj value;
scheme_obj car;
scheme_obj cdr;
};
scheme_obj const_obj(analyzed_obj obj, enviroment e){
return obj.value;
}
struct analyzed_obj *analyze(scheme_obj obj){
if(numberp(obj) || boolp(obj) || charp(obj) || stringp(obj)){
struct analyzed_obj *a = new_analyzed_obj();
a->ev = &const_obj;
a->value = obj;
}
...
}
scheme_obj eval(analyzed_obj obj, enviroment e){
return obj->ev(obj, e);
}
0469デフォルトの名無しさん
05/02/05 01:48:050470デフォルトの名無しさん
05/02/05 01:55:37analyzeの中もヒープに確保したりとかは擬似コード的には余計でした。
evalの中も->じゃなくて.ですね。
>>469
実際には全てのオブジェクトをヒープに確保してて、全部ポインタ渡しです。
副作用起こせないだろ、とかそういうことですか?
0471デフォルトの名無しさん
05/02/05 01:59:380472デフォルトの名無しさん
05/02/05 02:03:48これだったら仮想関数呼び出しと大差ないと思うんだけど、何で遅くなるんだろうね。
0473デフォルトの名無しさん
05/02/05 02:08:25そうですか。仮想関数呼び出しが無くなる変わりに関数呼び出しが一つ増えてるんですよね。
型タグで分岐せずに直接関数ポインタを使うっていうのもなんか不毛な感じがしますし。
こまごまとしたエラーチェックを実行時にしなくていいっていうのはありますが、
>>423 が言うような高速化は気にしなくてもいいんですかね?
まあ、423も高速化の余地は少ないと言ってますし。
0474デフォルトの名無しさん
05/02/05 15:03:01> 素朴な疑問なんですがヒープよりスタックの方がアクセスが速いんでしょうか?
アクセス速度の方はほとんど変わらない。局所性が上がる分だけ微妙に良い程度だと思う。
環境をスタック上に作るのはヒープの消費を押さえるためで、一般的にはこれが速度に貢献することを期待している。
ただしクロージャーを作るときにはヒープへのコピーが発生するわけで、コンパイラの性能やプログラムによっては逆効果になることもある。
そのへんは確かorbitの論文に詳しかったように思う。
>>473
>471が既に言ってるけど、関数ポインターの使用は最近のCPUでは遅い。理由は
1. 飛び先の分岐予測が外れやすい(ぼぼ100%外すやつもあり)のでハザードが多い。
2. 飛び先の分岐予測が外れるのを嫌ってコードのアッチコッチから飛ばしていると、今度はリターンの予測が外れて(ぼぼ100%外すやつもあり)ハザードになる。
んじゃどうするか?そこでFORTHですよ!騙されたと思ってthreaded codeでググってみよ!
FORTHマニアは友達にはなれそうも無いけど、やつらはVMには気合いが入っている。勉強になることが多い。
あ、FORTHでSCHEME書くのを勧めてるわけじゃないからね(笑
0475デフォルトの名無しさん
05/02/05 17:06:09> 素朴な疑問なんですがヒープよりスタックの方がアクセスが速いんでしょうか?
ハード依存。
スタック領域とヒープ領域が別々のメモリになっていたら、多くの場合スタックの
方が早くなるように作られている。
でも大抵のPCは同じメモリ上にスタックもヒープもあるからアクセス速度はほとんど
同じだと考えて問題ないと思う。
ハードが特殊な場合は気を付けて。
0476デフォルトの名無しさん
05/02/05 17:31:36なるほど。ラベルをデータとして扱えたらなーと思ってたんですが、GCCならできるらしいですね。
これは threaded codeと関係あるのかなあ。まだ threaded codeのことは全然分かんないですが、
Scheme関連でいうと QSchemeというのが使ってるらしいですね。
VMのことは全然分からないヘタレなのでとりあえずドラゴンブック読みます。
あと >>395 のコードをいろいろ改良しました。いろんな構文や型を足して、
set!や継続を実装しました。すぐに スタックオーバーフローになるのと
継続が環境依存かつ遅いのが弱点で、SECDR-Schemeと同じ程度の速さです。
0477デフォルトの名無しさん
05/02/08 11:56:140478デフォルトの名無しさん
05/02/08 12:34:500479デフォルトの名無しさん
05/02/08 14:04:560480デフォルトの名無しさん
05/02/08 15:06:200481デフォルトの名無しさん
05/02/08 15:31:57djgcc+DOSエクステンダなものならありそうとも思うが。
0482デフォルトの名無しさん
05/02/08 15:52:35640キロバイトもあれば十分ですよ
by ビル・ゲイツ
0483教えて君
05/02/14 13:12:58(use rfc.md5)
(open-input-file "Q:/000 SF/backup/(readme)/readme.txt")
(md5-digest)
で良いでしょうか?
(md5-digest-string "test")は応答がありますが
(md5-digest)は応答がありません。
0484デフォルトの名無しさん
05/02/14 13:30:57といいつつ、ワシも読んでないが、多分
(use rfc.md5)
(with-input-from-file "Q:/000 SF/backup/(readme)/readme.txt" md5-digest)
Gauche だと foo-string があるとき、foo は (current-input-port) から読んで
(current-output-port) に書き出すプロシージャになってることが多い。
0485483
05/02/14 21:55:25ありがとうございました
0486デフォルトの名無しさん
05/02/16 17:30:55PDF死ぬほど読みにくい・・・
リンクもないしさー
0487デフォルトの名無しさん
05/02/16 23:16:12書き方が変だから読みにくいんだよ。用語も少しおかしいし、眠くなるし。
プログラミング言語Schemeの方がいいよ。原書はただで読めるし。
そういえば何時の間にか3rd editionになってますね。
0488デフォルトの名無しさん
05/02/16 23:35:57その違いを知っておけばいいぐらいじゃない?
ネットに転がってるSICPやら入門サイトでも流し読みすればいい。
結局R5RSとかの規格書しか読まなくなる。
あと理解を深めるには処理系依存度が高い言語だから、
どれか1つの処理系に詳しくなるか、自作でもした方がいいね。
0489デフォルトの名無しさん
05/02/17 00:01:380490デフォルトの名無しさん
05/02/17 00:17:240491デフォルトの名無しさん
05/02/17 00:17:560492デフォルトの名無しさん
05/02/17 12:27:58disassembleして眺めるのが好き。
0493デフォルトの名無しさん
05/02/17 23:38:230494デフォルトの名無しさん
05/02/18 00:09:27なんて本?
0495デフォルトの名無しさん
05/02/18 00:15:260496デフォルトの名無しさん
05/02/18 00:57:520497デフォルトの名無しさん
05/02/18 10:37:18クロージャないのトップレベルで(call-with-current-continuation (c) c)して継続を
得た場合この継続は何を指してるんですか?
0498デフォルトの名無しさん
05/02/18 11:29:060499デフォルトの名無しさん
05/02/18 11:41:50この次の関数に処理の流れが戻るということですか
0500デフォルトの名無しさん
05/02/18 14:01:26誰にもわからないなんて凄すぎる。
いや、実はトップレベル継続の呼び出しは処理系依存。
トップレベルにも戻るというだけは保障されてるが、
次が何なのかは決まってない。
0501デフォルトの名無しさん
05/02/18 17:34:22このスレのひとはなんかかっこいい
0502デフォルトの名無しさん
05/02/18 18:25:08むしろあれはLISP信者への入信本かな
あの本には不思議な魅力があるよね
0503デフォルトの名無しさん
05/02/18 20:28:08>(list 1 2 3 (call/cc (lambda (c) (set! cont c) 'foo)) 4 5 6)
1 2 3 foo 4 5 6
>(cont 'hoge)
1 2 3 hoge 4 5 6
でなんとなく想像つくかな?
0504デフォルトの名無しさん
05/02/18 20:31:59> (cc 80)
> cc
80
これならどうだ?
0505デフォルトの名無しさん
05/02/18 20:47:57> (define cont #f)
>((call-with-current-continuation (lambda (c) (set! cont c) cdr)) '(1 2))
(2)
> (cont car)
1
でもって、
>(call-with-current-continuation (lambda (c) (set! cont c) 'bye))
bye
>(cont 'hello)
hello
ということになる。
0506デフォルトの名無しさん
05/02/18 20:50:310507デフォルトの名無しさん
05/02/18 21:26:340508デフォルトの名無しさん
05/02/19 01:01:20別にどこでもいいじゃん
0509デフォルトの名無しさん
05/02/19 01:07:46http://www.amazon.co.jp/exec/obidos/ASIN/4826900430/qid%3D1108742823/249-7335580-3753166
0510デフォルトの名無しさん
05/02/19 01:13:500511デフォルトの名無しさん
05/02/20 10:57:280512デフォルトの名無しさん
05/02/20 14:00:52があります。引数をスタック上に作ると (lambda (a) a) みたいに引数が返り値に
使われるときに困らないでしょうか。返り値がスタックにあるかチェックしてヒープ
にコピーしたりするんでしょうか。
頭の中がまとまってないので変なこと言ってたらすいません。
0513デフォルトの名無しさん
05/02/20 14:26:570514デフォルトの名無しさん
05/02/20 14:49:53コピーはネックにならないんでしょうか?
GCいらない代わりにコピーが必要なのとコピーがいらない代わりにGCが必要なのは
どちらがいいか微妙じゃないですか?
0515デフォルトの名無しさん
05/02/20 15:11:000516デフォルトの名無しさん
05/02/20 15:17:440517デフォルトの名無しさん
05/02/27 19:30:49http://www.shiro.dreamhost.com/scheme/wiliki/wiliki2.cgi?Shiro
Lisp 脳ワラタ
参考:森昭雄教授,講演で「ゲームが原因で自閉症になる」発言
http://slashdot.jp/article.pl?sid=05/02/26/1219202&topic=42&mode=nested&threshold=-1
0518デフォルトの名無しさん
05/02/27 19:50:35Lisp 脳か。おれも気をつけようw
0519デフォルトの名無しさん
05/02/27 20:19:060520デフォルトの名無しさん
05/03/01 00:18:430521デフォルトの名無しさん
05/03/01 00:19:280522デフォルトの名無しさん
05/03/02 14:59:36私は今のところ,lisp-mode で書いて,Petite Chez Scheme のコンソールに
コピペしています.もっと良いやり方は無いものでしょうか?
Emacs の *scratch* バッファがうらやましい.
0523デフォルトの名無しさん
05/03/02 15:27:250524522
05/03/02 16:51:00それはできるのですが,いくつか問題があって,
・プログラムの戻り値は表示されるが,ユーザの入力値は消えてしまう.
・サブプロセスの起動は,非力なマシンだと重い.
などの理由があって,今のところ Petite Chez Scheme を単独で動かしています.
0525522
05/03/03 11:42:010526デフォルトの名無しさん
05/03/05 03:52:53良さそうな情報源ないでしょうか
0527デフォルトの名無しさん
05/03/05 12:44:020528デフォルトの名無しさん
05/03/05 13:28:34オンラインなら,犬飼大の『入門Scheme』
http://www4.ocn.ne.jp/~inukai/scheme_primer_j.html
英語でよいなら,Kent Davig "Programming Language Scheme"
http://scheme.com/tspl3/
書籍なら,その邦訳のケント・デイヴィグ『プログラミング言語Scheme』
http://www.amazon.co.jp/exec/obidos/ASIN/4894712261
しかしこれも FAQ だなあ.これに答えるの,もう3回目ぐらいだよ.
0529デフォルトの名無しさん
05/03/05 13:39:46> オンラインなら,犬飼大の『入門Scheme』
> http://www4.ocn.ne.jp/~inukai/scheme_primer_j.html
これは「良さそうな」情報源には入らないと思うなあ。
0530デフォルトの名無しさん
05/03/05 14:03:03批判があるのはよく分かるが,ほかに日本語で読める,R5RS のマクロの文献は
私はほかに知らない.あとはR5RS そのものになってしまう.
この本のマクロの部分は,R5RS そのものよりはまだ読みやすいよ.
0531デフォルトの名無しさん
05/03/05 22:33:09英語でもTSPLの説明の方が簡潔かつわかりやすいと思うな。
どうせR5RS分だけならすごく短いし。
chezのsyntax-caseの説明もあって長いけどそっちは興味ないなら全く見なきゃいいし。
すげー短いから、ここだけ和訳を立ち読みしてもいいんじゃない。
サンプルとかはwebにある英語と変わらないんだから必要なら参照できるし。
0532デフォルトの名無しさん
05/03/06 03:31:52と太陽に吠えてみる
0533デフォルトの名無しさん
05/03/06 03:33:26ほとんどlambdaと一緒だろ。
0534デフォルトの名無しさん
05/03/06 03:56:380535デフォルトの名無しさん
05/03/07 12:15:200536デフォルトの名無しさん
05/03/07 17:54:08paradox
0537デフォルトの名無しさん
05/03/07 22:44:150538デフォルトの名無しさん
05/03/07 23:14:150539デフォルトの名無しさん
05/03/12 21:28:13http://www.linux.or.jp/bookreview/BR85.html
驚くほど,評価が低い.誉めているのは最後の評者ぐらい.おまいらはこの本を,
どこまで理解してレビューしているのか,小一時間問い詰めたい.とにかく,
この本の内容の熱気が,評者らには全然伝わってない感じなんである.
と言うか,なんか考えさせられました.普通の人の反応って,こんなものです
よね.みんなが面白がるはずはない.それを改めて実感させられました.
0540デフォルトの名無しさん
05/03/12 21:36:30Lispを知らない人(つまりほとんどの人)にとっては「なんのこっちゃ」って部分があるのは
確かだろうね。前半は割と万人に勧められると思うけど。
でも、こういう本をきかっけに Lisp に興味を持ってくれる人も多いのではないかと個人的
には期待してるよ。
そういう人たちの次のステップとなるためにも「Lispで作るWebアプリ」みたいな本が出ると
いいよね。
0541デフォルトの名無しさん
05/03/12 21:53:280542デフォルトの名無しさん
05/03/12 22:19:480543デフォルトの名無しさん
05/03/13 00:41:140544デフォルトの名無しさん
05/03/13 03:30:420545デフォルトの名無しさん
05/03/13 04:20:37右向いた oppai
)
右向いた oppai (陥没乳首)
0546デフォルトの名無しさん
05/03/13 04:23:020547デフォルトの名無しさん
05/03/13 04:39:55_ ∩
( ゚∀゚)彡
⊂彡
0548デフォルトの名無しさん
05/03/13 09:06:070549デフォルトの名無しさん
05/03/13 10:42:00このスレで議論して、本をだしてはどうだろう?
「電車男」に続いて。
煽りではない、マジレス
0550デフォルトの名無しさん
05/03/13 11:24:15「日本語がこ難しい」という評はちょっと理解できん。
おれは良い訳だと思うし、最後の人の評がぴったりくるな。
まぁマンセー評ばっかりだと逆に嫌だけどw
>>549
多分 CGI よりも(勿論サーブレットよりも)
圧倒的に動きが分かりやすいから、良いと思う。
関数が呼ばれて文字列を返す、それをマクロで囲むだけ。
さてどこから議論するかだな。
とりあえず portable aserv と clsql 位の導入から始める?
ただし、圧倒的に高度な事をしないと Lisper は満足しないだろうし、
そうすると素人にはチンプンカンプン、という難しさはあるw
0551デフォルトの名無しさん
05/03/13 11:43:07今はJavaにあわせてやれることを決めてるって感じだし
0552デフォルトの名無しさん
05/03/13 11:46:54確かにふつーのWebアプリ作るだけなら「PHPでいいじゃん」って言われそうだよね。
CMSっぽいのを1から作るとかやれば面白いかな。
0553デフォルトの名無しさん
05/03/13 11:57:34本物の(汎用的って意味ね)プログラミング言語である Lisp じゃなきゃ
できない事ってのを見せつけなきゃな…
すぐには出ないけど皆で考えたらなんかあるんじゃない?
FireFox ががんばってWebブラウザを再定義しようとしているように。
0554デフォルトの名無しさん
05/03/13 12:20:57Lispを世に広めるためになら、敷居を低くすべきだろうな。
でないと、Lisperしか注目しないし、それでは意味がない。
面倒なんで、入門・初級・中級・上級とレベル別に議論すべきか?
そうすると、UNIX・Linux環境だけでなくWindowsも視野に入れねば
ならないか?
今のWebサービス系のPGやSEにアピールするためにはいきなり高度な
ことをせずに「とりあえず触ってみるか」と思ってもらえるように
しないといけない。となると、やっぱりWindowsなのかなぁ。。。
0555デフォルトの名無しさん
05/03/13 12:41:42まずは最初の壁を下げるために、Lisp/SchemeスペシャルなKNOPPIX CDが要るな。
ブータブルなKNOPPIX CD入れたらいきなりLispが動かせて、
必要なライブラリも揃ってるような奴。
できたらログインシェルを emacs にしといてやれw
0556555
05/03/13 12:44:270557デフォルトの名無しさん
05/03/13 14:17:08そういうの存在するはず。なんか一通りLispの処理系のエディタが入ってるやつ。
名前なんだっけ。
0558デフォルトの名無しさん
05/03/13 15:04:56最近チェックしてないけどACLのライセンス期限とかまだ平気なんかね。まぁ更新させて
くれるんなら問題ないんだけど。
ttp://common-lisp.net/project/lisp-res-kit/
0559デフォルトの名無しさん
05/03/13 16:55:360560デフォルトの名無しさん
05/03/13 17:32:40| 「日本語がこ難しい」という評はちょっと理解できん。
評価した人の日本語理解力が訳者の意図したレベルに到達してなかったものと思われる。
幼稚園児に小学生の教科書を読ませたみたいな感じかな。
ただ幼稚園児は批評することなくわからないと言うのに対し、ある程度年をくってくると
自分が理解できない文章は書いた奴が悪いと文句を言うようになる。よくあることさ。
0561デフォルトの名無しさん
05/03/14 00:15:500562デフォルトの名無しさん
05/03/14 00:36:07時々でいいですから GWM のことも思い出してやってください
0563デフォルトの名無しさん
05/03/14 00:48:09sawfishはクソな気がするんですが
0564デフォルトの名無しさん
05/03/14 00:49:46仮想VM環境入るとLISPづくしって感じの。
0565デフォルトの名無しさん
05/03/14 00:54:15子供を使った宣伝だね。
括弧だいすき!とか適当なフォーラムでっちあげて、
いかにも低年齢からでもLISP使えますよ?って誤解^H^H理解を広める。
0566デフォルトの名無しさん
05/03/14 01:11:33Smalltalkと同じ様な理由で。
0567デフォルトの名無しさん
05/03/14 06:21:26Lisperの標準的な環境ってなんだろうね?
やっぱemacsなんですかね?
個人的に、フランツがACLの日本語のドキュメントを
本にすりゃいいのに、と思う次第。
(あいつら日本でLisp広める気あんのか?)
0568デフォルトの名無しさん
05/03/14 10:26:14そんなの望むべくもなさそうな。
0569デフォルトの名無しさん
05/03/14 10:36:19Common Lisp なら Uncommon Web.
次のリリースでは CLSQL と連携もできるらしい。
問題は、多少手を入れないと日本語が通らないこと。
0570デフォルトの名無しさん
05/03/14 12:40:09LISP使いって聞くと、どうしても髭もじゃのキモオタ(=RMS)ってイメージが付きまとうから
そういった固定概念の除去という意味でも子供を使ったアピールってのは有効だと思う。
身寄りのない子供を預かってLISPの英才教育するネバーランドでも設営するとか。
0571デフォルトの名無しさん
05/03/14 12:56:08「日本語ドキュメントとかないとACL導入しにくいな〜」
とか言ったら、ドキュ用意してくれるかな?
無理かw
0572Scheme初心者
05/03/14 15:10:28(cond ((null? a))
(else
(display (car a))
(display "\n")
(disp-list-of-lists (cdr a)))))
((1 2 3)(2 3 4)(3 4 5))というようなリストの入れ子を
(1 2 3)
(2 3 4)
(3 4 5)
と表示したく、上のコードを書いたのです。このコードの添削お願い。
これみたいに帰結節が複数の式を含む場合、ifは使えないかな?
0573デフォルトの名無しさん
05/03/14 15:22:52(define (disp-list-of-lists a)
(if (not (null? a))
(begin
(display (car a))
(newline)
(disp-list-of-lists (cdr a)))))
0574デフォルトの名無しさん
05/03/14 16:00:04伝統的なマクロではどういうときに不都合が起こるのか教えてプリーズミー
0575デフォルトの名無しさん
05/03/14 16:58:55伝統的なマクロでも不都合は防ぐことはできる。
そういった対策を自動でやってくれるのが健全マクロ。
何が不都合なのかというと
(define-macro (hage test . body)
`(let ((var ,(test))) (var ,@body) (var ,@body)))
こんなマクロを作った場合にvarという名前が既に環境に入ってたら意味が違ってくる。
これを以下の様に直すと不都合がなくなる。
(define-macro (hage test . body)
(let ((var (gensym)))
`(let ((,var ,(test))) (,var ,@body) (,var ,@body))))
こういう事を自動でやるのが健全なマクロ。
でも健全マクロは冗長で独自の構文を覚えなきゃならない意味で個人的に嫌い。
0576デフォルトの名無しさん
05/03/14 17:11:08ありが�d!
0577デフォルトの名無しさん
05/03/14 18:07:29varだけじゃなく、hageが使われる文脈でletが束縛されていると
(普通は)困ったことになる。これはgensymじゃ防げない。
Schemeはそのへんに妙なこだわりがある。
CLは「letを束縛するような奴はいねえよ」で済ませるんだが。
0578デフォルトの名無しさん
05/03/14 18:18:24CLはパッケージがあるし、変数と関数の定義空間が違うから、基本的にはその手の
トラブルは起きにくいと言えるね。
0579デフォルトの名無しさん
05/03/14 18:32:13そうかあ。
まあそれってSchemeのキモイとこの1つだよね。
そういう心配してる割にパッケージとかの名前空間周りの改善が一向に見られないし。
Javaのパクリでもなんでもいいから適当なモデルを決めて欲しい。
0580デフォルトの名無しさん
05/03/14 19:03:45その上に適当に使いやすい人間様用のレイヤを被せて使うべきなんだよ。
MIT Scheme+とか。
0581デフォルトの名無しさん
05/03/14 19:27:56詳しく!
0582デフォルトの名無しさん
05/03/14 21:20:32(define (disp-list-of-lists a)
(for-each (lambda (x) (display x) (newline)) a))
0583デフォルトの名無しさん
05/03/14 22:49:30あれは妥協することなくDo the right thing.を徹底して貫く姿勢を維持してる
結果じゃないの? 適当なモデルとかで決めちゃうんじゃなくて全員が納得しない限り
規格には採用しない、っていうのは何でも取り込んで言語仕様がカオスになるよりは
いいと思うけど。処理系毎に色んな実験を試みるのも推奨してるみたいだし。
あと >>571
日本語ドキュメント用意した見返りに何ライセンス購入する? 向こうもビジネスなんだぜ。
0584デフォルトの名無しさん
05/03/14 23:15:510585デフォルトの名無しさん
05/03/14 23:17:30| 個人的に、フランツがACLの日本語のドキュメントを
| 本にすりゃいいのに、と思う次第。
詳細きぼんぬ。買うと日本語のドキュメントついて来るの? 内容いい感じ?
0586デフォルトの名無しさん
05/03/15 00:02:340587デフォルトの名無しさん
05/03/15 01:22:02そもそもFranzって日本法人なんて無いんじゃなかった?
まぁもし日本語ドキュメントが必要なら、
日本語ドキュメントを簡単に整備するための Lisp ベースのシステムを作る、
ってのはどう?
0588デフォルトの名無しさん
05/03/15 01:33:13なんか火事になったときの数学者と科学者とエンジニア(だっけ?)の小話みたいな…
0589デフォルトの名無しさん
05/03/15 02:27:010590デフォルトの名無しさん
05/03/15 05:52:550591デフォルトの名無しさん
05/03/15 07:09:53の日本語版があればな〜。
0592デフォルトの名無しさん
05/03/15 11:50:32文字の列の文字列とバイト列(u8vector)との区別だけで十分。
APIも、あるところではu8vector、別のところでは不完全文字列と
いうように統一感に欠けるような。
0593デフォルトの名無しさん
05/03/15 13:40:09http://www.franz.com/support/documentation/6.2/doc/aserve/tutorial.html
http://www.franz.com/support/tech_corner/webactions.html
http://www.franz.com/support/tech_corner/using-webactions.html
このあたりを日本語に訳していけばいいのだろうか?
0594デフォルトの名無しさん
05/03/15 14:06:04だいぶ昔にMLで話題になってたような気がする。不完全文字列は無くす方向とか。
0595デフォルトの名無しさん
05/03/15 16:25:042ちゃんねるには、
http://hobby7.2ch.net/car/
http://pc5.2ch.net/cdr/
car板とcdr板がある!
0596デフォルトの名無しさん
05/03/15 16:37:460597デフォルトの名無しさん
05/03/15 21:38:36そんなに日本語日本語いう理由を列挙してみて欲しい。
Franz Inc.の人もココ見てるから何か反応あるかもよ。
0598デフォルトの名無しさん
05/03/15 21:57:42ふざけた値段設定やめて。
0599デフォルトの名無しさん
05/03/15 22:24:20ワロタ。
ほんじゃいくらだったら妥当な価格だと思うかとか議論する?
初心者スレでやった方がいいような気もするけど。
あとACLが商用Common Lisp処理系の頂点に君臨しているみたいな
暗黙の了解があるみたいだけど、LispWorksユーザとか、Scieneerユーザとかの
意見も聞きたい。取っ付き易い環境とか日本語がとか言うならゲイツOSの上で
Cormanを日本語化するとかどうよ。あれ200ドルくらいでソースコード付いてるよね?
0600デフォルトの名無しさん
05/03/15 23:10:34英語ドキュメントしかないからその技術には手をださない、なんて奴は
日本語ドキュメントがあっても手を出しゃしないよ。
価格の話もスレ違いだろ。
>>588
詳細キボン
0601572
05/03/15 23:42:26>>582
ありがとです。define,lambdaの直下のとき以外でも、beginで複数の式を連続して書けるのね。
for-eachってのもあるのね。
0602デフォルトの名無しさん
05/03/16 00:06:05某とかゲイシの所の開発環境くらいの値段だろうな。
0603デフォルトの名無しさん
05/03/16 00:28:37それなりに市場性はあるんじゃないかとは思うよ。裾野を広げるのも大事だと思うな。
0604デフォルトの名無しさん
05/03/16 00:31:39普通の開発環境買ったことないだろ?
0605デフォルトの名無しさん
05/03/16 00:55:040606デフォルトの名無しさん
05/03/16 01:00:13LispWorks、以前開発中のプログラムでベンチマークしたときは ACL の倍くらい
速かったよ。(どちらも無料版での計測だけど)
結構良い印象を持っている。(でも cmucl のほうがさらに速かったけど)
0607デフォルトの名無しさん
05/03/16 01:01:440608デフォルトの名無しさん
05/03/16 01:04:200609デフォルトの名無しさん
05/03/16 01:19:000610デフォルトの名無しさん
05/03/16 01:37:220611デフォルトの名無しさん
05/03/16 06:37:27一PGに限ればそのとおりだと思うよ。
でも導入のために上司説得したりする時に日本語ドキュメントないと
結構辛いんだわ。協力会社・派遣・外注にLisperの募集かけてすぐに
頭数揃うと思う?JAVAerでも揃わないのに。
だとするとLispの教育ってコストをかけなきゃいけない。
そのときに英語という余計なコストがかかる、と聞いて上司がいい顔
するわけないだろ?
趣味と仕事を一緒にするなってw
0612デフォルトの名無しさん
05/03/16 06:59:33言語を何とか教えたところで、経験ない連中と一緒だと、高階関数×、マクロ×
みたいな条件で書く羽目になるぞ。
0613デフォルトの名無しさん
05/03/16 07:16:24だけどLispで何人も使うような仕事ってあるのか?
どうせ少人数でやるんだから、
英語なんかに抵抗なく、新しい言語を覚えるのにも抵抗のない、
優秀な奴集めようぜ。
頭数がいるような仕事はJava、ってのは禿しく同意。
Lispは逆。
0614デフォルトの名無しさん
05/03/16 07:57:540615デフォルトの名無しさん
05/03/16 09:53:32じゃあRubyにしとけや(プゲラ
0616デフォルトの名無しさん
05/03/16 13:52:01Lispは素晴らしいとは思うが、使える奴が少なすぎる。
0617デフォルトの名無しさん
05/03/16 17:45:37とりあえず>>593を訳すよ。
できたら>>611にもあげるから。
>>611
Lisperとjava技術者だったらjava技術者の方が集めやすくない?
なんでLispなわけ?
初心者スレのほうで会社にACL導入しようとしていた人がいたけど、
同一人物?
0618デフォルトの名無しさん
05/03/16 18:12:00なことを書いてると Paul Graham に殺されるぞ。
ttp://www.shiro.dreamhost.com/scheme/trans/beating-the-averages-j.html
0619デフォルトの名無しさん
05/03/16 18:40:42それはレベルの高い海外で、その中でも偶然PGがレベル高かった
から成り立った事例だよ。
0620デフォルトの名無しさん
05/03/16 19:03:54日本では仕事で使われる言語や処理系の定番というものがほぼ固定化してる。
それにテンプレートやOOに振り回されて他の概念にまで手が回らないんだろう。
総人口で考えても向こうは仕事する人数ぐらいは集まりそうだが、
日本ではLisperを見つける事自体が難しい。
Lispで仕事したかったら海外に飛んだ方が早い。
0621デフォルトの名無しさん
05/03/16 19:14:490622デフォルトの名無しさん
05/03/16 19:15:25Lispで仕事したかったら自分で事業を起こせ。組織に頼っちゃ駄目だ。
0623デフォルトの名無しさん
05/03/16 19:44:15yahooに買収されてから、lisp技術者がいないからって理由で
他の言語に書き換えられたらしいし。当然その頃にはPaul
Grahamの手は離れてたらしいけど。
どこの国も同じ。
0624デフォルトの名無しさん
05/03/16 20:07:560625デフォルトの名無しさん
05/03/16 20:08:44OCamlで開発してー
0626デフォルトの名無しさん
05/03/16 20:11:150627デフォルトの名無しさん
05/03/16 20:49:49がーん。lisp から書き直されたのか…。
その言語と、情報ソース分かれば知りたいっす。
0628デフォルトの名無しさん
05/03/16 21:16:14Paul Graham のメッセージ。
ttp://people.csail.mit.edu/people/gregs/ll1-discuss-archive-html/msg02367.html
まあ、まだS式は使ってるらしい。
Paulは、これやっぱり腹を立ててるんでしょうな。
0629デフォルトの名無しさん
05/03/16 21:19:330630デフォルトの名無しさん
05/03/16 21:24:39読んだんだった。
http://www.paulgraham.com/avg.html
から
In January 2003, Yahoo released a new version of the editor written in
C++ and Perl. It's hard to say whether the program is no longer
written in Lisp, though, because to translate this program into C++
they literally had to write a Lisp interpreter: the source files of
all the page-generating templates are still, as far as I know, Lisp
code.
628でも↑でも、S式解釈してるからLispインタープリタを相変わらずもって
るんだって主張してるけど、そのS式の部分、どれくらいLisp的なんだろうなあ。
かなり宣言的というかデータに近いもののような気もしなくもない。
0631デフォルトの名無しさん
05/03/16 23:22:300632デフォルトの名無しさん
05/03/16 23:36:59ここでこういう話は特に問題ないのでは?
何が気になんの?
0633デフォルトの名無しさん
05/03/17 00:06:53自ら動こうとしているおまいは立派だぜ。
おれは正直日本語じゃなくても良いけど、何かあったら手伝わせてくれ。
ただ翻訳はWikiとか使っても精度が上がらないから、
出来上がりを読んで何か言うくらいしかできないけど…
>>620, 622
おれはLispがしたいんじゃなくて、良い仕事をしたい。
そのための良い道具がLisp、と思う。
0634デフォルトの名無しさん
05/03/17 00:07:31他に話題があるなら積極的にふれば?
0635デフォルトの名無しさん
05/03/17 00:31:39ドキュメントの日本語版を作る、ってのならある程度意義はあると思うんだけど。
Peter Seibelに勝手に訳して適当にウェブで晒していいか?って質問したら
Apressのしかるべき担当を見付けて連絡するからちっと待て、と言われてもう10日以上・・・
0636デフォルトの名無しさん
05/03/17 01:09:290637デフォルトの名無しさん
05/03/17 08:06:54商品データフォーマットの宣言
商品データ自体に加え、
システムの各種設定が簡単なS式になってるのと、
あと、店舗ページ生成のためにLISPをベースにした
非常に簡単なスクリプト言語を用意しているんだけど、それが
内部的にはLISPというか簡単なS式になって格納されている。 (US Yahoo!の場合)
http://help.yahoo.com/help/us/store/edit/advanced/advanced-09.html
(このページ、説明としてはぜんぜん足りないんだけど雰囲気だけはわかる)
0638デフォルトの名無しさん
05/03/17 15:16:19訳精度はあんま期待しないでね。
というわけでAllegro Webactionsを10%程度翻訳中。
0639デフォルトの名無しさん
05/03/17 23:13:38がんがれ!
0640通りすがり
05/03/18 02:02:05Lisp/Schemeだとこんなことができるんだぜ!!っていうの、ないの?
言語間の機能比較どうねんこうねんより、実際に無料で試せる処理系の上で動く
アプリケーションでLispで書かれているスゴイもの、って何?
(X)Emacs/xyzzyは便利に使わせていただいてますが、それだけじゃ説得力ない希ガス。
0641デフォルトの名無しさん
05/03/18 03:06:30(define (iter a p)
(if (not (null? a))
(begin
((car p) (car a))
(iter (cdr a) (cdr p)))))
(if (= (length a) (length p))
(iter a p)
(error "Error: apply-multi-proc")))
(define main
(apply-multi-proc '(1 2 3) '(a b c)))
(define (a x) (display x))
(define (b x) (display (* x 2)))
(define (c x) (display (* x 3)))
このコードが動かないわけを教えてください。
(a 1)がInvalid Applicationと言われてしまいます。
0642デフォルトの名無しさん
05/03/18 03:22:120643デフォルトの名無しさん
05/03/18 03:26:050644デフォルトの名無しさん
05/03/18 03:29:170645デフォルトの名無しさん
05/03/18 03:39:30実際には別のprocedureから呼び出してます
0646デフォルトの名無しさん
05/03/18 03:49:430647デフォルトの名無しさん
05/03/18 03:51:16載せる前の元のプログラムはちゃんと違う名前でした。
0648デフォルトの名無しさん
05/03/18 04:07:54が
( 'a 1 )
になるんじゃない?
0649デフォルトの名無しさん
05/03/18 04:47:39とりあえず main の '(a b c) -> (list a b c)。
必要なのは a,b,c ていうシンボルではなく a,b,c の値である関数だから、
a,b,c を評価した結果をリストにする必要があります。
ていうか、(map (lambda (x y) (y x)) '(1 2 3) (list a b c)) でいい気がします。
0650デフォルトの名無しさん
05/03/18 12:11:55引数と関数が同じ数だと保障されてるなら、
(define (apply-multi-proc a p) (for-each (lambda(x y) (x y)) p a))
エラー付け足すなら
(define (apply-multi-proc a p)
(if (not (= (length a) (length p))) (error ...))
(for-each (lambda(x y) (x y)) p a))
(define (a x) ...)
(define (b x) ...)
(define (c x) ...)
(apply-multi-proc '(1 2 3) (list a b c))
quoteをうまく使えてないだけだと思う。
0651デフォルトの名無しさん
05/03/18 12:12:42副作用を起こすのが目的みたいだからmapじゃなくてfor-eachかと。
まあ知らんけど。
0652デフォルトの名無しさん
05/03/18 13:55:09これじゃダメなのか?
http://jp.franz.com/base/seminar/2004-06-10/aserve.files/frame.htm
0653デフォルトの名無しさん
05/03/18 18:57:450654デフォルトの名無しさん
05/03/18 20:36:56知らんかった?
木村巌さんのサイト全然更新してくんない (´・ω・`)
URL変更あったヤツとかだいぶ前にメールしてあるんだけど...
0655641
05/03/18 21:46:360656デフォルトの名無しさん
05/03/18 22:48:19それじゃだめだろ。
0657デフォルトの名無しさん
05/03/18 22:54:05これって、最近の Allegro CL と比べて使える範囲内に入る?
0658デフォルトの名無しさん
05/03/19 16:10:03http://www.stormsoft.org/~pc/game/clicktest/index.html
XMLがメインのツールで、Schemeはごく一部にしか使ってない。
組み込んだ処理系は湯淺氏のJavaアプリケーション組み込み用のLispドライバ。
0659デフォルトの名無しさん
05/03/20 05:03:520660デフォルトの名無しさん
05/03/20 16:48:18SIODっていうEXEも作れるScheme処理系のサンプルにftpクライアントがあるけど。
でもperlみたいにライブラリの整備がされてないから処理系固有になって
使いづらいと思う。
この辺ネットワークモジュールインターフェースみたいなの考えて
各処理系で使い回しできる様にならないかな。
FFIで繋ぐだけで各処理系からftp使えるようにするとか。
BSDsocketっていやらしい部分があるけど。
0661デフォルトの名無しさん
05/03/20 17:17:16すると「人間らしさ」を司る前頭前野において、α波が優位になりβ波が低下したという。
α波はリラックスしている時に見られる脳波と言われる。
「たくさんの開き括弧と閉じ括弧が、寄せては返す波のリズムのように作用し、脳に影響
をあたえているのではないか」と研究を行ったエム博士は述べている。
エム博士はインタビューでさらに衝撃的な理論を明らかにした。
「この波形は痴呆症の患者のものとよく似ている」
というのだ。
「Lispは専門家の間ではとても危険な言語として知られています。
JavaやC++といった正統的な言語では、プログラマはよく考えてから
プログラムを書かないと、実行する以前にコンパイルエラーになってしまいます。
しかし、Lispにはそのような規律が全くありません。
でたらめなコードでも実行できてしまい、エラーが起きてもそこで適当に
数値を書き換えて実行を続けることができてしまうのです。
こんな言語を使っているプログラマはものを考えなくなり、
適当に式を打ち込んで、動けば良いという習慣がついてしまいます。」
0662デフォルトの名無しさん
05/03/20 17:18:05「考えることを止めたルーズなLispプログラマは、やがてコンピュータに合わせて
プログラムを書くのではなく、あたかも自分がコンピュータを操っているかのような
全能感に囚われます。自分が一番であるというこの全能感のために、Lispプログラマ
は他の言語を使うプログラマを馬鹿にし始めるのです。」
博士はそのようなプログラマの脳は「Lisp脳」になっているのだと言う。
「この感覚は麻薬のようなものです。一度溺れてしまうと、
そこから抜け出すのは容易ではありません。」
Lisp脳の症状としては、「他の言語を馬鹿にする」の他にも、
「定められた勤務時間を無視する」、「見積りを出す前にプログラムを書き上げてしまう」、
「会議でじっと上司の話を聞いていることができない」、等があるという。
Lispの一種であるSchemeというプログラミング言語は、プログラミングの入門教育
で使われることがある。そのことにインタビュアーが触れると博士は激昂した。
「それは殺人教育です。アメリカでは軍事予算でLispの研究をやっている。
日本でも最近はゆとり教育だの何だのと言って子供に好きなようにやらせている。
もともと日本には、芸事はまず形から入るという文化があった。
師匠の真似をして、一通り形ができるようになって、それから心がわかるのです。
まずは紙の上で、誤りが一切無いプログラムを書けるようになるまで修行すべきです。
私が学生の頃は皆そうやっていた。」
0663デフォルトの名無しさん
05/03/20 17:23:23との間に関連が見られるという。「Lispで自閉症になるんです」エム博士はこう断言する。
「コンピュータを自由自在に操れる全能感に溺れ、自分の殻の中に閉じこもるのです。」
博士は一枚の紙を取り出した。「典型的なLispプログラムの見かけはこのようなものです。」
((((;゚Д゚)))
「ほら、冷汗をかいて震えている人間のように見えませんか。これはLispプログラマの対人恐怖
という潜在意識がプログラムコードの上に滲み出ているからなのです。」
0664デフォルトの名無しさん
05/03/20 17:24:56↑
LISP脳のおまいらw
0665デフォルトの名無しさん
05/03/20 18:34:26某サイトのコピペかよ。
あんま迷惑かけんなよ。
0666デフォルトの名無しさん
05/03/20 19:01:090667デフォルトの名無しさん
05/03/20 20:14:44全然メールが来ない・・・
許可されたと思っていいのだろうか?
0668デフォルトの名無しさん
05/03/20 20:28:460669デフォルトの名無しさん
05/03/20 20:31:40しかし、このままでは徹夜の労が無駄になるな
0670デフォルトの名無しさん
05/03/20 21:13:570671デフォルトの名無しさん
05/03/20 21:46:07(use srfi-4)
で単一型ベクタのモジュールを使おうと思ったのですが、
failed to link "libgauche-uvector" dynamically: dlopen, Win32 error 193
ってエラーが出てきてうまくいきません。どうしたらいいのでしょうか?
Winの対応は完全ではないようですがそのせいでしょうか。
(use srfi-1)はできました。
0672デフォルトの名無しさん
05/03/20 22:10:01ファイル壊れてるんじゃね?インストールし直してみたら
0673デフォルトの名無しさん
05/03/20 22:44:57とりあえず普通のvectorで書いて、ひまを見てインストール(コンパイル)
しなおしてみます。
0674デフォルトの名無しさん
05/03/20 23:30:45byteのlistから作ったvectorから、マルチバイト文字列に変換する方法を教えてください。
(list->string (map integer->char v)))
だと日本語は文字化けしちゃいました。
0675デフォルトの名無しさん
05/03/20 23:40:150676デフォルトの名無しさん
05/03/20 23:51:010677デフォルトの名無しさん
05/03/21 03:23:170678デフォルトの名無しさん
2005/03/21(月) 07:34:290679デフォルトの名無しさん
2005/03/21(月) 07:38:140680デフォルトの名無しさん
2005/03/21(月) 08:18:29「文字」と「バイト(オクテット)」は別物と思った方がいい。
低レベルでふたつを変換するにはu8vector->stringとかがあるけど、
srfi-4が使えないってことなら、output-string-portを作って
write-byteしてからget-output-stringしたらどう?
0681デフォルトの名無しさん
2005/03/21(月) 18:57:050682デフォルトの名無しさん
2005/03/21(月) 20:46:48R5RS英語版p.14にある例が理解できません。
whenがあるmacroとして定義されているとき、
(let ((if #t))
(when if (set! if 'now))
if) => now
となるのですが、評価の過程でどのような順に
「if」が置き換えられていくのでしょうか?
whenのマクロ定義の内部で使われている「if」が
置き換えられないことはわかります。
0683デフォルトの名無しさん
2005/03/21(月) 20:53:29もう少し具体的に言い換えますと、ソースコード中に現れる最後の3個のifが
なぜ#tに置き換えられてしまわないか、という質問です。
0684デフォルトの名無しさん
2005/03/21(月) 20:56:35誤「最後の3個の」
正「最後の2個の」
0685デフォルトの名無しさん
2005/03/21(月) 21:02:490686デフォルトの名無しさん
2005/03/21(月) 21:35:26ありがとうございます。
TSPL読んでもよくわからなかったので質問させてもらったのですが…
マクロ展開と引数の評価の順番が理解できていないのかもしれません。
先にマクロ展開、そのあと引数の評価、という順番で評価が進むと考えて
よいのでしょうか?
そのとき、展開後のコードに含まれるシンボルは、通常のスコープとは異なる
スコープをもつということなのでしょうか?混乱してます。
0687デフォルトの名無しさん
2005/03/21(月) 22:08:32ありがとです。うまくいきました。
0688デフォルトの名無しさん
2005/03/22(火) 00:13:01確かに、LISPで学んだアルゴリズムやリストの使い方をCでアプリケーションを
組んだときに活かすことができれば、美しいプログラミングができそうです。
そこで、LISPでのリストの処理をする関数などがCから利用できるライブラリのような
ものはないものでしょうか?
また、みなさんはもし、CやJAVAなどでLISPで学んだことをどのように活かしておりますでしょうか?
0689デフォルトの名無しさん
2005/03/22(火) 18:01:33(let ((if #t))
(when if (set! if 'now))
if))
はマクロ展開されると、だいたい
(let ((#:if1 #t))
(if #:if1 (begin (set! #:if1 'now)))
#:if1)
な感じになる。というわけで結果はnowとなる。
こんなんでいいのかな?
0690本田
2005/03/22(火) 20:35:55>Cで、あるいはもっと賢く、Schemeでリンク・リストを使う技法
http://www-6.ibm.com/jp/developerworks/linux/050304/j_l-listproc.html
>GLib
http://developer.gnome.org/arch/gtk/glib.html
0691デフォルトの名無しさん
2005/03/22(火) 21:18:56マクロ展開した結果じゃなくて、
工程を聞いてるんだと思うけど。
0692デフォルトの名無しさん
2005/03/22(火) 22:05:180693デフォルトの名無しさん
2005/03/22(火) 22:14:32>>691
682-684です。早速ありがとうございます。
689さんの展開結果の疑似コードはマクロ展開の行程を
推測するのに参考になります。
マクロシンボルは通常のスコープにあるシンボルと
かち合わないような名前に変更されて置換される、
と理解しました。
686の最後に書いた「展開後のコードに含まれるシンボルは、
通常のスコープとは異なるスコープをもつ」というのは
だいたいこのようなことを想像していて、それを書いた
つもりでした。
ただし、この例の場合はさらに複雑で、letのスコープも
絡んできますよね。
689さんの説明では、letブロックの中のシンボルも
置換されてしまっていますが、マクロシンボルの置換の
対象になるのは飽くまでも(when ....)のブロックの内部
だけに限られますよね。
(689さんが説明のためにすべてのシンボルを置換されたのは
理解していますが、厳密にいうと、です。)
結局、まず(独自のマクロシンボルのスコープを用いて)マクロ
展開が行われ、その後、展開式の評価が通常のメカニズムで行われる、
と理解できかけているような気がします。
まだ完全にはわかっていない感がありますので、もう少し考えてみます。
どうもありがとう!
0694デフォルトの名無しさん
2005/03/22(火) 22:16:59693です。まさにそういうことみたいですね。
0695デフォルトの名無しさん
2005/03/22(火) 22:19:250696デフォルトの名無しさん
2005/03/22(火) 22:23:28「そういうこと」=「解釈時の展開と実行時の束縛を混同している」
という意味でした。
0697本田
2005/03/22(火) 22:30:34>Gauche(ゴーシュ)は、
>スクリプトインタプリタとしての使い易さに重点を置いて開発を行っているR5RS準拠のScheme処理系です。
>日常業務の中でのちょっとした処理を行うスクリプトを気軽にSchemeで書きたいなあ、
>という願望のもとに、起動が速いこと、
>システムへのアクセスが組み込まれていること、
>最初から多国語対応を考慮していること、
>リスト処理ライブラリとして他のC/C++プログラムから簡単にリンク可能であること、
>などを目標としています。
http://www.shiro.dreamhost.com/scheme/gauche/index-j.html
0698デフォルトの名無しさん
2005/03/23(水) 23:13:13*** - invalid byte #x83 in CHARSET:ASCII conversion
clispはcygwinのインストーラでインストールしました。
エラーが出たからといって動作に不都合はないみたいなんですが、気持ち悪いので
できればなんとかしたいです。解決方法知ってたら教えてもらえませんか。
0699デフォルトの名無しさん
2005/03/23(水) 23:23:20装ってどれぐらいあるんでしょうか。ちょっとググった限りでは見つけ
られませんでした。
+ Some implementations may implement "implicit forcing," where the value
of a promise is forced by primitive procedures like `cdr' and `+':
(+ (delay (* 3 7)) 13) ==> 34
0700デフォルトの名無しさん
2005/03/24(木) 00:37:41export LANG=
してから実行するとエラー消えたりしない?
0702デフォルトの名無しさん
2005/03/25(金) 03:03:16touch ~/.clisprc
0704デフォルトの名無しさん
2005/03/26(土) 13:36:44リスト内包表現って構文であって、
その操作自体をfirst class objectとして扱えないよね?
つまり持ち運ぼうと思ったら関数を定義して名前を与えざるを得ないよね。
その場合のための統制語彙があるに越したことはないのに、
「俺様が理解に詰まるものは捨て捨て」
だそうだ。何考えてるんだ。もったいない。
0705デフォルトの名無しさん
2005/03/26(土) 14:08:48しかし、なんで捨てるんだろうな。
俺が知ってるのは、Lispが他の言語より優れてるというgrahmaの意見に対する
Python側の反論で、lambdaはPythonコミュニティでは失敗とみなされてる
ってのがあったんだけど、なぜだかは知らない。
もしかしたらlispの方が優れてると言わせたくない思惑があるのかも?
0706デフォルトの名無しさん
2005/03/26(土) 14:13:470707デフォルトの名無しさん
2005/03/26(土) 14:32:290708デフォルトの名無しさん
2005/03/26(土) 14:41:37>Python側の反論で、lambdaはPythonコミュニティでは失敗とみなされてる
>ってのがあったんだけど、なぜだかは知らない。
素人にはお勧めできないから。
0709デフォルトの名無しさん
2005/03/26(土) 16:24:180710デフォルトの名無しさん
2005/03/26(土) 16:27:240711デフォルトの名無しさん
2005/03/26(土) 17:03:45最後まで生き残るんじゃないかな。
0712デフォルトの名無しさん
2005/03/26(土) 17:15:220713デフォルトの名無しさん
2005/03/26(土) 18:45:29> grahma
grandmaに見えた。Lisperおばあちゃんw
0714デフォルトの名無しさん
2005/03/26(土) 19:13:370715デフォルトの名無しさん
2005/03/26(土) 19:44:30再帰 高階関数 なんでもどんとこいさ
λにmapcar クロージャをapply
マクロでDSL
オブジェクトも楽々 CLOSでさくさく
得意の総称関数
0716デフォルトの名無しさん
2005/03/26(土) 19:47:04ラップですか
0717デフォルトの名無しさん
2005/03/26(土) 19:51:340718デフォルトの名無しさん
2005/03/26(土) 19:59:490719デフォルトの名無しさん
2005/03/26(土) 20:01:05まだ私が生まれていないころですね。
0720デフォルトの名無しさん
2005/03/26(土) 20:01:420721デフォルトの名無しさん
2005/03/26(土) 20:40:59あれは世界観が最高だった。
0722デフォルトの名無しさん
2005/03/26(土) 22:05:520723デフォルトの名無しさん
2005/03/26(土) 22:16:020724
2005/03/26(土) 23:04:22lisp で書き溜めたいつくかの処理があってこれをCから使いたい
のですが、こういう処理って
fork→exec してパイプでつないで結果を得る、
みたいな方法になるんでしょうか?
clispとCが連携しているケースのソースなんか
あったら参考にしたいのですが、参考になるプロジェクトとか
サイトとかありませんか?
0725デフォルトの名無しさん
2005/03/26(土) 23:10:430726デフォルトの名無しさん
2005/03/27(日) 08:48:45http://download.plt-scheme.org/
v300 シリーズのα版だそうで、今までとはいろいろ変わってるっぽいです。
詳細は以下参照。
http://groups-beta.google.com/group/comp.lang.scheme/browse_thread/thread/920f08175520f833/25bd80a2a97d9cda#25bd80a2a97d9cda
個人的に嬉しかったのはマルチバイト文字、文字列が普通に扱えるようになったところ。
DrScheme 上で試したらこんな感じ。
> (string-length "ほげ")
2
> (string-ref "ほげほげ" 3)
#\げ
> (char->integer #\λ)
955
そういや chez scheme の v7.00 ていつ出るんだろう。
0727デフォルトの名無しさん
2005/03/27(日) 09:21:43今勉強してるんですが、まじ感動してます。
ほら、そこのリスパー!
俺に質問してみれ
0728デフォルトの名無しさん
2005/03/27(日) 09:26:39car板とcdr板があるのにcons板がないのはなぜですか
0729デフォルトの名無しさん
2005/03/27(日) 09:27:20midi 作るってことできるのかい? いや、できるのはわかっている。
でも、それを簡単にする Auxiliary パッケージはあるかい?
0730デフォルトの名無しさん
2005/03/27(日) 09:29:52Vacuous.
car板とcdr板なんてないじゃん。
cons は List (ってかツリー) をCONStruct するんだYO.
(cons (cons (cons ... ) ... ) ... )
の一番外側の cons をツリーのルートと見てもよい。
わかったか。 > リスパー
0731デフォルトの名無しさん
2005/03/27(日) 09:31:54昔、スコーンというおかしがあった。 てか今もある。
cons は
スコーン => scon => sconsconscon => cons cons cons
という見方もあるのである。
0732ぱんつマニアアアアア ◆6Vxxv8cFbA
2005/03/27(日) 09:34:35例えば、上の例の `sconsconscon' の先頭 `s' と
一番最後のキャラクター `n' をくっつけてみると、一つの輪ができる。
この時、この輪は consconscons とも sconsconscon とも
解釈することができるのであるYO.
わかったか >lisper
0733デフォルトの名無しさん
2005/03/27(日) 09:35:28http://pc5.2ch.net/cdr/
0734デフォルトの名無しさん
2005/03/27(日) 09:36:23>595
0735ぱんつマニアアアアア ◆6Vxxv8cFbA
2005/03/27(日) 10:03:19ヽ(`Д´)ノヽ(`Д´)ノヽ(`Д´)ノ
0736デフォルトの名無しさん
2005/03/27(日) 10:10:110737デフォルトの名無しさん
2005/03/27(日) 10:11:16一番最後のキャラクター `ん' をくっつけてみると、一つの輪ができる。
この時、この輪は ちんこちんこちんこ とも こちんこちんこちん とも
解釈することができるのであるYO.
(・∀・)
0738ぱんつマニアアアアア ◆6Vxxv8cFbA
2005/03/27(日) 10:17:52Re:>737 Topology でも学べ。
0739デフォルトの名無しさん
2005/03/27(日) 10:25:59ついにDrSchemeも日本語使えるようになったのか。
やっと使える処理系になったな。
0740デフォルトの名無しさん
2005/03/27(日) 11:48:39おお,よく知らせてくれた.
ここに書いてもらわなかったら,絶対視界に入らなかった.
0741デフォルトの名無しさん
2005/03/27(日) 12:37:55((・∀・) . (・∀・))
0742ぱんつマニアアアアア ◆6Vxxv8cFbA
2005/03/27(日) 12:49:08((・∀・) . (・∀・))
car + cdr == whole list
+ オペレーションは CONS
つまり、スコーン!
0743ぱんつマニアアアアア ◆6Vxxv8cFbA
2005/03/27(日) 12:50:250744デフォルトの名無しさん
2005/03/27(日) 13:00:49新種のスクリプトですか?
0745デフォルトの名無しさん
2005/03/27(日) 13:01:330746
2005/03/27(日) 13:07:450747デフォルトの名無しさん
2005/03/27(日) 13:13:180748デフォルトの名無しさん
2005/03/27(日) 13:19:470749デフォルトの名無しさん
2005/03/27(日) 13:26:42日本語がぁ!感激です。・゚・(ノД`)・゚・。
0750デフォルトの名無しさん
2005/03/27(日) 13:58:12MrEd でも日本語使えるようになってる?
0751デフォルトの名無しさん
2005/03/27(日) 14:23:180752ぱんつマニアアアアア ◆6Vxxv8cFbA
2005/03/27(日) 14:38:050753デフォルトの名無しさん
2005/03/27(日) 15:29:49ぱんつって何かおもしれ〜www
何気に変なこと知ってるし
0754デフォルトの名無しさん
2005/03/27(日) 16:10:270755デフォルトの名無しさん
2005/03/27(日) 16:43:560756デフォルトの名無しさん
2005/03/27(日) 19:38:030757大原ゆき ◆6iqfpMYUkI
2005/03/27(日) 19:39:480758デフォルトの名無しさん
2005/03/27(日) 21:02:440759デフォルトの名無しさん
2005/03/29(火) 00:57:48どうやって解凍すんの?
0760デフォルトの名無しさん
2005/03/29(火) 18:54:14*.scmファイル中の日本語が化ける。
Definitions Window内で日本語入力した場合は、化けずにちゃんとSJISで保存できるのに。
0761デフォルトの名無しさん
2005/03/29(火) 22:30:50他のエディタで書いたものを読ませたいなら、UTF-8 にすれば問題なし。
0762760
2005/03/30(水) 09:34:320763デフォルトの名無しさん
2005/03/30(水) 15:37:15CL-USER> (length "ほげ")
2
CL-USER> (aref "ほげほげ" 3)
#\げ
CL-USER> (char-code #\λ)
955
0764ぱんつマニアアアアア ◆6Vxxv8cFbA
2005/03/30(水) 17:52:33Re:>754 やあ。
Re:>757 吾と寝ろ。 >大原ゆき
0765デフォルトの名無しさん
2005/03/30(水) 20:02:520766デフォルトの名無しさん
2005/03/31(木) 08:27:02それっぽいライブラリがもうあったりしますか?
0767デフォルトの名無しさん
2005/03/31(木) 11:35:41SXMLでぐぐれ
0768デフォルトの名無しさん
2005/03/31(木) 23:29:00ttp://agentsheets.com/lisp/XMLisp/
0769デフォルトの名無しさん
2005/03/31(木) 23:58:03うひょ、リーダでそのままXML読めるのか。面白いな。
0770デフォルトの名無しさん
NGNGhttp://article.gmane.org/gmane.lisp.scheme.plt/8710
……日付変わっちゃったけど一応。
0771デフォルトの名無しさん
NGNGう〜ん もう一つひねりが欲しかったな。座布団は出ないかも。
0772デフォルトの名無しさん
2005/04/02(土) 22:52:30ひねり?ハァ?
そのまんまだろ。
何か問題でもあるのか?
0773デフォルトの名無しさん
2005/04/03(日) 02:45:230774デフォルトの名無しさん
2005/04/04(月) 06:51:31windows形式でのパス(C:\cygwinとか)を元にファイル操作をするには
どうすれば良いでしょうか?
string-trの使い方を分かってないみたいです。
0775デフォルトの名無しさん
2005/04/05(火) 00:06:270776ぱんつマニアアアアア ◆6Vxxv8cFbA
2005/04/05(火) 10:37:00お ね
め \
\ ん
ら だ
つ Y
ま O
ん
0777ぱんつマニアアアアア ◆6Vxxv8cFbA
2005/04/05(火) 15:59:31吾はプログラマーではない; 論理学者であるぞ
貴様等とは格が違う
0778デフォルトの名無しさん
2005/04/05(火) 16:02:19何研究しているの?
0779ぱんつマニアアアアア ◆6Vxxv8cFbA
2005/04/05(火) 16:06:43>>778
主に数学論理である
それとモダン論理システムにも手を出している
0780デフォルトの名無しさん
2005/04/05(火) 16:08:17モダン論理システムってどんなもの?
0781デフォルトの名無しさん
2005/04/05(火) 16:10:500782デフォルトの名無しさん
2005/04/05(火) 16:11:180783ぱんつマニアアアアア ◆6Vxxv8cFbA
2005/04/05(火) 16:11:43Modal 論理、Conditional 論理、 Relevant 論理などである
0784デフォルトの名無しさん
2005/04/05(火) 16:12:02モダン焼きみたいなもんだろ
0785ぱんつマニアアアアア ◆6Vxxv8cFbA
2005/04/05(火) 16:12:34貴様等とは格が違う
ふぁふぁふぁふぁ
0786デフォルトの名無しさん
2005/04/05(火) 16:13:23それには同意
0787ぱんつマニアアアアア ◆6Vxxv8cFbA
2005/04/05(火) 16:15:39ところでこのスレッドに
Lambda Calculus
を完全に修得した者はおるか?
0788デフォルトの名無しさん
2005/04/05(火) 16:19:40http://wwwfun.kurims.kyoto-u.ac.jp/MtLambda.html
0789ぱんつマニアアアアア ◆6Vxxv8cFbA
2005/04/05(火) 16:20:05なあ、コテハン変えてもいい?
なんか発言といまいちマッチしないねん
0790ぱんつマニアアアアア ◆6Vxxv8cFbA
2005/04/05(火) 16:23:580791デフォルトの名無しさん
2005/04/05(火) 16:26:14このスレにいるならラムダくらい使うだろ。
「完全」ってのがどの程度かは知らんが。
>>789
このオレが名付け親になってやろう。
貴様は「フルーツジョッキー」だ。
0792ぱんつマニアアアアア ◆6Vxxv8cFbA
2005/04/05(火) 16:31:04君は Lambda 関数と Lambda Calculus を一緒にしていないか?
>このオレが名付け親になってやろう。
調子にのんなばか。
0793デフォルトの名無しさん
2005/04/05(火) 16:32:590794デフォルトの名無しさん
2005/04/05(火) 16:35:520795デフォルトの名無しさん
2005/04/05(火) 16:47:130796デフォルトの名無しさん
2005/04/05(火) 17:02:370797デフォルトの名無しさん
2005/04/05(火) 19:31:07でも番組が再開したら消えろよ。
0798デフォルトの名無しさん
2005/04/05(火) 19:47:240799デフォルトの名無しさん
2005/04/05(火) 20:07:26うんこイータアアアアアア でじゅうぶんだろ
0800800
2005/04/05(火) 20:23:47Forth意味不明だった
Forthはワード定義と制御構造が無茶苦茶汚くなる
やっぱ一貫性のあるLISPだよな
まあGCイラネって意味ではRPNも良いんだけどよ
0801デフォルトの名無しさん
2005/04/05(火) 21:39:55おまいのほうが意味不明だべ
0802800
2005/04/05(火) 21:43:02それに全然従ってねえってことよ
0803800
2005/04/05(火) 21:44:02括弧のネストがウザイけどな
0804デフォルトの名無しさん
2005/04/05(火) 22:10:470805デフォルトの名無しさん
2005/04/05(火) 22:30:35面白いだけだが。
0806デフォルトの名無しさん
2005/04/05(火) 22:32:140807デフォルトの名無しさん
2005/04/05(火) 22:32:40二次元構文って何がいいの?メリットがよくわからんのだけど。
0808デフォルトの名無しさん
2005/04/05(火) 22:45:23他人のプログラム読むときに変なインデントになってる心配がない。w
0809デフォルトの名無しさん
2005/04/05(火) 23:22:10空けっぱなしのような不安感がつきまとう。
0810デフォルトの名無しさん
2005/04/06(水) 00:57:01あんまりPythonやってるとCで書いてる時に閉じ忘れたり。
0811ぱんつマニアアアアア ◆6Vxxv8cFbA
2005/04/06(水) 11:28:13つまらん
0812デフォルトの名無しさん
2005/04/06(水) 20:28:46ここに、Lispの有用な例を書き込めばLispを知らしめることができるぞ
http://codezine.jp/a/default.aspx?cid=225
0813デフォルトの名無しさん
2005/04/06(水) 20:50:100814デフォルトの名無しさん
2005/04/06(水) 22:22:18こんなところで暴れてるのな。悲惨
0815デフォルトの名無しさん
2005/04/06(水) 22:26:15うんこだな
0816デフォルトの名無しさん
2005/04/06(水) 22:27:300817デフォルトの名無しさん
2005/04/07(木) 00:39:550818ぱんつマニアアアアア ◆6Vxxv8cFbA
2005/04/07(木) 14:20:26> 情報システム板で古典パンにやられてる屑コテハンが、
> こんなところで暴れてるのな。悲惨
吾はそんな板に出没したことはないぞ。
____________
"Self" is that which is in the process of becoming... --Zeno
Today's Lucky Number: 348
0819デフォルトの名無しさん
2005/04/07(木) 20:04:140820デフォルトの名無しさん
2005/04/07(木) 20:38:200821ぱんつマニアアアアア ◆6Vxxv8cFbA
2005/04/07(木) 20:43:32> ぱんつ以下略って2chぶらうざで書いてないのか?
いや、navichだな。
Reply-to:>>819
> 内容が無い言い訳をいちいちする辺り、奴とそっくり
その「奴」ってのは誰だ?
____________
If T is consistent, T !|- G_T.
0822デフォルトの名無しさん
2005/04/07(木) 20:49:45この業界にLISPの仕事はないよ。
0823ぱんつマニアアアアア ◆6Vxxv8cFbA
2005/04/07(木) 20:52:08Reply-to:>>822
いや、今のところ違うが。
____________
If T is consistent, T !|- G_T.
if T is ω-consistent, T !|- ¬G_T.
0824デフォルトの名無しさん
2005/04/07(木) 20:58:340825デフォルトの名無しさん
2005/04/07(木) 21:05:420826デフォルトの名無しさん
2005/04/07(木) 21:06:380827デフォルトの名無しさん
2005/04/07(木) 21:07:560828ぱんつマニアアアアア ◆6Vxxv8cFbA
2005/04/07(木) 21:10:14恐らくそれが一番楽であろう。
Reply-to:>>825
吾は Lisper ではないから Franz にはいかないであろう。
Computer Science でいくのであれば AI 系の会社に入るだろうね
なににしてもつまらん仕事はしたくない。
____________
If T is consistent, T !|- G_T.
If T is ω-consistent, T !|- ¬G_T.
0829デフォルトの名無しさん
2005/04/07(木) 21:17:37一週間に一度くらいはパンツ履き替えろよ
あと、signature風のその見苦しい虚栄心をなんとか白w
0830デフォルトの名無しさん
2005/04/07(木) 21:18:37キチガイ中年の今度のタ〜ゲットは、AIか。悲惨だなキチガイ粘着=パンツ
0831デフォルトの名無しさん
2005/04/07(木) 21:20:350832828の母
2005/04/07(木) 21:28:38頑張って、この粘着世界一位を目指して欲しいんです。
他は全然駄目だけど、馬鹿な子ほど可愛いって言うじゃないですか(涙
0833デフォルトの名無しさん
2005/04/07(木) 21:31:350834658
2005/04/08(金) 23:30:00って、道のりは遠いが。
Lispは
S式で何かデータを記述 → S式のデータを元に別のデータを出力
だと異様に生産性が高いね。
Paul Graham氏のViawebはそんな感じか?
0835デフォルトの名無しさん
2005/04/08(金) 23:58:04だよね。XMLの代わりにS式が流行ってたら俺たちの天下だったのにな。w
まぁちょちょいのちょいで変換できるからいいけどさ。
0836デフォルトの名無しさん
2005/04/09(土) 00:36:02`(,foo ,@bar ,(baz ))
0837デフォルトの名無しさん
2005/04/09(土) 00:46:05別にS式だから生産性が高いというわけではなくて、関数型の一般的な性質。
Lispは副作用もかけるけど。
0838デフォルトの名無しさん
2005/04/09(土) 01:14:01SGMLのスタイルシートの記述言語 は、Schemeだたーよ。
でも流行らなかった罠。
0839デフォルトの名無しさん
2005/04/09(土) 01:15:03例によって例のごとく、ズレまくった発言して、
フレーム議論でも始める準備ですか(呆
0840デフォルトの名無しさん
2005/04/09(土) 01:30:41ずれまくるのは仕様です。
なぜなら、最後の3レスぐらいしか読まないから。
0841デフォルトの名無しさん
2005/04/09(土) 03:08:200842デフォルトの名無しさん
2005/04/09(土) 03:17:07俺の仕様。3レスぐらいしか読まないっていう仕様。
0843デフォルトの名無しさん
2005/04/09(土) 03:23:290844デフォルトの名無しさん
2005/04/09(土) 03:38:04そやないよー。
コンピュータでの数値計算だって1/1+1/2+1/3+…の計算をするとき、実際には有限回の計算しかしないよね?
レスだって有限とは言えたくさんあるのでPart1から全て読むなんてことなんてしないもん。
俺は読む量がちょっと少ないだけ。
0845デフォルトの名無しさん
2005/04/09(土) 03:44:080846デフォルトの名無しさん
2005/04/09(土) 12:50:22fixnumは実装依存だからなぁ
0847デフォルトの名無しさん
2005/04/09(土) 14:05:590848デフォルトの名無しさん
2005/04/09(土) 14:06:560849デフォルトの名無しさん
2005/04/09(土) 14:50:55普通は10ビットか20ビットくらいあるはず
0850デフォルトの名無しさん
2005/04/09(土) 15:24:330851デフォルトの名無しさん
2005/04/09(土) 15:27:40たぶん平均3の正規分布になるだろうね。
0852デフォルトの名無しさん
2005/04/09(土) 15:29:56そーゆーときはbignumで対処しまつ
0853デフォルトの名無しさん
2005/04/09(土) 18:10:12誰かやってよ。
最強に生まれ変わるよ。
0854デフォルトの名無しさん
2005/04/09(土) 18:35:500855ぱんつマニアアアアア ◆6Vxxv8cFbA
2005/04/09(土) 18:40:37「何かが最強」であると考慮する時、それが何を相対として、
何について最強であるかが述べられていない場合、
その行為は全くもって無意味である。
____________
If T is consistent, T !|- G_T.
If T is ω-consistent, T !|- ¬G_T.
0856デフォルトの名無しさん
2005/04/09(土) 18:46:32多くのCommon Lispコンパイラは既にやっている。
もちろんdeclareがあればそっちを優先するけど。
0857デフォルトの名無しさん
2005/04/09(土) 18:47:25具体手にには何?
clispはやってますか?
0858デフォルトの名無しさん
2005/04/09(土) 18:51:17cmuclはやってるね。clispは中間言語コンパイラだからやってないかも。
0859デフォルトの名無しさん
2005/04/09(土) 18:56:53他には?
0860デフォルトの名無しさん
2005/04/09(土) 19:02:480861デフォルトの名無しさん
2005/04/09(土) 19:04:400862デフォルトの名無しさん
2005/04/09(土) 19:08:05今は「既にやっている」「多くのCommon Lispコンパイラ」を列挙する場面でつ
0863デフォルトの名無しさん
2005/04/09(土) 19:19:36今ソース読んでるけどcmuclのどの辺に型推論やってるとこある?
0864デフォルトの名無しさん
2005/04/09(土) 19:45:480865デフォルトの名無しさん
2005/04/09(土) 19:48:270866デフォルトの名無しさん
2005/04/09(土) 20:17:230867デフォルトの名無しさん
2005/04/09(土) 20:17:460868デフォルトの名無しさん
2005/04/09(土) 20:25:24cmucl自体やってるか疑わしい、と。
>>856がさっさと列挙してくれれば一番良いのですが。
0869デフォルトの名無しさん
2005/04/09(土) 20:29:39と、思う
0870デフォルトの名無しさん
2005/04/09(土) 20:32:16と思う。
0871デフォルトの名無しさん
2005/04/09(土) 20:36:29むしろ>>853の「最強」が気になる。
現存の全ての処理系に勝るには何をどのようにやればいいのかな?
0872デフォルトの名無しさん
2005/04/09(土) 20:37:220873デフォルトの名無しさん
2005/04/09(土) 20:37:460874デフォルトの名無しさん
2005/04/09(土) 20:43:38型推論とかあっても邪魔。
0875デフォルトの名無しさん
2005/04/09(土) 21:38:46型推論やると最強だよ派
多くのCommon Lispコンパイラは既にやっているよ派
cmuclはやっているよ派
cmuclのソース見てもやっているかわからないよ派
ドキュメントにはやってるって書いたあった希ガス派
はやく列挙しろよ派
多くのCommon Lispコンパイラは既にやっていると思うよ派
アレグロもやってると、思うよ派
認知されてない時点でやってないも同じだよ派
型推論いらないよ派
型推論は邪魔だよ派
0876デフォルトの名無しさん
2005/04/09(土) 21:58:18(型推論やると最強だよ派
(はやく列挙しろよ派)
(cmuclのソース見てもやっているかわからないよ派)
(認知されてない時点でやってないも同じだよ派))
(多くのCommon Lispコンパイラは既にやっているよ派
(cmuclはやっているよ派
(ドキュメントにはやってるって書いたあった希ガス派)))
(多くのCommon Lispコンパイラは既にやっていると思うよ派
(アレグロもやってると、思うよ派)))
(型推論いらないよ派
(Lispに型はいらないよ派
(型推論があっても邪魔だよ派))))
0877デフォルトの名無しさん
2005/04/09(土) 22:02:18(型推論いらないよ派
(既にLISPは最強ですが抜けてますよ派))
を追加するプログラムを作れよ派
0878デフォルトの名無しさん
2005/04/09(土) 22:08:34declareとかtheとかキショイよ派
0879デフォルトの名無しさん
2005/04/09(土) 22:13:340880デフォルトの名無しさん
2005/04/09(土) 22:14:000881デフォルトの名無しさん
2005/04/09(土) 22:14:060882デフォルトの名無しさん
2005/04/09(土) 22:15:470883デフォルトの名無しさん
2005/04/09(土) 22:15:570884デフォルトの名無しさん
2005/04/09(土) 22:19:210885デフォルトの名無しさん
2005/04/09(土) 22:41:210886デフォルトの名無しさん
2005/04/09(土) 23:44:55Gaucheとかはモジュール化機構があるよ派
0887デフォルトの名無しさん
2005/04/09(土) 23:48:040888デフォルトの名無しさん
2005/04/09(土) 23:51:20Scheme に飽きた Guy Steele が作ったのが Common Lisp だよね派
でもそのあと Guy Steele は Java にも加担しちゃったんだよね派
0889デフォルトの名無しさん
2005/04/10(日) 00:16:160890デフォルトの名無しさん
2005/04/10(日) 00:16:42あとは処理系の実装の違い。
0891デフォルトの名無しさん
2005/04/10(日) 00:17:090892デフォルトの名無しさん
2005/04/10(日) 00:19:28もし>>888に言っているのであればLisp全体とその方言のCommon Lispを混同してないか派
0893デフォルトの名無しさん
2005/04/10(日) 00:21:12CommonLispは言わば標準語。
0894デフォルトの名無しさん
2005/04/10(日) 00:28:41Common Lisp, Scheme ∈ {Lispの様々な方言}
0895デフォルトの名無しさん
2005/04/10(日) 00:31:02そう言い切られるとISO ISLISPが可哀想派
0896デフォルトの名無しさん
2005/04/10(日) 01:05:19っていうか自分で作ろうぜ派。
0897デフォルトの名無しさん
2005/04/10(日) 01:47:260898デフォルトの名無しさん
2005/04/10(日) 10:16:24↓
CommonLisp+-(Scheme)
↓
Common Lisp #
↓
?←これ何て呼ぶんだろう
0899デフォルトの名無しさん
2005/04/10(日) 10:59:380900デフォルトの名無しさん
2005/04/10(日) 14:30:29Dommonってなんだよw
そういうのはGガンダムで勘弁な。
0901デフォルトの名無しさん
2005/04/10(日) 14:56:47CommonLisp不要になるんだよね。
結局わざわざCommonLisp使う理由ってパフォーマンス以外にないから。
Biglooみたいなやつから発展しないかなあ。
0902デフォルトの名無しさん
2005/04/10(日) 15:41:17Gacuheの次期バージョンではコンパイラ(っていうかCへのトランスレータ)
が実装される予定だからパフォーマンス的には期待できるかも。
0903デフォルトの名無しさん
2005/04/10(日) 16:01:06それよりも、最近の流行としては HotSpot みたいに実行時のプロファイルを使った
動的コンパイル&動的最適化かも。誰か挑戦しない?
0904デフォルトの名無しさん
2005/04/10(日) 17:39:38Robert G. Burger and R. Kent Dybvig
International Conference on Computer Languages
0905デフォルトの名無しさん
2005/04/10(日) 20:49:04あぁ〜、これだから初心者は・・・。
最初に「型変数」を実装した実装系は、
CommonLispコンパイラ。
当然、型推論も一部行っている。
0906デフォルトの名無しさん
2005/04/11(月) 03:41:35Gaucheの次期バージョンで限定的に実装されるCへのトランスレータは、
VMコードをCのベクタに落とすだけなので、性能には寄与しないでしょ。
コンパイルが省略できるぶん少し早くなるだろうけど。
0907デフォルトの名無しさん
2005/04/15(金) 01:18:370908デフォルトの名無しさん
2005/04/15(金) 01:26:38http://www.kumamoto-u.ac.jp/
反撃したいやつは、VIP板に集合
http://ex10.2ch.net/news4vip/index.html
0909デフォルトの名無しさん
2005/04/15(金) 02:34:150910デフォルトの名無しさん
2005/04/15(金) 03:41:05ちゃんとエンドロールに名前も出ていた。
セリフもあった。
0911デフォルトの名無しさん
2005/04/15(金) 03:57:470912デフォルトの名無しさん
2005/04/15(金) 08:32:32Gaucheの作者であるかわいさんが出演してたのです。
0913デフォルトの名無しさん
2005/04/15(金) 11:34:27へぇ〜。つか、そういう面白いことは放送前に教えてくれよ。
0914デフォルトの名無しさん
2005/04/15(金) 17:01:01Common Lisp Hyper Specが更新されてましたよ。
http://www.lispworks.com/documentation/HyperSpec/index.html
0915デフォルトの名無しさん
2005/04/15(金) 20:02:59( ゚д゚)ナニー!?
>>913同様に、そういう事は早く言えよ。
0916デフォルトの名無しさん
2005/04/15(金) 23:10:460917デフォルトの名無しさん
2005/04/16(土) 00:03:34Common Lisp HyperSpecは変更点がよくわかんないけどダウンロードしとこ。
関係ないけどLispWorks 4.4のPersonal Editionまだ来ないね。
ILC2005行けばEnterprise Editionの評価版貰えるかも知れないけどウェブサイト
見る限りじゃちゃんと準備が進んでいるのかあやしげな悪寒。業務で行くのは無理か。
0918デフォルトの名無しさん
2005/04/20(水) 22:01:48lispの方言(librep)でも使えるものってありませんか?
0919デフォルトの名無しさん
2005/04/21(木) 02:17:59本来そういった文字セットとかを超越した所にS式は存在するべきなんだよ
0920デフォルトの名無しさん
2005/04/21(木) 02:25:22青いな
0921デフォルトの名無しさん
2005/04/22(金) 01:28:15syntax-rulesで作成したマクロは通常define-syntaxで
シンボルにバインドしているようですが、なぜdefineでは
いけないのでしょうか?試してないけどそれもアリ?
ひょっとしてマクロとそれ以外のオブジェクトとで
異なるScopeを持たせたいってことでしょうか?
0922デフォルトの名無しさん
2005/04/22(金) 01:41:50試してみましたが、やはりdefineではエラーになります。
defineを使ってマクロをシンボルにバインドするような実装も
可能だと思うのですが。
そうした場合、どういう不都合がありますか?
0923デフォルトの名無しさん
2005/04/22(金) 03:40:28define はあくまで変数を定義してそれに値を与える(たまたま値がラムダ式であれば
関数を定義したことになる)だけです。マクロは文法上、変数ではないので define で
定義するのは一貫性を欠くことになります。また define-syntax はトップレベルでしか
使えないなど、制約事項も異なります。
0924デフォルトの名無しさん
2005/04/22(金) 04:00:48あと、コンパイルと実行が別々になっている場合、マクロはコンパイル時に
展開するのが普通だから、マクロ定義と通常の束縛とが区別できる形に
なってないと困る、ってのもある。
0925デフォルトの名無しさん
2005/04/22(金) 21:34:00逝けってば。
早く逝けっつってんの。
0926デフォルトの名無しさん
2005/04/22(金) 21:45:25LISPの偉大さ心に染みた。
0927デフォルトの名無しさん
2005/04/22(金) 21:47:220928デフォルトの名無しさん
2005/04/23(土) 05:09:270929デフォルトの名無しさん
2005/04/23(土) 06:01:09(_|_)
↑この顔文字?の意味がわからん。
0930デフォルトの名無しさん
2005/04/23(土) 06:09:100931デフォルトの名無しさん
2005/04/23(土) 08:55:29921です。ありがとうございます。
コンパイラの場合、話はわかりやすいですね。
インタプリタの場合はどうでしょうか?
(実装依存、という話ではなく、どのようにあるべきか、です)
たとえば
(define-syntax some-operation (syntax-rules ...) ;;マクロ
(define some-operation (lambda ...) ;;手続き
とした場合、
(some-operation ...)
という呼び出しは、やはりマクロ定義のほうを優先するのが順当なのでしょうか。
ただし、呼び出し時の字面は全く同じだと仮定します。
0932デフォルトの名無しさん
2005/04/23(土) 09:22:25同じように実行できるのがいちばんいいんじゃないの。もっともこれは
Lispが随分苦労してきた問題で、いまだにすっきりした解決は無いと
思うけど。(comp.lang.schemeあたりで、マクロと分割コンパイルの
話題を探すと色々出てくると思う)
マクロと手続き、両方定義したらどうなるかっていう話は、綺麗な仕様は
無いような気がする。ナイーブに上から実行してくインタプリタなら
後から出てきた方が上書きしちゃうだろうけど、例えば別ファイルで
some-operationにset!されたらどうなるかとか。921は何かアイディアがあるのか?
0933デフォルトの名無しさん
2005/04/23(土) 09:59:05>921は何かアイディアがあるのか?
何もありません。ただ、R5RSをみても、define-syntaxの説明があまりにも
簡略でdefineとの関係がよくわからなかったのでおたずねしました。
Scheme勉強中なのでできるだけ実装系に依存しない理想的な挙動をイメージ
しておきたかったのですが、
[1]コンパイラなら話は簡単(924のように)
[2]インタプリタでもコンパイラと同じ挙動が期待される(932のように)
[3]ナイーブに上から実行してくインタプリタなら後から出てきた方が上書き(932のように)
ということですね。
931に挙げた例だと[2]と[3]とは矛盾することになりますが、
[2]は人間様にとって実装によらず常に同じ結果を返すようにするように期待したもので、
本来の「自然な」Schemeの振る舞いは[3]のほうである、と理解しました。
しかし、もし[3]の立場をとるとすると、define-syntaxとdefineとは同じscopeを
共有することになり、define-syntaxの存在意義がよくわかりません。
>>923さんは「マクロは文法上、変数ではない」と書かれましたが、
マクロを変数に「バインドする」ことならやってもよいのでは?(初心者です)
define-syntaxでなければできないことって、何かありますか?
具体的な例をいただければ理解できると思います。
0934デフォルトの名無しさん
2005/04/23(土) 10:12:27人間様にはR5RS schemeのdefine-syntaxは理解できません・・・
初心者です・・・
0935デフォルトの名無しさん
2005/04/23(土) 10:14:28具体的な例をいただけないと理解できんとです・・・
初心者です・・・
0936デフォルトの名無しさん
2005/04/23(土) 10:16:56コンパイラの存在なしで話をしようとしていたのが誤りだったのかも。
結局Schemeといえども単なる言語処理系であって、形而上学的な理想像を
追い求めてはいけない、ということでしょうか。
0937デフォルトの名無しさん
2005/04/23(土) 11:23:16私も初心者だけど、defineとdefine-syntaxは概念として全然違うものだと思うので、
なんでそんなにしつこく同一視できると思うのかよくわからない。
ただ、うまく説明できるほどには習熟してないのでもどかしい。
あえて説明を試みるならdefineは実行環境が持っている保存領域になんかいれるもので、
define-syntaxはコンパイラ(インタプリタ)に覚えさせる指示ってカンジ?
Cでいうならステートメントや式とコンパイラディレクティブの差みたいなもの。
変なこと言ってたらスマソ。
0938デフォルトの名無しさん
2005/04/23(土) 11:36:35変数値として「マクロ」を認めてしまうと、当然実行時の動的な値に従うべきということに
なるので、実際問題としてコンパイラを作るのが非常に難しくなってしまうよね。
文法上「マクロ」は通常の Scheme の実行環境の「外側」にあると考えられるわけ。
マクロ展開時の「実行時環境」を考えたくないので、手続き的な方法ではなく宣言的な
方法での定義を強制させているのだろうね。
でも、個人的には危険が危ないがなんでもできる Common Lisp 風のマクロのほうが
好きだったりするのだが。w
0939デフォルトの名無しさん
2005/04/23(土) 12:29:09>>937
>Cでいうならステートメントや式とコンパイラディレクティブの差みたいなもの。
>>938
>文法上「マクロ」は通常の Scheme の実行環境の「外側」にあると考えられるわけ。
なるほどね。
個人的には、SchemeのマクロはCのプリプロセッサ的なものと理解しました。
かなり納得。
0940デフォルトの名無しさん
2005/04/23(土) 12:36:10となると、やはり933の[3]的な考えは正しくなく、どのような場合でも、
まずマクロ展開が行われてから、通常の評価が行われる、ということになりますね。
ふむふむ、納得。
間違っていたらご指摘ください。
0941デフォルトの名無しさん
2005/04/23(土) 12:55:21むしろ、仮に [3] のような処理系であっても結果がなるべく同じになるように考えて
define と define-syntax を分離していると考えることもできる(ような気がする)。
0942デフォルトの名無しさん
2005/04/23(土) 13:50:55未定義
0943デフォルトの名無しさん
2005/04/23(土) 22:49:26何かありますか?
javaでは面倒な処理をLispで書けが生産性があがる気がするのですが。
0944デフォルトの名無しさん
2005/04/24(日) 00:07:51最近のは試してないけど kawa はいかが?
http://www.gnu.org/software/kawa/
0945デフォルトの名無しさん
2005/04/24(日) 00:27:250946デフォルトの名無しさん
2005/04/24(日) 00:41:53schemeでシンボルといったら'nameで表されるようなオブジェクト、または
それらの型を言う場合が多い。あなたが言っているものは名前とか識別子と
呼ぶのが適当だ。もし混同していたのなら、これを機に復習してくれ。
識別子には種類が二つあって、それは(defineやlambda式で導入される)変数名
と(define-syntaxやlet-syntaxで導入される)構文キーワード名だ。
これらは同じ名前空間で管理される(別の言い方では同じスコープ規則に
従う)が、扱いは別。
(932が言っているのは、ソースファイルとかモジュールというような概念が
定義されてないschemeにおいて、それらをどう扱うかという話。)
>>933
[1], [2], [3]はなんというか視点がずれてる。
コンパイラ、インタープリタ問わず処理系は (some-operation ...) を処理
するときには二つのsome-operationのバインドのうちどちらかしか見えない
ので、その式を処理する方法は常に一つしか存在しない。
つまり、some-operationを変数名だとみなしたら手続き呼び出しだし、
構文キーワード名だとみなしたらマクロ展開だ。
そういった訳で、940でのあなたの理解は大まかには正しいということに
なる。マクロ展開が先に行なわれるというよりは、マクロ呼び出しだったら
展開するしか処理方法がないということね。
ちなみに通常は、トップレベルで二重に定義された名前は後から定義した方
が以前の定義を(概念的に)上書きするので、 (some-operation ...) は
マクロ呼び出しとして処理することになる(この辺はschemeの仕様書で探して
みたが明確な記述はなかった)。
0947デフォルトの名無しさん
2005/04/24(日) 00:45:51>>943
ttp://home.comcast.net/~bc19191/blog/040627.html
0948946
2005/04/24(日) 01:10:26> (some-operation ...) はマクロ呼び出しとして処理することになる
...は手続き呼び出しとして...
読み返してみると日本語ムチャクチャだな...
0949デフォルトの名無しさん
2005/04/24(日) 01:18:04gj
0950デフォルトの名無しさん
2005/04/24(日) 01:41:290951デフォルトの名無しさん
2005/04/24(日) 14:06:480952デフォルトの名無しさん
2005/04/24(日) 18:05:00faslは見つけたんだが、require出来ん。
Trialでは無理なのかな?
これでjavaコード全部書いてやろうと思ってたんだが。
0953デフォルトの名無しさん
2005/04/25(月) 23:29:380954デフォルトの名無しさん
2005/04/26(火) 00:54:26>>946
>もし混同していたのなら、これを機に復習してくれ。
なるほど。ご指摘ありがとうございます。
>some-operationを変数名だとみなしたら手続き呼び出しだし、
> 構文キーワード名だとみなしたらマクロ展開だ。
結局、手続きとマクロ展開とはつくられたときから全く別の
ものであり、参照のためにそれぞれ変数名や構文キーワードに
関係づける際に、それぞれdefineとdefine-syntaxを使う、と
理解しました。
ただし、
>「これらは同じ名前空間で管理される(別の言い方では同じ
>スコープ規則に従う)
わけですね。
そうすると、マクロと手続きとは並列的な関係にあるオブジェクトであって、
>>946さんは婉曲に
>そういった訳で、940でのあなたの理解は大まかには正しいということに
>なる。
なんて書いてくださいましたが、私が>>939-940で納得していた
「Cプリプロセッサ的解釈」はちょっと違いますね。
compiler(およびそれと整合的なシステム)は、実行時に
マクロ展開を選択的に優先して実行するようなシステムだと
思えばいい、ということで、今度こそ納得できた気がします。
0955デフォルトの名無しさん
2005/04/26(火) 01:03:46ちなみにcompilerそのものの場合には
コンパイル時にマクロ展開するので、
最後のくだりの中で
>実行時に
が不要であることはわかってます。
0956デフォルトの名無しさん
2005/04/26(火) 01:08:10キミの理解はあってると思うけど、
キミの文章は色々不要な事を言い出しちゃってて、
コミュニケーションに難がある、と思う。
このような文章を書くあなたは学生さんだと思うが。
テストの回答で、余計な事書くと減点されるって知ってるよね?
今の君のコミュニケーションは、正にそれ。くどい。
0957デフォルトの名無しさん
2005/04/26(火) 01:10:05あるいは、
正解わからずに、解答欄に三つも四つも解を書いて、
数撃ちゃ当たるだろう、という傲慢な態度が見え隠れしている。
0958デフォルトの名無しさん
2005/04/26(火) 01:15:54>>956-957
勉強します。
0960デフォルトの名無しさん
2005/04/26(火) 23:12:08Vielen Dank!
0961デフォルトの名無しさん
2005/04/27(水) 23:44:00もつろんSchemeでさ
0962デフォルトの名無しさん
2005/04/28(木) 10:27:230963デフォルトの名無しさん
2005/04/28(木) 12:50:350964デフォルトの名無しさん
2005/04/28(木) 21:49:260965デフォルトの名無しさん
2005/05/04(水) 22:29:16Schemeでマクロを使わず、オブジェクト指向の継承をやるにはどうすればいいですか?
(define (make-object x y)
(let ((v (make-vector (* x y) 0)))
(lambda (method . args)
(cond
((eq? method 'print)
(display v)(newline))
((eq? method 'set!)
(set! v (car args)))))))
で内部にx,y,vの変数を持つオブジェクトが作れるわけですが、
Javaの継承みたいに変数やメソッドを増やすとか、メソッドのオーバライドってできますか?
0966デフォルトの名無しさん
2005/05/04(水) 22:37:30まずは「どういうセマンティクスなのか」だろ。あとは内部表現次第でどうとでもなる。
マクロは、要は見た目を整えてるだけなんだから、マクロを使いたくなければ
それが展開された形で長々ズラズラと書き連ねればいいだけ。
0967デフォルトの名無しさん
2005/05/04(水) 23:52:44その方法だと
(define (make-object x y . super)
(set! super (if (pair? super) (car super)
(lambda args (error "Unknown method " args))))
:(略)
(else (apply super (list* method args]
という風に修正してやれば継承ぐらいならできるんじゃね?
しかし、つらつらeq?でシンボルと比較しながらメッセージディスパッチ
してたんでは実験程度にしか使いたくないよな。
せめてCでのswitch程度の方法が欲しい。
0968デフォルトの名無しさん
2005/05/05(木) 00:19:05> せめてCでのswitch程度の方法が欲しい。
case
0969デフォルトの名無しさん
2005/05/05(木) 00:26:08caseもifに変換するマクロって場合が多いし、
そういうのは結局eq?で比較してる。
シンボルからテーブル引くような事で分岐さす処理系あるかなあ?
0970デフォルトの名無しさん
2005/05/05(木) 00:42:47> シンボルからテーブル引くような事で分岐さす処理系あるかなあ?
具体的にどの処理系でやってるという情報は持っていないが、言語仕様上 case は
テーブル引きへコンパイルできるように設計されているように見える。
0971デフォルトの名無しさん
2005/05/05(木) 00:54:30プロトタイプベースが使えるやつ。
前見たときは保守もされてないし、
インタプリタだろうから速度は全く期待できない。
まあ965みたいなの1から作るよりかはマシかも。
まともに使いたいならSTkがいいんじゃないかな。
CLOS風になるけど。
0972965
2005/05/05(木) 11:32:21継承までやると簡単な方法はないようですね。
BOSとかソース読んで見ますわ。
0973デフォルトの名無しさん
2005/05/06(金) 04:06:41んーいや、難しいっていうか面倒。マクロ使わないと。
>>966 も言っているけれど、要はマクロ使わない=マクロの展開形をいちいち書く、なので。
プロトタイプ型でよかったらこんなのがある。簡潔なので目を通してみては。
ttp://www.ping.de/~flori/flott/exe/session/project/scheme/poops
0974デフォルトの名無しさん
2005/05/07(土) 03:06:48http://tabesugi.net/memo/2005/51.html#051425
言われてみれば,なるほどなぁ,である.
0975デフォルトの名無しさん
2005/05/07(土) 05:09:45(defun gl-define-primitive (mode func)
(unwind-protect (progn (glBegin mode)
(funcall func))
(glEnd)))
(gl-define-primitive GL_POLYGON
(lambda () ...))
こう書くかなあ。てことはPythonでも
def gl_define_primitive(mode, func):
try:
glBegin(mode);
func();
finally:
glEndEnd();
gl_define_primitive(GL_POLYGON, lambda : ...);
こんな感じでいけるんじゃないの?
0976デフォルトの名無しさん
2005/05/07(土) 05:32:08(call-with-... ) という形の高階関数と (with-... ) という形のマクロを同時に用意するのが普通でしょ
0977デフォルトの名無しさん
2005/05/07(土) 06:19:23でも Python って将来的に lambda なくなるんじゃなかったっけ?
block 構文を導入するとか何とかって話もどっかで見た記憶があるけど。
なんか微妙臭かったよなあ。
lambda は必要以上に何でもありすぎるって思想なのかね。
0978デフォルトの名無しさん
2005/05/08(日) 05:34:59初心者には意味不明だという意見が多かっただけだったり。
JavaScriptみたくfunctionにでもすりゃよかったのにね。
もちろんセマンティクスも。
0979デフォルトの名無しさん
2005/05/08(日) 09:17:44Lispちょっと知ってて、その後Python入ったクチだけど。
Pythonのlambda中途半端すぎ。
どのくらい中途半端かというとN88-BASICのDEF FN並。
あれが未だに残ってることがよく解らん。
Pythonは好きなんだけどねぇ。
0980デフォルトの名無しさん
2005/05/10(火) 11:34:26950超えると,いつ落ちてもおかしくないし.
0981デフォルトの名無しさん
2005/05/11(水) 03:01:06テンプレに付け加えることってなんかあるかね。
0982デフォルトの名無しさん
2005/05/11(水) 04:11:27>>944は入れてもいいかも
Javaで書いたLispなどのリンク集
http://home.comcast.net/~bc19191/blog/040627.html
0983デフォルトの名無しさん
2005/05/11(水) 11:16:49時間ができたら,過去スレのトピックをまとめたいと思っているので.
------------------------------------------------------
35 :flatline@Vim%Chalice ◆r6EONKKhcc :04/02/03 19:10
#http://www.komaba.utmc.or.jp/~flatline/wiliki.cgi
いつまで存在するか保証はしません
0984デフォルトの名無しさん
2005/05/11(水) 19:15:590985デフォルトの名無しさん
2005/05/12(木) 09:56:01(define !
(lambda (n)
(if (= n 1)
1
(* n (! (- n 1))))))
は、末尾再帰になっているのでしょうか?
末尾部分に!だけでなく、*があるけれども、という意味です。
初歩的な質問で申し訳ない。
0986デフォルトの名無しさん
2005/05/12(木) 10:15:28(define (! n)
(let loop ((n n) (r 1))
(if (= n 1) r (loop (- n 1) (* r n)))))
0987デフォルトの名無しさん
2005/05/12(木) 10:15:45簡単に答えると、末尾再帰になってないです。
*を計算する為に(! (- n 1))から戻ってきてもらう必要があるからです。
0988末尾再帰版
2005/05/12(木) 10:28:21(lambda (n) (fact-tailrecursion n 1)) )
(define fact-tailrecursion
(lambda (n prod)
(if (= n 1)
prod
(fact-tailrecursion (- n 1) (* prod n)) ) ) )
0989デフォルトの名無しさん
2005/05/12(木) 10:42:33(lambda (n)
(letrec ((fact-tailrecursion
(lambda (n prod)
(if (= n 1)
prod
(fact-tailrecursion (- n 1) (* prod n)) ) ) ))
(fact-tailrecursion n 1) ) )
上記の末尾再帰は、下記のiterationと等価。
(define fact-iteration
(lambda (n)
(do ((n n (- n 1))
(prod 1 (* prod n)) )
((= n 1) prod) ) ) )
0990985
2005/05/12(木) 20:05:26末尾再帰ならSchemeで内部的にiterationに変換されて処理
されるはずなのに >>985 のコードでnを大きくするとStack
Overflowエラーが出たのでおたずねしました。
処理系としては、985のようなコードを内部的にiterationに
変換したりせず、忠実にコードのアルゴリズムに従うほうが
正しいのでしょうね。
ちゅうか、そういう変換が常に可能とは限らない、か。
0991デフォルトの名無しさん
2005/05/12(木) 20:08:58あの頃の自分はなんてアホだったんだろうって
0992985
2005/05/12(木) 20:11:03ううむ。返す言葉もない。
0993デフォルトの名無しさん
2005/05/12(木) 20:21:100994デフォルトの名無しさん
2005/05/12(木) 20:44:230995デフォルトの名無しさん
2005/05/12(木) 21:05:092分くれ。
駄目だったら何も書かない。
0996デフォルトの名無しさん
2005/05/12(木) 21:33:40俺は何もしない。
0997デフォルトの名無しさん
2005/05/12(木) 21:51:17CommonLisp Scheme Part13
http://pc8.2ch.net/test/read.cgi/tech/1115901841/l50
0998デフォルトの名無しさん
2005/05/12(木) 22:06:380999デフォルトの名無しさん
2005/05/12(木) 22:35:10(display "ume"))
1000デフォルトの名無しさん
2005/05/12(木) 22:45:3010011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。