LISP Scheme
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん
NGNG0002デフォルトの名無しさん
NGNG(lambda (init)
(let loop ((var init))
...(if (...) x)
... (loop (- var 1))))
こういうループをxの時点で中断したいんだけど、何か良い手段はありますか?
00032
NGNG0004デフォルトの名無しさん
NGNG次に読むべき本を教えてください。
本屋に逝って探してみたけど、Lisp系の本って少ないねー。
0005デフォルトの名無しさん
NGNG(lambda (init)
(let loop ((var init))
(if (...)
x
(loop (- var 1)))))
(display "上のようにすると(...)が#tだとループを抜けて
xが返されるけど。")
(newline)
0006デフォルトの名無しさん
NGNG今だと図書館とかの方が揃うと思います。大学や専門の購買とか。
ちょっと前、〜(なんとか)LISP言語 第3版 (上・下2冊 緑色の表紙)
っての借りて読んだけど、CommonLispも含めてかなり詳しく載っていました。
下巻(応用)は難しくて良く分かんなかったけど(汗
0007デフォルトの名無しさん
NGNGSchemeでよければ、
「プログラミング言語の構造と解釈 第2版」は?
00082
NGNGなるほど。loopをifスコープ(?)の中で書いても良かったんですね。
有難うございます。
SchemeにはC言語でいうbreak/continueとかが無いみたいなんで困ってました。
(継続使えとか言われそうですが)
00092
NGNG(define for (lambda (start end body)
(call/cc (lambda (break)
(letrec
(
(loop
(lambda (i)
(if (< i end)
(begin
(call/cc
(lambda (continue)
(body i break continue)))
(loop (+ 1 i))))))
)
(loop start))))))
00102
NGNG(for 0 10
;body
(lambda (i break continue)
(cond
((= i 7) (break))
((odd? i) (printf "i=%d o" i))
(else (printf "i=%d e" i))
)
(if (= i 3)
(continue))
(newline)))
00112
NGNG(まだインデントの付け方もよくわからない・・)
0012デフォルトの名無しさん
NGNG0013>12
NGNG0014>4
NGNG昔、古本屋で300円だったんで買ったんだけど。
あんまり良い本じゃないかも
Lispプログラミング 中山隆 杉山武司 オーム社 ISBN4-274-07377-7
これも古本屋で450円だったんで買ったんだけど。
あんまり良い本じゃない
どっちもCommonLisp以前の時代の本みたい。
大きい図書館いった方が早いかもね。
それと、Schemeならインターネットで日本語の資料結構揃いますよ。R
0015>4
NGNGhttp://www.sci.toyama-u.ac.jp/~iwao/Scheme/scheme.html
こっから色々収集できます。
001615
NGNGSchemeは(比較的)良く見つかるんだけど
0017デフォルトの名無しさん
NGNGLisper への道
http://www.geocities.co.jp/SiliconValley-Oakland/1680/rakup.html
0018デフォルトの名無しさん
NGNGいまいち読みやすくなりません。
本とかで見かける、
(expr ()
(let
((var...
))
))) ;←この最後にまとめて閉じ括弧付けるのも納得いかないし。
やっぱ中括弧'(' ')'だけだから読みづらいでしょうね。
なんとかならないもんでしょうか
0019デフォルトの名無しさん
NGNGまったく同感です。情報も少なすぎです。
Windowsでも動くFreeソフトのCommonLISPはありませんか?
日本語がきちんと動く奴。
(reverse '(あ いうえ おか))→(おか いうえ あ)
と文字化けしないで、きちんと評価される奴。
チェックボックスなどのコントロールも容易に操作できる奴があるといいんですが?
どこへ行っても無さそうなので、今はXLISP-STATを使っています。
Schemeは一応パソコンに積んで有りますが、defunの使い方がLISPと違うようなので使っていません。
0020デフォルトの名無しさん
NGNGxyzzyはいかがですか?
0021デフォルトの名無しさん
NGNGありがとう。早速、試してみます。
VBのエディタにもなっているらしいので結構いいかも。
0022#f
NGNGつーことで、emacsを使わないと lispは読めない体に。
M-C-f とかないと。
括弧を入れ子ごとに色変えてくれるのとかあったけど、今一つ..
0023デフォルトの名無しさん
NGNGGNU Common LISPは、元々日本人が作った処理系(らしい)なので
シンボル名に日本語が使えるような気がします。(未確認です・・)
0024デフォルトの名無しさん
NGNGMLもあるみたいだし。
http://www.jsdlab.co.jp/~kei/xyzzy/
http://www.netlaputa.ne.jp/~henmi/lisp/xyzzy/
0025デフォルトの名無しさん
NGNGhttp://www.geocities.co.jp/SiliconValley-Oakland/1680/xyzzy_lisp.html
0026デフォルトの名無しさん
NGNGSchemeのdefineはLISPのdefunとたいして変わらないと思います。
(define proc (lambda (param...) body)または
(define (proc param...) body)
(define sym body)
LISPにあるauxとかoptやらはありませんけど。
その他、LISPの(setq 〜)の代わりに(define 〜)、
破壊操作は(〜!)とか。
rplaca→set-car!
rplacd→set-cdr!
(〜p )→(〜? )
progn→begin
など
0027デフォルトの名無しさん
NGNG試したところ日本語シンボルOKだった。GCL 2.2.1。
もとになったKyoto Common LISPを作った萩谷先生の文章が
他のスレで紹介されてた。
0028デフォルトの名無しさん
NGNGsetqの代わりはset!……
0029デフォルトの名無しさん
NGNG(item next prev)というリンクを作ると、リストが巡回構造になって
このままだとリストがまともに表示されなくて困ってます。
こういう場合、どういう風に作るのが良いんでしょうか。
次にSchemeのソース載せます。
003029
NGNG(list 'define (cadr l) ''(() ()))))
(define (que-createitem item next prev)
(cons item (cons next prev)))
(define (que-front list) (car list))
(define (que-back list) (cadr list))
(define (que-setfront list link) (set-car! list link))
(define (que-setback list link) (set-car! (cdr list) link))
(define (que-next link) (if (null? link) '() (cadr link)))
(define (que-prev link) (if (null? link) '() (cddr link)))
(define (que-setnext link next) (set-car! (cdr link) next))
(define (que-setprev link prev) (set-cdr! (cdr link) prev))
003129
NGNG(let
( (old (que-front list))
(new (que-createitem item '() '()))
)
(que-setprev new old)
(if (null? old)
(que-setback list new)
(que-setnext old new))
(que-setfront list new)
(car new)))
(define (que-pop list) ; as item
(let ((old (que-front list)))
(if (null? old)
#f
(begin
(if (eq? old (que-back list))
(que-setback list '()))
(que-setfront list (que-prev old))
(if (not (null? (que-prev old)))
(que-setnext (que-prev old) '()))
(car old) ;item
))))
003229
NGNGで、
(create-que dlist)
=>dlist
(que-push dlist 'a)
=>a
(que-push dlist 'b)
=>b
;ここでdlistをうっかり表示させてしまうと出力の無限ループ
;になってしまう。
dlist
=>(b () a (b () a (b () a (b () a (b () a (b () a (b ....
これをなんとかしたいんです。
003329
NGNGdlist : (front back)
link : (item (next . prev))
です。
0034Sage
NGNG「しぇーめ」だと思ってた……。
http://www.stdio.h.kyoto-u.ac.jp/~hioki/gairon-enshuu/SchemeNotes/scheme.html
0035いつでもどこでも名無しさん
NGNGつーか普通の処理系は表示するとき nest levelで制限してない?
003629>35
NGNG自作物なのでなんの制限もかけてなかったり(汗
0037デフォルトの名無しさん
NGNGシンタックスシュガー(?)として'[' ']'を使う書き方がある様ですね。
正式名称知りませんが。
・[a]は(a)と同じ意味。
・[は(と同じ様にネストできる。'(a (b (c [d (e [f]]] => (a (b (c (d (e (f))))))
・[を置いておくと、)が閉じてない場合]の位置で強制的に[に対応するまで閉じる。
・対応しない]がある場合、閉じてない'('括弧を全て閉じる。
って解釈でいいのかな。(自身なし
003837
NGNG(define (que-pop list) ; as item
(let [(old (que-front list]
(if (null? old)
#f
(begin
[if [eq? old (que-back list]
(que-setback list '()]
[que-setfront list (que-prev old]
[if [not (null? (que-prev old]
(que-setnext (que-prev old) '()]
(car old]
うーん、括弧の対応付けが判って多少は良くなったかな?
ただ、初めて見る人にとっては、「なんじゃこりゃ?」って印象でしょうね・・(汗
0039デフォルトの名無しさん
NGNGpp するときには普通の表示が良いなあ。
004037
NGNGttp://www.asahi-net.or.jp/~LI6S-YSMR/argovent/argove14.html
「超括弧」
ttp://plaza10.mbn.or.jp/~lisp/intro.htm
検索でそれぞれ一件づつ引っかかりました。
あんまりないのかな
英語だとsuper brace?(でも見つかりませんでした
>>39
ppというか、readの段階で普通の()に変換されれば問題無いかと。
0041デフォルトの名無しさん
NGNG正直()だけだと見づらい。
こういうの突き詰めてくとM言語っぽくなる?
0042デフォルトの名無しさん
NGNG0043デフォルトの名無しさん
NGNGさっそく、使ってみました。うーむ。これは、かなり強力なエディタですね。
日本版Emacsといった感じ。どうもありがとう>20、24
0044デフォルトの名無しさん
NGNG0045デフォルトの名無しさん
NGNG線形リストをバランス木(AVL木など)に変換する方法を考えています。
英語のホームページを片っ端から調べてみても見つかりませんでした。
お分かりになる方はよろしくお願いします。
0046デフォルトの名無しさん
NGNG臭い爺?
0047デフォルトの名無しさん
NGNG妻子と読むのですといいですね。
004844
NGNGマクロってこういうことだったのね。
リスト生成→生成したリストを再評価
(define-macro マクロ定義 (lambda (l) (cons 'define-macro (cdr l]
(マクロ定義 λ (lambda (l) (cons 'lambda (cdr l]
(マクロ定義 もしもだよ (λ (l)
(list 'if (cadr l) (caddr l) (cadddr l]
(もしもだよ (< 0 1) #t #f)
=>#t
0049>45
NGNGあとは、
http://www.cs.indiana.edu/scheme-repository/SRhome.html
http://www.cs.cmu.edu/afs/cs.cmu.edu/project/ai-repository/ai/lang/scheme/0.html
この辺にコードが大量にある様です。(B-Treeとか見かけました)
0050>45
NGNG0051デフォルトの名無しさん
NGNGCの#defineと同じだよ。
機能がむちゃ強力なだけ。
FORTRAN表記をLispに直せちゃうくらい強力だが…
005244>51
NGNGマクロの引数の解釈に手間取りましたが(汗
(car l) => もしもだよ
(cadr) =>(< 0 1)
(caddr) =>$t
(cadddr) =>$t
構文拡張した気分になれます。
if->もしもだよみたいな単純なsyntax名の置き換えなら
(マクロ定義 もしもだよ (lambda (l) (cons 'if (cdr l]
で良いみたいですが。
005344
NGNG日本語Schemeなんかも無理なく作れますね(汗
(マクロ スタック生成 (λ (仮引数)
(リスト '定義 (かあだ 仮引数) ''()]
(マクロ 積む
(λ (仮引数)
(リスト '更新! (かあだだ 仮引数)
(リスト 'コンス (かあだ 仮引数) (かあだだ 仮引数]
(マクロ 捨て
(λ (仮引数)
(リスト '並列レット
[リスト (リスト '捨てるモノ (かあだ 仮引数]
(リスト 'もしもだよ (リスト 'ぬる? '捨てるモノ) 偽
(リスト '複文
[リスト '更新! (かあだ 仮引数) (リスト 'くだ '捨てるモノ]
(リスト 'かあ '捨てるモノ]
;test
(表示 'スタックのテスト)(改行)
(スタック生成 a)
(表示 a)(改行)
(表示 (積む 'x a))(改行)
(表示 (積む 'y a))(改行)
(表示 (積む 'z a))(改行)
(表示 (捨て a))(改行)
(表示 (捨て a))(改行)
(表示 (捨て a))(改行)
(表示 (捨て a))(改行)
(表示 a)(改行)
0054デフォルトの名無しさん
NGNGマクロではないですが、単純なsyntax名の置き換えなら
define文でもできます。(あたりまえかな)
(define 定義します define)
(定義します もしもだよ if)
005544>54
NGNGifやletみたいなsyntaxだとエラー吐いちゃうんでマクロにしてます。
Iispのfexpr型の様なlambdaがあればできそうですが。
005654>55
NGNGR5RSとかではどうなってるんだろう。
005755>56
NGNG(define もしもだよ if)
がエラーになるってのは、単に↓を評価した場合
if
=>error:Unbound symbol 'if
これがインプリメントされてないからです。
いいかげんに作ってあるので・・(環境を返す様にすれば直る)
R5RSみても良く判りませんでした(→多分マクロが返る)
「形式的シンタックス」とか、後ろの方意味不明・・(汗
0058デフォルトの名無しさん
NGNG0059デフォルトの名無しさん
NGNGcaddrか。
そういやこれ日本語にするとなにになるんだっけ?
0060デフォルトの名無しさん
NGNG0061デフォルトの名無しさん
NGNG0062>61
NGNG0063デフォルトの名無しさん
NGNGLISPはcaxxrの代わりに
first second third forth fifth sixth seventh eighth ninth tenth
がある。
じゃあ、cdxxrとかは何よ、って思うけど。
0064デフォルトの名無しさん
NGNGcdr くだー
cadr かだー
cdar くだあー
caar かあー
cddr くだだー
0065デフォルトの名無しさん
NGNG(a b c d) => (a .(b .(c .(d .()))))
の様になってることから、
普通car側のネストってしないものなんでしょうか。
(((((). d). c). b). a)
こうなるんですが。見ずらい・・
0066デフォルトの名無しさん
NGNG0067デフォルトの名無しさん
NGNG構造化されたある程度大きなプログラムを書けるのでしょうか?
僕は結構OOPについては詳しいつもりでなんですが、
OOPとLISP系(関数型)ってどっちが美しいですか?
ぼくは
LISPの美しさがよく分かりません、っていってもぱっと見の印象もあるんだけど
0068デフォルトの名無しさん
NGNG自己スレです
意味論的にクリアなのはSchemeか?
0069>66
NGNG画面出力の時だけcdrネストに直せばいいかな
0070>67
NGNGデータと関数の相互変換が自然に行なえるのは良いと思います。
それと、破壊操作やprimitive以外は全てlambda式で表現できるとか。
(define-macro compound-statement :複文のマクロ定義
(lambda (l)
(list (cons 'lambda (cons '() (cdr l)]
(compound-statement '式1 '式2 ...)
0071>67
NGNGモジュール毎に分けたり単体テストなどをちゃんとやらないと
直ぐに破綻すると思います。(型は実行時に判定するしか無いので。)
また、ネストする括弧は人間にはかなり見ずらいので、
なんらかの対策をする必要を感じると思います。
(超括弧[]やエディタの機能を使うとか、構文の単純化など)
0072>67
NGNG可能になると思います。
(実際、ほとんどの処理系は初めからOO拡張している様です)
0073>68
NGNGこれはlispには無い様です。(lispでは普通whileなどの制御構文などを使う)
よってSchemeでの外部ループは再帰呼出しで記述するのが一般的らしいです。
また、制御構造自体は>>70の様にlambdaで置き換える事ができます。
lispにある脱出系制御文(大域goto、catch/throw/break/returnなど)は
*継続*という概念で定義できるみたいです。(反則的な気がしますが)
0074デフォルトの名無しさん
NGNG0075デフォルトの名無しさん
NGNGCLOSなんて object systemもあるんだし。
Smalltalk並みに柔軟な、自分自身に手を入れられる環境が魅力では。
と言うことで単なる schemeはあまり触ってなかったり。
仕様的に美しいのは納得するんだけどねえ。
0076デフォルトの名無しさん
NGNGアルゴリズム言語Schemeに関する第五改訂報告書(R5RS)
http://www.sci.toyama-u.ac.jp/~iwao/Scheme/r5rsj/html/r5rsj_toc.html
Common Lisp the Language, 2nd Edition(英語)
http://www.cs.cmu.edu/afs/cs.cmu.edu/project/ai-repository/ai/html/cltl/cltl2.html
Structure and Interpretation of Computer Programs(SICP)(英語)
http://mitpress.mit.edu/sicp/full-text/sicp/book/book.html
007774
NGNG0078デフォルトの名無しさん
NGNGCommon Lispでも普通はコンパイラが末尾再帰を処理してくれる。
コンパイルしないとスタックオーバーフローになってもコンパイルすればOKな事が多い。
0079デフォルトの名無しさん
NGNG0080Be名無しさん
NGNGこれよんで感動しました。お勧めです。
0082デフォルトの名無しさん
NGNG;←しかないですか?
008382
NGNG#ifdef __UNIX__
;
#else
;
#endif
の様な物は無いでしょうか。
0084デフォルトの名無しさん
NGNGというか「読んだ人が使っている」というくらい普通に読んでると思うが。
0085デフォルトの名無しさん
NGNGhttp://srfi.schemers.org/
0086>82
NGNGSLIBのtrnscrpt.scmを見ていてそう思いました。
0087>82
NGNG0088デフォルトの名無しさん
NGNG0089デフォルトの名無しさん
NGNG(define-struct hoge '(method1 member1 member2))
=>hoge ;構造体の定義
(define hoge1 (make-struct hoge))
=>hoge1 ;インスタンスの生成
(member-set! hoge1 member1 'member1-value)
(member-get hoge1 member1) ;メンバのアクセサ
=>member1-value
(method-call hoge1 method1 param)
とか。これぐらいならマクロで作れそうですが、classとなると・・
(define-class
hage ;hageクラス
(super hoge . ()) ;hogeから単一継承
'(method1 member1 member2)) ;hageのメンバ
(define-method
(hage method1 msg) ;method1の定義 msgは引数
(display (member-get self member1)) ;member1の値の表示
)
(member-set! hoge1 member1 member1-value)
(method-call hage1 method1 param)
こんな感じでしょうか。やっぱり構造体とあんまし変わらないのかな。
それにしても、なんか読みにくいなあ・・
0090デフォルトの名無しさん
NGNGMITの授業内容のサイトらしいけど、OOPのサンプルがある。(SICP参照)
http://www.ai.mit.edu/courses/6.001-99Spring/lectures/lec15/lec-oops-duane/lec-oops-duane.html
0091デフォルトの名無しさん
NGNGhttp://www.angelfire.com/tx4/cus/shapes/scheme.html
0092デフォルトの名無しさん
NGNGLISPって大学や研究機関、あるいは個人の趣味以外で
仕事で利用されたりしてるのでしょうか?
sawfish,emacsは除いて。
009389
NGNGSchemeの標準的な構文で実現できるとは思いませんでした。
でも疑問に思ったんですが、↓のletで生成されるxとyの
入れ物の継続期間が謎なんですけど・・
↓のmake-shapeはclosure(lambda以降)を返すんですよね?
こんなことして平気なんでしょうか。
(>>91のサンプル)
(define (make-shape newx newy)
(let (
(x newx)
(y newy))
(lambda (method parms)
(cond ; accessors for x & y
((eq? method 'getx) x)
((eq? method 'gety) y)
((eq? method 'setx) (set! x parms))
((eq? method 'sety) (set! y parms)) ; move the x & y coordinates
((eq? method 'moveto)
(set! x (car parms))
(set! y (car (cdr parms))))
((eq? method 'rmoveto)
(set! x (+ x (car parms)))
(set! y (+ y (car (cdr parms))))))
)))
(define s (make-shape 640 480))
(s 'getx '())
=>640
(s 'gety '())
=>480
0094デフォルトの名無しさん
NGNG009589>92
NGNGLispやSchemeのコード納品する様な仕事ってどんなのでしょう(汗
cgiの部品としてperl/Pythonコードとかはある様ですが。
まあScheme->Cとか、変換ツールは結構出回ってる様なので、
元がLisp/Schemeって事例はあるかもしれません。
009689
NGNG(cond->caseしただけですが)
(define (make-shape newx newy)
(let (
(x newx)
(y newy))
(lambda (method parms)
(case method ; accessors for x & y
((getx) x)
((gety) y)
((setx) (set! x parms))
((sety) (set! y parms)) ; move the x & y coordinates
((moveto)
(set! x (car parms))
(set! y (car (cdr parms))))
((rmoveto)
(set! x (+ x (car parms)))
(set! y (+ y (car (cdr parms)))))
(else (no-method))))))
letの辺りはよく分かりませんが、これをマクロでテンプレートにしたら
結構使えそうです。