フッ… l!..|li|li ニ____
|l| i|li /___ ≡
l|! |´・ω・`| :l. __ _ / |´・ω・`| \
!i ;li __ ̄ ̄ ̄ /  ̄ ̄ ̄ 三
i!| ⊂i|li二;l|i  ̄ ̄ ̄ キ i ヽ、_ヽ
l|! ;li  ̄ ̄  ̄ └二二⊃ l ∪
:li i|li | ,、___, ノ
i!| |i i! ;l ヽ_二コ/ 三‐ ―
i| ; /__/´_____
; _,/.,,,//
/ ̄ ̄ ̄
/ ___ / ; ;
/ |´・ω・`| / ヒュンッ
/ _,  ̄⊂二二
/ l l / //
| |
/
____ ヽ / \ /
/___ \ : /ヽノ //
ニ/ |´・ω・`| \/ / /
/  ̄ ̄ ̄ \/ /;
≡ i ヽ、_ヽ
└二二⊃ l ∪
| ,、___, ノニ≡ ; .: ダッ
キ_二コ/ /三 三 人/! , ;
ニ =/__/´三‐ ―_____从ノ レ, 、
(保守っとく)
FreeBSDのlang/racket が32bitマシンだとメモリー足りないとか言われてmakeできない
WindowsでSchemeを学習だけするってならRacketが一番しっくり来た
CLへの登竜門と考えてればGaucheだのEmacsだのウザったらしい。
Emacs使えない人がCommon Lispって茨の道だと思うけどなあ。
IDEがあるAllegroやLispWorksは驚くほど高いよ?
EclipseとCUSP使う手もあるけど、SBCLしか使えないって話だし。
そもそもRacketのエディタ自体がEmacs互換のキーバインドだった気が。
>>9 SBCLしか使えないって何か問題あるの?
そんなに処理系をたくさん使ってなにするの?
>>11 SBCLはフットプリントが巨大な、いわゆる重量級の処理系で、
用途によってはマッチしないことがある。
そういうとき、CLISPとかの軽量な処理系に切り替えられない。
あるいは、Cと連携するためにECLを使いたい、
ARM向けに開発したいからClozure CLを使いたい、
SBCL以外の処理系で動作するか確かめたい、
みたいなケースもある。
>>12 Thread関係Windowsでも使えるようになったかってのが一番でかかったりするんだけど、どうなった?
Thread使えないとhenchentootとかで遊べないのよ
>>13 SBCLのWindowsでのスレッドサポートならお察しください。
Windowsでスレッドを使えるCommon Lispの処理系があるか、という意味なら、
CLISP、Clozure CL、ECL、商用処理系をご利用ください。
とりあえずWindowsのEmacsライクエディタが使いにくいのと汚いので
仮想Linux上でEmacs使ってみるのもいいよ
emacsはあれほどlispベースなのに、なぜ対応するかっこに飛ぶショートカットキー
が標準になってないんだろう。
viですらあるのに。
対応するかっこにdでも意味ないから
質問!クロージャのクロージャってどうやって作ればいいんですか?
(define (pn x) (display x) (newline))
(define (f a)
(let ((x a))
(lambda ()
(set! x (+ x 1))
(lambda (t)
(let ((y t))
(lambda ()
(set! y (+ y 1))
(display "x=")(pn x)
(display "y=")(pn y)
(+ x y)))))))
(define a (f 10))
(define b (a)) ;x=11になってほしいが・・x=12になる
(define b2 (a)) ;x=12
(define c (b 20))
(define d (b2 20))
(c)(c)(c) ;yは順調に育つよい子
(d)(d)(d) ;yは順調に育っよい子
対応する括弧に合わせるとハイライトされるとかがいいのにね
>>19 > (define b (a)) ;x=11になってほしいが・・x=12になる
> (define b2 (a)) ;x=12
何がしたいのかわからん。
(define b (a)) のときに x に 1 が足されて (define b2 (a)) のときにもう一度1が足されるのだから、
お前が x=11 になって欲しいときには x=11 になっている。
それぞれを独立して扱いたいんです
(define (f x)
(let ((a x))
(lambda () (set! x (+ x 1)) x)))
(define x (f 10))
(define y (f 20))
(x)(x)(x)(y)(y)(y)
こうするとxとyは独立して変更出来るのに
2段階にすると動かなくなるのは何ででしょう?
書き方が悪いだけなんじゃないかと思ってるんですが
クロージャってオブジェクト指向の
オブジェクトと同列に語られることがあるから
出来そうな感じなのに、それとも
closure is poor man's objectってことですか
自己解決しました。
(define (f a)
(let ((x a))
(lambda ()
(set! x (+ x 1))
(let ((x x)) ;これ
(lambda (t)
(let ((y t))
(lambda ()
(set! y (+ y 1))
(display "x=")(display x) (display " , y=")(pn y)
(+ x y))))))))
%だけで移動できるようにしてるviの方が不思議。
そんなに使用頻度高いのだろうか。
>>25 viは移動コマンドを編集のときに組み合わせるんで、
移動用に使用頻度が低くても、編集用に無いと困るんですよ。
d%とかy%とか。df)とかだとネストしてると無理なので。
この辺、編集コマンドが独立してるEmacsとは思想が違います。
S式単位に対する操作が最初からあるEmacsはいいよね。
Vimならテキストオブジェクトで設定できそうだけどどうやるんだろ。
面白そうとか言う前に
やって面白いか試すんだ
グサッ
定数伝播と何が違うの
土人にアスピリンが良く効いた、みたいな話じゃないの?
上のリンクみてMaximaの優先順位のことを思い出した。
Maximaの演算子は
右側への結合性と左側への結合性とで分けて定義できる
どういうルールなのかまで把握出来てないが
あいつらは、かなりへんてこりん
maxima言語的に変だけど一通り必要なものそろってるから便利だよ
sick pee
血尿とか?
DrRacket使ってみたけど分かりやすくてワロタ
WindowsでのScheme学習なら最高かもしれん
PLTは教育用にも使われてるだけはある。
あとあの無駄に豊富なドキュメント群。
速度もそこそこでライブラリも多い方。
加えて日本語の扱いも問題ないとくれば。
日本語問題なかった?
euc, utf sjis
全部いけた?
>加えて日本語の扱いも問題ないとくれば。
これは日本語の扱いさえよくなれば〜
って意味でしょ
SXPathがperlとかからXPath使うのと比べてそんなに優位なように見えない
継続でも使って探索すると便利なのだろうか
わざわざS式に直してるのにリストとして処理しないのはアホすぐる
>>45 SXPath使うならPerlでXPath使うのと変わらんでしょ。
SXMLの利点は
>>46も言ってるように、リストとして好き放題処理できること。
再帰でトラバースするもよし、部分木をmapやfoldで処理するもよし。
sxpath には普通の関数を混ぜて書ける。
単に XPath をS式で表現しただけじゃないんだよ。
どんだけ時間掛けるんだよ
SBCLの面子は無能ばっかりなのかよほどメンテがし辛いのか
>>50 そこまで言うなら、オマイが手伝ってやれよ。
人は、自分と同じ人生を歩めない
だから、自分は自分の人生を生きていくのね・・・
LISPを勉強すればSchemeへの移行は楽になりますか?
>>53 単に「Lisp」と言ったときには Scheme を含むLisp 系言語全部のことがある。
文脈によっては CommonLisp のこともある。
マッカーシが論文に書いたやつのことだったりもする。
お前が言う Lisp とは何だ。
56 :
デフォルトの名無しさん:2010/09/18(土) 12:05:47
defineは動的束縛と思っていいですよね?
(define a 10)
(define (f x) (+ a x))
(define (g x) (+ (f x) a))
(define a (+ a 10)) ;(set! a (+ a 10))
(define (p x) (display x) (newline))
(p (f 10))
(p (g 10))
(define (f x) (- a x))
(p (f 10))
(p (g 10))
(define (g x) (- (f x) a))
(p (f 10))
(p (g 10))
本当ですか?
let a=10
let f x=a+x
let a=20
f a
これに相当するコードの実行結果は、
Haskell,OCaml,F#全てのインタプリタで30ですが
(define a 10)
(define (f x) (+ a x))
(define a 20)
(f a)
schemeインタプリタでは40になります
defineは全てletrec相当と思ってください
>>59 Schemeでもこうすれば30になる。
(define a 10)
(define (f x) (+ a x))
(let () (define a 20) (f a))
>>60 どういう意味でしょうか
OCamlでlet recを使っても結果は変わりませんし
>>61 letが静的束縛であるのには元々異論は無いです
元はReal World Haskellを読んでて知ったんですが
let x=5
let f a =a+x
let g a=f a
let f a =a-x
let x=7
f 35
変数が動的束縛、関数が動的束縛なら28
変数が動的束縛、関数が静的束縛なら42
変数が静的束縛、関数が動的束縛なら30
変数が静的束縛、関数が静的束縛なら40
になるらしく
Haskellインタプリタでは変数は静的束縛、関数は動的束縛だそうです
schemeはどうなのかなと思って書いたコード
自信が無いので聞いてみました
R5RS では既に define された変数に再度 define すると set! と同じ意味であることになってる。
R6RS では明確に禁止されている。
R6RS ではトップレベルでの定義と式は letrec* と同じ意味であることになってる。
(define a 10)
(define (f x) (+ a x))
(define (g x) (+ (f x) a))
(define (p x) (display x) (newline))
(p (f 10))
と書いたなら
(letrec* ((a 10)
(f (lambda(x)(+ a x)))
(g (lambda(x)(+ (f x) a)))
(p (lambda(x) (display x) (newline))))
(p (f 10)))
と同じ意味になる。
let*とletrec*の違いって判る?
>>64 なるほど、ありがとうございます。
先のhaskell etcも、同じく同じものを二度定義するのはエラーなので
「インタプリタ」という但し書きを付けてます
インタプリタで同じ変数を何度も定義出来ないのは不便すぎますしね
最初のコードでコメントアウトしてある
(set! a (+ a 10))ですが
これと入れ替えても動的束縛される結果になるので
defineの動作は動的束縛のように見えます
(自分の環境はR5RSです)
>>65 とても参考になります。
R6RSの処理系入れてないので
この動作を頭の中で考えてみます
全てのlet〜はlambdaとset!に置き換えられるから、
その展開形を見ると一発で判るんだがな。
let系が全部マクロで実装されてて、
macroexpandできる処理系が手元にあればいい。
let rec*の箇所読みましたが、
そもそも<variable>の複数回定義を許してないので
インタプリタの動作は実装依存ってことでしょうか
R6RSの処理系をいくつか入れてテスト(とりあえずすぐインストール出来たのだけ)
テストコード
(define x 5)
(define (f a) (+ a x))
(define (g a) (f a))
(define (f a) (- a x))
(define x 7)
(f 35)
結果
R6RS
Ypsilon 28
Larceny 28
Racket 28
schemeインタプリタは実際の所、一貫してますね
全然関係ないけど
(letrec ((a b) (b 3)) a)
(letrec ((a (list a b)) (b 3)) a)
これらはエラーなんだけど、
ちゃんと意味解析のエラーではじく処理系ってあるかいな?
特に後者のケースで。
手抜き処理系だと良くて実行時エラーか、
評価順序の関係でエラーにならなかったりする。
>>73 実行時エラーっぽいけどちゃんとエラーにはなるね
内部的にunboundな属性でも持ってるんだろうか
>>63 そのコードは意味的にこれと同じ
let x=5 in let f a=a+x in let g a=f a in let f a =a-x in let x=7 in f 35
つまり、 x=7 は新しい環境で x という名前の変数を作っているので、
関数 f や g の中で参照している x は依然としてそのまま存在している。
Scheme で言えば
(let ((x 5))
(let ((f(lambda(a)(+ a x))))
(let ((g(lambda(a)(f a))))
(let ((f(lambda(a)(- a x))))
(let ((x 7))
(f 35))))))
ってこと。
define が set! の意味になる場合があるのが混乱の元だな。
r6rs で禁止にしたのは良い選択だと思う。
てことは、HaskellやOCamlのインタプリタの関数定義での動作を
動的束縛と考えるのは変ですね
インタプリタで定義した順に、inでスコープが作られているって考えると
全て静的束縛で説明出来るわけか
>>75をlambdaに直したやつ
((lambda (x)
((lambda (f)
((lambda (g)
((lambda (f) ((lambda (x) (f 35)) 7))
(lambda (a) (- a x))))
(lambda (a) (f a))))
(lambda (a) (+ a x))))
5)
>>70をletrec*として直したやつ
((lambda (x f g)
(set! x 5)
(set! f (lambda (a) (+ a x)))
(set! g (lambda (a) (f a)))
(set! f (lambda (a) (- a x)))
(set! x 7)
(f 35))
'()
'()
'())
>>77
飲みlispってたので、サブタイトル思いついた
carで出会って、cdrで深まり、consする
lisplusplusplusplus
LiS#
もっと面白いこと書けよ
82 :
デフォルトの名無しさん:2010/09/22(水) 23:02:39
人間ってよ血液型何種類か知ってる?4種類だろ。
じゃ馬。馬は何種類か知ってる?3兆wwwwwwwwwwwwwwwwww
ちなみにゴリラはみんなB型だってwww少なくねwwwww 全部自己中だよゴリラwwwwww
ゴリラってよ、あれ通称ってこと知ってんだろ。
あれの本名、つまり学名ってなんだか知ってる?知ってる?
ゴリラ・ゴリラだってwwwww
まんまじゃねえか。まんまじゃねえかおい。それがローランドゴリラだとなんだか知ってる?
ゴリラ・ゴリラ・ゴリラだってwwwwwwwwwちょwwおまwwwww
そういうテンションで毎日を過ごせたらなあ
なごんだ
ウマの血液型って人類総数より多いのか
つまり彼はチャーチ数について語りたかったのでは
sxml shtmlがあるならslatexはないのか?
gladeみたいなやつ希望
もちろんwindowsで使えるやつ
「あと、たとえば『はじまりすぷ』みたいに、『○○りすぷ』って言葉を繋げる遊びが
Twitterとかでも流行っています(笑)」
とりあえず括弧の使い方がなってない
鳴ってないとは言うけど、自然言語をS式に出来るの?
おわりすぷ
もっと面白いこと書けよ
LISPかschemeで型推論が入れた処理系ありませんか
PLTにtyped schemeとかいうのがあったような気がする
おまけじゃなくて、そういう実装ってのはないんですかね
何のために型推論するの?
そこに型推論があるから(キリッ
readable Cに変換するのに型推論あるとすごいうれしい
Gmbit−Cが最速ってことでいいのか?
stalin遅い
そういやchickenって今どうなってんだっけ?
せめてコンテナ以外の型については型推論してくれないかな
(string-append "(fib 32) =>" (fib 32))とか自明なやつや、
数字または真偽値を返すようなやつで
(define (numfilter n) (if (number? n) n #f))
(list (numfilter 1) (numfilter 2) (numfilter "3"))はOKでも
(+ (numfilter 1) (numfilter 2) (numfilter "3"))はエラーとか
コンテナ構造をある程度理解して
(define (make-pair a b) (cons a b) ) ; => (a . b)
(length (make-pair 1 (make-pair 2 '()))) ; OK
(length (make-pair 1 2)) ; エラー:リストでない
こういう風に実行前に検出するとか
まあこの例では定数畳み込みやってたら判ることだろうけど
maximaでクロージャーできない
f(a):=lambda([],block([],a:a+1,a));b:f(0);b();b();b();
を実行するとa+1,a+2,a+3みたいになってしまうのな
久しぶりにmaximaスレを探してみれば、
シミュレート版も数学版もDAT行きか
鯖が飛んだんじゃなかったっけ?
流れ読まずにすみません。
LittleとSeasonedの間には結構ギャップありますよね?
焦らずに巻末の推薦図書読んだ方が良いのかな。
氣
sxm shtml slatex
C in Sexp
次は何がくるんだろな
sumimさんナイスw
rubyはlispじゃないよな
ひょっとしてGaucheってSnow Leopard で動かない機能が結構あったりする?
c-wrapperがmacportで動かない
>>117 他の人も動いてないことがわかってよかったです
危うくいろいろ再インストールするとこだった
>>116-118 MacでGaucheの挙動が変なのはMacのgccの独自機能が原因らしい
Macのgccには関数プログラミングの機能が強引に組み込まれてるそうな
GCDがなんかやらかすのか
必須 feature ってわけじゃないんだけど、CommonLisp の loop で
C のループ系構文の continue 相当の動作ってさせられないものかな?
named ラベルで go しようとしてもできないし。
全然書き込みないな
また規制か
>>121 そういうのは継続で出来ると思う
gaucheには最初から入ってるけど、これは使えないかな
(define-syntax let/ec
(syntax-rules ()
[(_ name body ...)
(call-with-current-continuation (lambda (name) body ...))]))
>>123 CommonLisp の loop って書いてんのになんで gauche の話になってんの
loopで画像みたいなx y 配列内を、周辺3x3走査しながらまわすのめんどくさいな
質問です。
Schemeではネームスペースはどのように作るものなのでしょうか?
Javaのパッケージのような名前空間を作るもののことを探してるんじゃないかと思うが、
標準はない。
レスありがとうございます。
ずばりC++やJavaのようなネームスペースをつくりたとおもっておりました。
標準ではないとのことですが、自作できるという事で良いのでしょうか・・・?
個々の処理系にあるシステムを使うのがいいと思う。
たとえばGaucheではモジュールと呼んでいる。
なるほど、ありがとうございます。
そういえば、R6RSでモジュール性を導入するために構造的な操作的意味論を
採用したはずだけど、具体的にどうやってモジュラな処理系にしてるんだ?
あれもしかしてR6RSには名前空間の機能があったっけ?
まあありゃただのお遊びですがね
階層化もないし空間自体ないし省略もできない
UCL は R6RS が前提だからなー。
Gauche が R6RS モードを実装すればそういうこともあるんじゃね?
>>121 continueそんなに使いたいときある?
unless節じゃ駄目なの?
名前空間を使いたければCommon Lispを使えば良いじゃない。
>>132 importで同様の処理ができる。インポートする束縛にprefixを付けたり、renameしたり。
R6RS libraryが実質的な名前空間。
http://karetta.jp/article/blog/oneline/008183 を実行しようとしたら、
*** ERROR: Autoloaded symbol ~$ is not defined in the module gauche.procedure
とエラーが出る。
(hash-table-keys (module-table mod))
のリストに ~$ が含まれることが問題っぽいのだが、対処法が分からない。
どうしたら良いだろ?
>>140 無事動きました、超サンクス。
「~$」って検索できない文字だから困ってたんだよね。
と思ったけど、アレ? クラス名が出ない……
まこっから先は自分で何とかします。ども。
月、car、水、木、金、、
引磬の音 car ん
145 :
デフォルトの名無しさん:2010/10/11(月) 19:51:11
あ〜ん、そこはダメ、eq〜〜〜
cdrらねぇこと書いてんじゃねぇぞ
eqの早すぎじゃなイcar
condはもっと我慢するでゲソ
書いたラ、ムダだった。 せっか cdr ったのに。 思わず car っときた。
メシを quote したら cond は饅頭しかなかった。 甘い unquote 皮の比率が絶妙。
何?この流れ
)))))))))))))))))))))))))))))))))))))))))))))))))))))))))
S式の閉じ括弧の枚数を数えるプログラム教えてください。
仕様は
・閉じ括弧が現れたらその後ろに))))) ; 枚数
のようにコメントを入れる。
・既存のコメントやインデントは残す。
・開き括弧と対応してなくても動く。
です。
宿題は自分でやろうな。
括弧を「枚」で数えるのが新しいと思った。
いちまーい、にまーい
154 :
デフォルトの名無しさん:2010/10/12(火) 13:58:17
無理なんですね。
判りました。
155 :
デフォルトの名無しさん:2010/10/12(火) 14:15:31
コード=データなのになあ・・・
>>149 例の声優グループがそんなこと言ってたりしたら・・・
「閉じ括弧」というのは「連続する閉じ括弧」ってこと?
こういうのはどうなんの? どこにコメント入れるの?
(define (hoge huga) hage)
括弧が対応してなければ、S式とは言えない。 冒頭の「S式の閉じ括弧」に矛盾する。
「動く」というのはどう動けばいいの? エラーとして報告する動作でもいいの?
使うプログラミング言語は何がいいの? このスレだから Lisp 系を想定してはいるんだろうけど。
158 :
デフォルトの名無しさん:2010/10/12(火) 17:03:13
その辺はよきにはからえ、よ・・・
159 :
デフォルトの名無しさん:2010/10/12(火) 17:06:04
あー、(define (hoge huga) hage) の場合はね、
(define (hoge huga) hage) ; 2枚 ぴったりです
define (hoge huga) hage) ; 2枚 1枚多いです
(define ((hoge huga) hage) ; 2枚 1枚少ないです
でいいよ?
行単位で括弧の数を数えるだけなのか
えらく行志向の仕様だな。改行フリーなのに。
仕様の説明もまともにできないんじゃ
プログラムも書けないよな
自分が何を聞きたいのかまで他人任せのアホは放置でいいよ
164 :
デフォルトの名無しさん:2010/10/12(火) 18:29:11
行単位とは書いてないけど・・・?
165 :
デフォルトの名無しさん:2010/10/12(火) 18:32:14
そもそもお前ら放っておくと
くらだん駄洒落しか書かねーんだもん
ネタ提供してやってんだから
御託並べずにさっさと書けっての
だったらもう少し面白いネタをたのむ。
よーし、お父さんがんばっちゃうぞー
168 :
デフォルトの名無しさん:2010/10/12(火) 18:41:51
>>166 まてまて、ネタの質にまで言及するならお前が提供しろよ
お門違いなんだよ
もう答えなんかとっくに出来てんだよこっちは
数分でできるだろこんなの
お前らどんだけできるの?って所を俺に見せつけてやろうよ
前向きに考えろよクズどもが
さて、空気は読まずに投下
仕様は無視。対象は勝手にリストに限定
閉じ括弧数は、その位置での、あるリストの中で、自分より手前の要素がリストである個数
(define (p . a) (map display a) "")
(define (cp x n m)
(if (not (pair? x)) (p x)
(begin
(p "(")
(fold (lambda (y acc)
(if (not (pair? y)) (begin (p y) acc)
(begin (cp y (+ n 1) acc) (+ acc 1)))) m x)
(p ");()=" (+ m 1) ",+" n "\n"))))
(cp '(a (b (c (d) (e) (f))) (g) (h) (i)) 0 0)
>>159 じゃあこれは?
(define (hoge
huga) hage)
こうなるのか?
(define (hoge ; 0枚 2枚少ないです
huga) hage) ; 2枚 2枚多いです
171 :
デフォルトの名無しさん:2010/10/12(火) 21:41:16
>>169 ちがうよー
こんなとこで目的を履き違える無能を晒してどうするの
>>170 ちがうよー
・閉じ括弧が現れたらその後ろに))))) ; 枚数
のようにコメントを入れる。
の文章読めないの?
アホなの?
バカなの?
173 :
デフォルトの名無しさん:2010/10/12(火) 21:50:24
別にいじわる問題とかじゃないからね?
(define (hoge
huga) hage) ; 2枚 ぴったりです
(define (hoge
huga) ; 1枚 1枚少ないです
hage) ; 2枚 ぴったりです
2chにコピペで貼るには重い。それにもう自分で答え書いたんでしょ?いいじゃんそれで。
meadow をお使いの方はおられませんか?
「プログラミング Gauche」 を参考にして、meadow をインストールしたのですが、M-C-f, M-C-b 等での S 式単位のカーソルの移動ができません。
(scheme-other-window は実行できます。)
これは、そういうものでしょうか?それとも手を加えれば S 式単位のカーソルの移動もできるようになるのでしょうか?
176 :
デフォルトの名無しさん:2010/10/12(火) 21:55:06
いじけるなよもー
codepadとか知らんのか?
情弱とか言わせんなよもー
>>171 閉じ括弧が無い場合はわかった。
じゃあ↓このケースはこれでいいか?
(define (hoge huga) ; 1枚 1枚少ないです
hage) ; 2枚 ぴったりです
178 :
177:2010/10/12(火) 22:07:34
おっといきちがい。
>>173 のケースで大体理解した。
で、言語は Scheme でいいのか?
R5RS 範囲内ならいいか?
複数の式にまたがる場合についての仕様も曖昧じゃね?
これでいいの?
(define (hoge huga) ;; 1枚 1枚少ないです
hage) (define (hoge huga) ;; 2枚 1枚少ないです
hage) ;; 2枚 ぴったりです
>>176 俺はコードがあるスレのほうがらしくて好きだから書いただけで
お前のためにやった訳じゃない
お前が書いたコードを張るならも一つ書く
そうすれば仕様も曖昧じゃないし、みんなコードを書いてくれるさ
さもなければお前はcons
182 :
デフォルトの名無しさん:2010/10/12(火) 22:25:04
>>175 meadowは使ってないけど
M-C-f forward-sexp
M-C-b backward-sexp
にあたる機能があるならキーバインド設定で使えるんじゃないかな?
M-x(Alt+xね)のあとにforwardとか自分で打ってタブで補完してみたら、あれば出る
関数があるなら.emacs相当のファイルを設定すればいけると思う
外してたらごめん
(define (^q^)
(display " 〜|")
(display "〜")
(newline)
(display " ((")
(display " ))"))
S式ではなく文字列を読み込んで閉じ括弧を数えるのか?
なんかどっかの自称天才デベロッパーがlispのreadの作り方を知ろうとしてるように見えるな
カウントのスタートは一番外側の開き括弧からだと思っていた。
>>180 がテストケースとして OK なら、仕様をまとめると
「最後に遭遇した一番外側の開き括弧からの閉括弧の数と、
それを除いた現在行の閉じ括弧の数を足したものを行の最後にコメントとして付け加える。
但し、閉じ括弧が存在しない行については例外とする。」
ってことでいいかな。
>>186 最後に遭遇した最も外側の開き括弧から (それ自体を含む) 開き括弧の数に対して閉じ括弧がいくつ不足するか?
ってのも必要だったな
(define ('A`))
189 :
デフォルトの名無しさん:2010/10/12(火) 23:40:24
>>184 俺への問いかけですか?なんか怖いなー
エスケープ処理とかはセルフサービスでお願いしますよ
>>185 readってあんま関係ないだろこれ
何いってんの?
>>186-187 1行にまとめるなら、
開きと閉じ括弧両方カウントして、閉じがある行で枚数コメ挿入ね
>>189 > 1行にまとめるなら、
> 開きと閉じ括弧両方カウントして、閉じがある行で枚数コメ挿入ね
それじゃ説明になってないだろうが…。
「カウント」とは何をカウントするのかってことで
>>180 のケースを説明しようとしてるのに。
何かこういう人定期的に来るね。
ネタ提供とか嘯くなら、思春期の子みたいに無駄に煽るの止めようよ。
ゲハとかじゃないんだから、そんな殺伐とさせてどうすんのよ。
確かにああいう駄洒落しか書き込まないのは、俺もどうかと思うけど。
QuicklispとかiSchemeとか旬の話題色々あるのにさ。
ちんこ(笑)の煽りに付き合う必要なし
haskellは諦めたのか?
煽ったら答えがすぐ出てくるという話を信じてるんだろうさw
質問者は名前欄に何か入れろ
相手をする奴は最後まで面倒を見ろよな
レスアンカーつけて
手元のエディタでSchemeのシンタックスハイライトしたくて仕様読んでるんだけど、
> <peculiar identifier> ==> + | - | ...
の ... って、文字通りドット3つの並びと解釈するんですかね?
はい
ドット3つの並びです
そのへんの書き方って微妙だよな。
マクロのパターンの書き方のところはこんな風になってる。
(<パターン> ...)
(<パターン> <パターン> ... . <パターン>)
(<パターン> ... <パターン> <省略符号>)
#(<パターン> ...)
#(<パターン> ... <パターン> <省略符号>)
ここでの ... は文字通りの ... ではなくて繰り返しの意味で、
<省略符号> の方が字句としては ... だったりする。
<letter> → a | b | c | ... | z ってのもあるし、まぁまぎらわしいといえばまぎらわしい
ネタはいらない。後で過去ログ検索するときゴミが増える
>>197 繰り返し? ということは、
<peculiar identifier> は [+-]+ ?
>>200 いやいや。 <peculiar identifier> は
>>195 の解釈でいいんだよ。
>>150 Gauche用。
(define (result le la sb se) (if (zero? (+ la se)) (newline) (begin (format
#t ";; ~d枚 " (+ la se)) (cond ((- sb se) (^x (not (zero? x))) => (pa$
format #t "~d枚足りません\n")) (else (format #t "ぴったりです\n"))))))
(define (main args) (when (< 1 (length args)) (with-input-from-file (cadr args)
(lambda() (let ((le 0) (la 0) (sb 0) (se 0)) (do ((ch (read-char) (read-char)))
((eof-object? ch) (result le la sb se)) (cond ((char=? #\( ch) (if (= sb se)
(begin (set! sb 1) (set! se 0) (set! la (+ la le))) (inc! sb)) (write-char ch))
((char=? #\) ch) (inc! se) (inc! le) (write-char ch)) ((char=? #\newline ch)
(result le la sb se) (set! le 0) (set! la 0)) (else (write-char ch)))))))))
文字や文字列のリテラルとかコメント中に括弧が有った場合も括弧として
認識してしまうんだけど、とりあえずもうめんどくさくなったからここまでで投下するわー。
(define a 1234)
では、正しいのはどれ?
(1)「aが1234を束縛している」
(2)「1234がaに束縛されている」
(3)「1234がaを束縛している」
(4)「aが1234に束縛されている」
(1)(2)が正しいように思い込んでる。
204 :
デフォルトの名無しさん:2010/10/13(水) 19:02:35
>>202 いいよいいよー
1個まともなのが出てきたので俺のを貼り付けるとくわ
(define (parentheses-counter)
(define STATE_NONE 0)
(define STATE_COMMENT 1)
(define STATE_SHARP 2)
(define STATE_SHARP_ESC 3)
(define STATE_DQUOTE 4)
(define STATE_DQUOTE_ESC 5)
(define (sharp? ch) (char=? ch #\#))
(define (dquote? ch) (char=? ch #\"))
(define (escape? ch) (char=? ch #\\))
(define (comment? ch) (char=? ch #\;))
(define (newline? ch)(char=? ch #\newline))
(define (open-p? ch) (char=? ch #\())
(define (close-p? ch) (char=? ch #\)))
(define (display* . seq) (for-each display seq))
(define (report cn on last?)
(display* " ; " cn "枚")
(cond
((> cn on) (display* " " (- cn on) "枚多いです"))
((< cn on) (display* " " (- on cn) "枚少ないです"))
(else (display* " ぴったりです")))
(if last? (begin(display " おわり")(newline))))
(define (loop on cn closed? state)
(let ((ch (read-char)))
(cond
((eof-object? ch)
(report cn on #t))
205 :
デフォルトの名無しさん:2010/10/13(水) 19:03:39
((= state STATE_DQUOTE_ESC)
(write-char ch) (loop on cn closed? STATE_DQUOTE))
((= state STATE_DQUOTE)
(write-char ch)
(if (escape? ch)
(loop on cn closed? STATE_DQUOTE_ESC)
(loop on cn closed? (if (dquote? ch) STATE_NONE state))))
((= state STATE_SHARP_ESC)
(write-char ch) (loop on cn closed? STATE_NONE))
((= state STATE_SHARP)
(write-char ch)
(loop on cn closed? (if (escape? ch) STATE_SHARP_ESC STATE_NONE)))
((= state STATE_COMMENT)
(write-char ch)
(loop on cn closed? (if (newline? ch) STATE_NONE state)))
((or (newline? ch) (comment? ch))
(if closed? (report cn on #f))
(write-char ch) (loop on cn #f (if (comment? ch) STATE_COMMENT state)))
((open-p? ch)
(write-char ch) (loop (+ on 1) cn closed? state))
((close-p? ch)
(write-char ch) (loop on (+ cn 1) #t state))
((dquote? ch)
(write-char ch) (loop on cn closed? STATE_DQUOTE))
((sharp? ch)
(write-char ch) (loop on cn closed? STATE_SHARP))
(else
(write-char ch) (loop on cn closed? state)))))
(loop 0 0 #f STATE_NONE))
206 :
デフォルトの名無しさん:2010/10/13(水) 19:04:33
で、こんなもの(
>>204-205)作って何をするのかっていうと・・・
'((((((((((((((((((((((((((((((((((((
おまえは今まで使った括弧の枚数を覚えているのか?)))))))))))))))))))))))))))))))))))) ; 157枚 ぴったりです
とかで遊ぶだけですおwwww
>>203 束縛が作られてもオブジェクト (値) の側は他の束縛を作ることもできるのに対し、
変数にとってはその束縛が唯一無二のものだってことを意識すると
「オブジェクトが変数を束縛している」ってことに納得できる。
R5RS だと 3.1 あたりに記述があるね。
「誤用しがちだけど、別に大して混乱もしないよ」ってことも書いてあるからぶっちゃけ気にしないで問題ないと思う。
>>209 正しくは (3) (4) だけど、(1) (2) の言い方をしても誤解する余地はあんまり無いよって話。
えー?
束縛を受動的と捉えた場合(3)(4) ; 2枚 ぴったりです
束縛を能動的と捉えた場合(1)(2) ; 4枚 ぴったりです
結局 <peculiar identifier> は正規表現だとどうなるんでしょうか?
>>213 こんな感じか?
([+-]|\.\.\.)
正規表現ってモノによって表現が若干違うからエスケープとかは適宜やってね。
だけど、前後の文脈も含めると正規表現だけでは表わせないはず…。
R5RSの束縛は値じゃなくて場所では?
set!でも束縛が変わらない
>>214,201,197,196
了解しました、サンクスです。
>>204 (define (hoge huga) ; 1枚 1枚少ないです
hage) (define (hoge huga) ; 3枚 1枚少ないです
hage) ; 4枚 ぴったりです
>>180と違う。
しかしまあ読みやすいコードだった。
結局、プッシュダウンオートマトンが最適なのかな
下記の式なのですが実行結果は11となります。
いまいち仕組みがわかりません。
(((lambda (y)
(lambda (x)
(begin
(set! y (+ x y))
y)))
10)
1)
((lambda (y)・・・) 10)の部分では、
最終的に (begin・・・) が計算されて10が戻る。
その後外側の式に流れ落ち (10 1) となるのでは考えております。
よろしければご指導お願いいたします。
>>219 ((lambda (y)・・・) 10) の部分が返すのは
xを引数とする
(begin
(set! y (+ x y))
y)
と言う手続きと、変数yが10に束縛されている、という定義時の環境に関する情報。
xに対して何か数値を束縛してこの手続きを呼ぶと、begin文内でy は改めて x + y = x + 10の値に束縛され、その新しい値が返る。
>>220 レスありがとうございます。
ご指導を頂き、再度考えをまとめてみました。
(lambda (y)・・・)は (lambda (x) (begin (set! y (+ x y)) y))を返す。
y は(lambda (x)・・・)の外側の (lambda (y)・・・) にて束縛される。
((lambda (y)・・・) 10)は (lambda (x)・・・) の引数 x を10として呼ばれ、
(begin (set! y (+ x y)) y)を実行し y を式の結果として返す。
しかし実行結果としてはここで値ではなく手続きが帰らないと、
結果として 11 を出力できないこととなります。
よろしければ今一度ご指導お願いいたします。
>>221 手続きオブジェクトが帰ってくるんだよ。
> ((lambda (y)・・・) 10)は (lambda (x)・・・) の引数 x を10として呼ばれ、
> (begin (set! y (+ x y)) y)を実行し y を式の結果として返す。
((lambda (y)・・・) 10) は y=10 に束縛した (lambda (x)・・・) を返す
その返ってきた (lambda (x)・・・) に 1 を渡して呼ぶので、 x=1, y=10 で (begin・・・) を実行し 11 を返す
>>222-223 レスありがとうございます。
((lambda (x) expression) y)
このような式は手続きの引数xをyとして式を実行し、
手続きを返すと考えるのでしょうか?
>>219 まず、どっから拾ってきたかのかは別に問いませんが、
そのコードはマクロ展開に現れる典型的な出力パターンなんですよ
これを素で書いてるとしたら、そいつは間違いなく頭がイカれてます
そういう事情を知ってないと、いくら眺めても何を意図するのか
まるで読み取れない、馬鹿げたコード、つまり時間の無駄なんですよ
なんで誰も突っ込まないかなあ・・・
それを踏まえた上で、あえてご指導させて頂くと、
とりあえずそのbeginとset!は何の意味もないので、
除去してから考えてみてはどうですかね
(begin (set! y (+ x y)) y) → (+ x y) ; 4枚 ぴったりです
>>224 ((lambda (y) expression) 10) は expression を返す
((lambda (y) (lambda (x)・・・)) 10) は (lambda (x)・・・) を返す
>>224 (f y)のfが(lambda (x) expression)におきかわっただけだろ。
>>226-227 もう一度考え直してみました。
(lambda (y)・・・)は、式(lambda (x)・・・)を返す式で、
(lambda (x)・・・)の式は(begin・・・)となっている。
((lambda (y)・・・) 10)は、(lambda (x)・・・)の引数を
10として計算し、(lambda (x)・・・)を返す。
このときの(begin・・・)の返す値は何処へ行くのかは不明。
(どこへ行ってしまうのでしょうか・・・)
引数10で計算済みの(lambda (x)・・・)を引数1で計算する。
出力は11になる。
ここでのポイントは、(lambda (y)・・・)は、式(lambda (x)・・・)を返すのであって、
最初に引数を10で計算したさいの値は(begin・・・)の返す値ではない。
このように考えてよいでしょうか?
>>225 出展は下記URLの中ほどになります。
ttp://karetta.jp/book-node/gauche-hacks/009133 勉強途中でわからなくなってしまったので質問いたしました。
>>228 あのね、きっとlambdaんとこはレキシカルスコープや
生存期間を理解してないと読み解けないですよ?
それと、普通はあんな書き方はしないんだから
誤解しないでよね
ぶっちゃけると、そのurlのはてめーのお勉強にはまだ早いんだよ
イカれてるけど基本を踏まえた上でのもっと先の話なので
>>228 > このときの(begin・・・)の返す値は何処へ行くのかは不明。
> (どこへ行ってしまうのでしょうか・・・)
どこもなにも、 (lambda (x)・・・) はまだ呼ばれていないのだからそんな値は存在しない
呼ばれないまま (lambda (y)・・・) から返されただけ
(・・・ 1) が実行された時点で初めて呼ばれ (begin・・・) が実行される
本当に知りたいなら、誰にも教わらずに理解できるだろ
「その言葉が聞きたかった」ってなるまで放置するべきパターンだな
このスレなんのためにあるんだよ…
雑談。
話が出来る最低レベルに達してないってことかなと。もう少し勉強してね。
神よ…
>>233 が猥談に見えた私をお許し下さい…
変な奴が居着いちゃったなあ
CAR歴も括弧の山の賑わい
カッコのことなど忘れてコッカらのことを考えよう
>>235 YコンビネーターのYみて、エッチなことを想像した私も同罪
>>228 青年よ、高階関数を考えすぎて後悔するなかれ。
青春時代を無駄にしてはいかん。女性を口説く術を身につけるのが先よ。
たかがLisp、されどLisp
cond駄洒落書いたらこのスレ終わりにしないcar?・・・・・はっ!
>>228 とりあえず、お茶でも飲んで一息ついて、もう一度頭の中を整理してみたらどう?
lambda式を返すんじゃなくて、lambda式を評価した物を返すのよ。
んで、lambda式を評価すると、手続きオブジェクトとかクロージャと呼ばれるものが返ってくる。
これには、lambda式中の処理の内容と一緒に、lambda式が評価された時点での、
変数の値とかも一緒に保存されてる。
評価順序すら判ってないんじゃどうしようもねーよ
>>225 前にbiglooのソース見たら、明らかにマクロエクスパンドした結果が並んでた
オープンソースと言いながらマクロは公開しませんよということなんだな
>>246 自作の糞マクロよりよっぽど見やすいだろ、
というありがたい配慮、もしくは君ら(下等生物)は
展開形でもデバッグしてなさいという意思表示、
オプソ(他人)にはその程度の期待しかない、
金を出す奴しか相手にせず、
横の繋がりは常に懐疑的であり続ける
なんというSchemerの鏡・・・
俺らもこうありたいですな!
>>246 そして惜しげもなく便利なマクロをちりばめてくれるGaucheのすばらしさ
249 :
デフォルトの名無しさん:2010/10/15(金) 19:28:40
Gauche のビルドには最新のリリース版が既にインストールされている必要がある。
Gauche で書かれている部分が含まれていて、それを処理するために Gauche を必要とするから。
Gauche がインストールされてない状態で svn trunk を拾ってきてもビルドできない。
リリース版ではそこんところを処理してからパッケージに含めている。
このようにプリプロセスやマクロ展開、コンパイルに自分自身を必要とする場合があり、
素の状態で配布してもビルド不可能だったりする。
展開した状態で配布してるのはブートストラップ問題を回避するためじゃないかな。
git master の方には元コードがあったりしない?
>>249 お〜、良書復活。ゾウさんに会えてオヂサン、うれしいゾウ。
フラゲできそうだね
これはアトムですか?
Gaucheにatom?はないが、
(define (atom? x) (not (pair? x)))
これでいいのかな?
vectorとかatomじゃないものは色々たくさんありそう
>>253 その認識でいいと思うよ
コンテナ以外をatomにしたら文字列とかどっちなわけ?って話になる
>>253 「Gauche に」っていうか「Scheme に」無いんだけどな。
アトムと言うからには分割不能なものってことになるわけだけど、最後は全部 1 と 0 じゃね? ブール値こそ真のアトム!!
と、まあ極論すればこうゆう主張もできるわけで、何を以って分割不能かってのはこれと決められるものでない。
(Scheme の意味論は必ずしも機械の内部構造と一致しないので、もちろんこれは説明用の極論です。)
ペアでないものをアトムと考えることが便利である場面ならば、そのように定義すればいい。
でも、もちろんそれはあくまで利便性で決めるべき話で、唯一無二の正解があるわけではない。
ところで「原子」の意味のアトムも分割不能な存在として名付けられたわけだけど、今じゃ分割しまくり。
今の物理では「分割できないもの」は素粒子と呼ばれるようになった。
もし素粒子が内部構造をもつことがわかれば今度はその構成要素が素粒子と呼ばれるようになる。
世の中変われば定義も変わる。
molecule? particle?
(expload 'atom)
ケツがうんこまみれって…
考えうる限り最悪のシチュエーションだな。
そいつ心が広すぎるだろう常識的に考えて。
TAOの連載記事にあった「逆パンツからタラリ」を思い出した。
262 :
260:2010/10/16(土) 13:54:57
誤爆した!
マジでスマンこってす。
中学生のとき、同じクラスに米屋って呼ばれてるやつがいた。
俺も自然に米屋って呼んでた。
たぶん家業が米屋なんだろうなと漠然と思ってた。
で、こないだ同窓会で再会したんだよ。
そこで知った衝撃の事実。
そいつの姓が「米屋」だった…
264 :
260:2010/10/16(土) 20:35:07
また、誤爆した!
マジでスマンこってす。
次の方どうZO!
エントリーナンバー3番!好きな食べ物は芋けんぴです!
中学生のとき、同じクラスにハレル屋って呼ばれてるやつがいた。
俺も自然にハレル屋って呼んでた。
たぶん家業がハレル屋なんだろうなと漠然と思ってた。
で、こないだ同窓会で再会したんだよ。
そこで知った衝撃の事実。
そいつの姓が「電池」だった…
LetOverLambdaの人がemacsダメって言ってるけどvim使ってる人います?
構造エディタってのはどうなの?
>>268 Paul Graham。
てーか、vi派ならEmacsでviper-mode使えば良いんだよ。viper-mode。
両者の長所が合わさって最強に見えるが、周囲からは変態だと思われる。
>>270 両方を無意識に切り替えることができれば、できれば‥‥‥、できる人は変態かなあ、やっぱり。
>>270 viper-mode って vi を完全に再現してたっけ?
viはほぼ再現だが、Vimとか他のクローンにはある高度な機能がないので使いにくい。
vimpulseとか使えばいいけど、SLIMEでLispするならそこまで凝らなくてもいいと思う。
>Google 急上昇ワード(日本)
>9. lisp
だんだんと汚染されてきたなぁ
どうせ数ヶ月もしない内に消えて忘れ去られるユニットよ
悠久の時を超えてきたlisp様にすればほんの一瞬に過ぎないのさ
>>271 使えば慣れる。どうせEmacsのキーバインド前提にしてる所だと、
Emacsのキーバインド使わざると得ないし。
>>272 もう完全に慣れきってるから、良く憶えてないけど、
元々使ってたnviから移行したときは、挙動に違和感があった記憶がある。
>>273 足りないとこだけEmacsの機能使っちゃえば、割と使い易いよ。
少なくともEmacsのかったるい基本編集コマンド使わないで済む。
そういう意味でも、viper-expert-levelは5で良い。
>>274 大丈夫あっちは歳をとるがこっちは歳をとらん
このスレの連中が老い衰えて死に絶えてもLispは残ってんだろうな。
俺の書いたCommonLispやSchemeのプログラムはいつまで動くんだろ。
私は引退いたしますが、わがLispは永久に不滅です。(それはLispが数学だからです。)
ttp://gihyo.jp/news/interview/2010/rasmus?page=1 略
Rasmus:学術的に純粋であることと実用的であることはあまり関係がありません。
略
確かに美しくないですが,正しく動くことが重要なのです。
それに,我々が解決しようとしている問題は美しい問題ではないですよね。
美しくない問題を美しくないツールで解決することに何の問題もありません。
美しいツールは美しい問題を解決するためには非常に効果的かも知れませんが,多くの場合は必要がありません。
略
彼女は美人な方がいいがなあ。羨ましがられる。
>>281 自分が心底ほれ込むことが大事なわけで‥‥‥やっぱり美人がいいかあ。orz
自信がつくぞ。
どんなカッコいい言語を使うかより、どんなものを作ったかを誇れよ。
美しくはなくてもカッコには自信があります(キリッ
>>284 lispが素晴らしいのは
>>246 みたいなことができること
客に全部のノウハウ出さなくて済む
展開したマクロは元に戻すこともできる
都合の悪い部分だけを選んで展開しておくこともできる
展開した形で配布しても作り手側は特に困らない
他の言語でやろうとしたら一仕事の事が、
LISPはリスト処理を行う程度の能力
つまりそのソースにおいて製作者は神になれる
その代わりに括弧の呪いに罹る
>>288 マクロ展開って一意性があるんか?
素因数分解なら一意だから元に戻るだろうが、マクロ展開された結果から
元のマクロを復元するなんて無理だろ?
おっと、そっから先はシークレットだ
マクロ適用したコードを公開するのは
コンパイルしたバイナリを公開するのと
意味的に等価だよな
マクロなんてなくても、かなりなところまでは書けるじゃん
無理なのもあるけどさ
なんでLisperはそんなにマクロに拘るんだい?
>>290 On LispのATN使えばできそう
Schemeで相当するのってどれだ?
>>295 無理じゃないのか。
組成式C4H10からそれはブタンかメチルプロパンか答えろみたいなもんじゃないか?
それともLispはアセンブラみたいに逆アセンブルできんのか?
間違えた、組成式じゃなくて分子式だな。
>>296 無理だと思う。同じS式に展開するマクロがふたつ以上あれば、区別が付かない。
そもそも、そのS式が展開後のものか、最初からその形か、すら区別できない。
むしろ、基本的には区別できてはいけない。それがマクロの本質じゃないの?
>>298 ソースリストから元のマクロを正確に推定するのは無理でしょう。
でも元々の目的は
>>246の状況で読みやすいソースを入手する事ですよね。
公開ソースから人間が推定したマクロと公開ソースを読み込ませて
推定したマクロで置換できる所をすべてマクロに置換したソースを出力する、
という処理なら可能ではないでしょうか。
>>299 それはもう、人間の手で変換してる時点で、かつ推測の時点で、「元に戻す」ことができてないよね?
そもそも、
>>288は
>>246から離れて、より一般的な話をしているという理解だったんだけど。
マクロ展開後のコードを単に読み易くしたい、というのなら、そういうアプローチで良いんじゃないかと。
Scheme 手習い
どんな感じ? 買った人。
ここに居るような人は英語で読んでるだろうな
お絵かきスペースとジャムスペースの再現度次第だな
表紙のゾウさんの絵
どこまで再帰が細かく書かれてるのか?
虫眼鏡で覗いたらば
>>302 つか普通google readerのLisp関連くらいは読むだろ
日本語だけだとものすごく偏った所の発言しか拾いにくいし
>>301 尼で注文したが、22日発売の他の本は発送されて、Scheme手習いは未発送。
とゆーか、これって復刊なんだよね?元々読んでたことがある人は、このスレにはいないのか?
The Little Schemerを読んでる人は多いみたいだけど。
>>306 もってたよ〜ん マグロウヒルのもの
Littleももってるけど日本語の方が楽チン
訳した人は同じ人だね。SICPのマグロウヒル版を訳した人だよ。
昨日Scheme手習い買ってきたけど、いかにも昔の本だなという訳し方で、ちょいとキツかった。
素直に原著を買い直すつもり。
>>308 んなこたぁ、ね〜だろ。どこが昔なんだい?????
関係者??
まあ
>>308がちょろっと引用してくれるのを楽しみにしてる
途中で送信しちゃった。
>>305 Google Groupsのc.l.lとかc.l.sなら読んでる。
たまに面白い話題が出るよね。
最近よく聞く 手習いって なんのことだろう、って思ってたら、The Little Schemer なんだね。
>>303 で気づいたよ…。
「else?」とかのジョーク、どう訳されてるんだろうなぁ。
ちょろっとページを開いて、キツいと感じるとこを適当に抜粋。
「leftmostが何をするか言うことができますか。」
「leftmostは可能な3つの場合すべてで質問をする必要がありますか。」
「なぜalignがゴールに向けて進展している保証ができないのでしょうか。」
読んでると、なぜあなたはカタコトですか?と聞き返したくなる。
問答形式の基本文体のような気もする。
化学の学校思い出した。
下手な直訳って感じだね
訳者はAIだな。
文脈が読めれば別なのかもしれませんが、
ちょっと意味が判らないですね。
>316
マグロウヒル版しかもってないんで確認できないけど
旧版のP90、leftmost関数にはそんな表現はでてこないけどなぁ。
やわらかい表現で初心者にLisp遊びの楽しさを伝える良書だったと思う。
新版がでると聞いて心配だったのはatom?が使われてたり、cond節の構文が
旧版ではelseにtが使われていたこと。当時入手可能だった処理系は
PCScheme(CRCが日本語化)とMacSchemeくらいでatom?は関数として組み込まれて
いた。現代のGaucheにはないから初心者には(define (atom? x) (not (pair? x)))
を加えておいてとか説明が要るんじゃないかと思ってた。Gaucheは組み込み
関数も書き換えることができるから、number?を書こうなどという部分も
そのまま試せるんでいいと思う。これからScheme/Lispを始めようという人には
良い本だと思うがね〜。
> (define (atom? x) (not (pair? x)))
() ってアトムなん?
だよ?
>>322 アトムってことになってるんだけど
リストでもあるんだよね。
なんでこうなるんだろうね?
(pair? '())=>#f
(null? '())=>#t
だから
Gauche なんかは CLOS ベースのオブジェクトシステムを導入してるので値 (オブジェクト) が型の情報をもっているような感覚だけれど、
R6RS によって導入された操作的意味論の世界観ではある値がリストであるということは「list? が真を返すかどうか」によって定義される。
ある値がアトムであるかどうかは atom? を適用して真であるかどうかによって定義される。
(define (atom? x) (not (pair? x))) と言う定義の下では空リストはアトムとしか言いようがない。 その定義が妥当かどうかは別にして。
Scheme手習いは 「()はリストでもアトムでもあるからです」
ってなってるね。
リストは要素を入れる風呂敷包みみたいなもの
空リストは要素がないただの風呂敷なのだけど入れ物には違いないのでリストに分類
風呂敷は空の状態ならただの物だからアトムに分類
こんな感じかな。
関数でこういう風に定義したからって言ってしまえばそれまでだけど、
無意味な定義ってのは受け入れ難いんじゃない?
>>328 むしろ、無理に理由を付ける方が混乱しないか?
数学みたいに、都合が良いから、矛盾がないから、
って感じに割り切って付き合う方が楽だと思う。
>>329 その通りだね。複素数の加減算の定義はそうすると体系に矛盾をきたさないからね。
定義も慎重に選択しているはずなんで、Scheme手習いの著者も考えがあっての
ことだと思ったんだよ。
空リストはリストの一種。
そして構成要素をもたないからアトム。
むしろこれより自然な定義はないんじゃないか?
物理の原子、分子のイメージに引っ張られない?
リストは原子の集まりである分子のイメージでいると
なんにも入ってない分子が原子って何だ?と。
人間は柔軟に考えることも出来るんだからいいんじゃね。
GaucheにCommonLispのLTKみたいのないのかな?
Gauche-GTKはWindowsじゃ駄目みたいだし
>>334 FFIで適当なツールキットを使えば? c-wrapperとかCygwinでも動くらしいし。
GTK+とかも多分動くんじゃない?
個人的にはRacketとかIronSchemeとか使ったほうが楽だと思うけど。
clのdefmacroの挙動について質問。
case sensitiveなclisp環境でパッケージ跨って使えるアナフォリックマクロを作ろうと思って
こんなん書いてみた。
; begin amacros.cl
(export 'alambda)(export 'case-sensitive-package-p)
(defun case-sensitive-package-p (&optional (pkg *package*)) (and (package-case-sensitive-p pkg) (package-case-inverted-p pkg)))
(defmacro alambda (params &body body)
(let ((self-symbol (intern (if (case-sensitive-package-p) "self" "SELF"))))
`(labels ((,self-symbol ,params ,@body)) #',self-symbol )))
; end amacros.cl
> (in-package :cs-user)
#<package cs-common-lisp-user>
cs-user> (load "amacros.cl")
t
cs-user> (macroexpand '(alambda ()))
(labels ((self nil)) #'self) ;
t
cs-user> (in-package :user)
#<PACKAGE COMMON-LISP-USER>
> (import 'cs-user:alambda)
T
> (macroexpand '(alambda ()))
(LABELS ((|self| NIL)) #'|self|) ;
T
(:user でマクロ定義すると逆に、self が常に大文字シンボルに。)
とまあ、マクロ定義した環境のケースの扱いで intern されるシンボル名が
現在のパッケージを無視して大文字か小文字に固定されちゃう。
case-sensitive-package-p の動作は現在のパッケージのケースの扱いに依存するのに
どうして intern だけがこうなるのかよくわからない。
どなたか解説&解決方法教えてください。
補足。
>case-sensitive-package-p の動作は現在のパッケージのケースの扱いに依存するのに
これは、たとえば
(defmacro alambda (params &body body)
(let ((symname (if (case-sensitive-package-p) "intern" "INTERN"))
(self-symbol (intern symname)))
...)
のように定義した場合、symname は *package* の値に応じて "self" だったり "SELF" だったりするのに対し
self-symbol はマクロを定義したときの *package* のケースの扱いに応じて |self| か |SELF| か
固定的に決まってしまう、という話です。
>>336 CLISPのコード(src/package.d)を見たところ、cl:internとcs-cl:internの違いは、
引数のシンボル名をinvertするかどうかだけの違いのようです。
なので、case-insensitiveなパッケージではそういう動作になります。
readerとかprinterとか色々いじって、擬似的にcase-sensitiveに見せてるわけです。
ぶっちゃけ、cs-cl:symbol-nameを使えばいいのではないでしょうか。
こちらはinvertされたシンボル名を返します。
(defmacro alambda (params &body body)
(let ((self-symbol (intern (symbol-name 'self))))
`(labels ((,self-symbol ,params ,@body)) #',self-symbol)))
みたいにして。
なお、case-sensitive packageの存在意義が理解出来ないので、意欲に欠けます。
CLISPも常用してませんし、割と適当なこと言ってるかもしれませんが許してください。
>>338 プログラムの動作としては symbol-name の利用でいけました。ありがとうございます。
が、
>>337 のような書き方をした場合に、
(1) case sensitive なパッケージで defmacro した場合:
(1-a) case sensitive 環境でマクロ展開
symname := "self", self-symbol := self
(1-b) case insensitive 環境でマクロ展開
symname := "SELF", self-symbol := |self| (i.e. (intern "self"))
(2) case insensitive なパッケージで defmacro した場合:
(2-a) case sensitive 環境でマクロ展開
symname := "self", self-symbol := SELF (i.e. (intern "SELF"))
(2-b) case insensitive 環境でマクロ展開
symname := "SELF", self-symbol := SELF
となってしまうロジックがわかりません。
また、
>>338 のように if でなく symbol-name で "self" と "SELF" を使い分けるのは
アリな理由もわかりません。
clisp の実装上の都合なのか、CLの規格によるものなのか, etc.
何か追加情報ありましたらよろしくお願いします。
>>339 真面目に答えますと、case-sensitiveなパッケージは処理系独自拡張なのはご存知ですよね?
ただ、ANSI Common Lispは、case-sensitiveなシンボル自体は扱えるんですよ。|symbol|みたいに。
なので、CLISPでは、独自に擬似的なcase-sensitive環境を実現するために、
>>338でも書きましたが、
case-sensitiveなシンボルを使うことで大文字小文字の区別を付け、readerやprinterなどに細工して、
それっぽく処理してる訳です。cs-cl:symbol-nameとか、cs-cl:internとかも、その一環です。
で、そういった動作になるのは、(1)ではCLISPの独自拡張のcs-cl:symbol-nameやcs-cl:internが、
(2)ではANSIのcl:symbol-nameやcl:internが使われるからです。:userと:cs-userの両パッケージ内で、
clパッケージとcs-clパッケージのsymbol-nameやinternを、それぞれ試してみてください。
また、この辺りはreaderとパッケージの動作を理解していないと、混乱するかもしれません。
この説明で納得できないなら、まずCommon Lispのreaderとパッケージの仕組みを把握してから、
CLISPのコードを実際に読んでみてください。難しいコードではないので、すぐに理解できると思います。
CCLユーザで、本来Schemerな私の説明より、ずっと解り易いのではないでしょうか。
schemeで今までに定義したマクロの名前一覧は
何かの変数に保存されているのでしょうか
>>341 処理系独自の拡張がある場合もあるが、基本的にはされてない。
特に R6RS の考え方ではマクロは実行時には不要なものであるので、
デバッグ用途を除いて必要とするのであれば設計がよくない。
>>340 自分がどこで論点をとり違えていたのか気付きました。
>>338 の段階で cl:intern と cs-cl:intern の違いを指摘されていたのに
intern 側の挙動の違いにちゃんと目を向けていなかったようです。
お騒がせしました。
ところで clisp の cs パッケージの実装がアホだなぁと実感するのは
たとえば #\space を評価すると #\sPACE になるところだったり。
Common Lispは大文字しか使えないから
他の言語との連携で不便だね
"className"をinternしたらCLASSNAMEになるんだっけ?
>>344 普通に使えるけど
[1]> (intern "className")
|className| ;
NIL
javaと一緒にlisp系を使おうとするとClojure以外に使ってる人がみつからない
Kawaとかもあるのに
なんでなんだろ
マクロ工夫すれば他の言語に移植するの簡単だからなのかな
ふと疑問に思ったんだけど
labels じゃダメだ! flet じゃなきゃダメなんだ!
ってのはどういう状況なんだろう? にわかに思い付かないや。
348 :
本田:2010/10/28(木) 23:06:21
http://www.fukkan.com/fk/CartSearchDetail?i_no=68314354&tr=s 皆さまのご投票により、下記タイトルの復刊がついに決定いたしました!
待望の復刊です。ぜひご購入ください!
――――――――――――――――――――――――――――――――――
■『Scheme手習い』(最終得票数 57 票)
著者】Daniel P. Friedman and Matthias Felleisen 著
元吉文男・横山晶一共訳
【発行】オーム社
【予価】2,940円(税込み)※予価の為、価格が変更する場合がございます。
【発送時期】2010年11月中旬
Scheme入門書の定番を翻訳!
そんな宣伝しなくても既に尼で買ってあるわ。
>>346 abclとkawaをいじってみた感じ、jvm上でもscheme系のが軽量な分初期化が速いなーとおもった。
>>344 すぐ上の
>>340で、case-sensitiveなシンボルはANSI Common Lispで扱える、
って書いてるじゃん。それどこから得た知識?
>>347 fletじゃないといけない場合は思い付かないけど、便利なケースはCLtL2に書いてた。
「7.5. Establishing New Variable Bindings」より。
> Using flet one can locally redefine a global function name, and the new
> definition can refer to the global definition; the same construction using
> labels would not have that effect.
ただ、labelsとletとfuncallの組み合わせで代用できる気がする。
>>350 tomcatで動かす場合、初期化が軽いのはあんまり意味がない
ずっと動かしぱなしだから
>>351 >>352 わざわざ global definition と同じ名前を付ける必要があるのって
関数名自体が dynamic scope で扱われるときとかかな?
flet と labels で検索するとそれらしい記述が引っかかるし。
で、(call-next-method) もどきとして使うとか。
他人が作ったマクロとかが特定の名前の関数を使うことを前提としていて
それをフックして挙動いじりたい場合とかには有用なのかな。うーん。
マクロとの絡みで言えば
>1.マクロ展開で想定外の再帰を防ぐ
は確かにそうなのかもしれない。それが必然的に発生する状況ってのは俄におもいつかんけどさ。
>2.可読性の向上
labels で複数関数作ってぐちゃぐちゃと相互呼び出ししてる場合は
そういうものだって把握しておかないと読み難いかもしれない。
けど、そういう関数はそもそもちゃんと読まなきゃわからないんだよね。
でも、flet だから再帰とかないとわかっていることが可読性の向上させるサインになる、
というのはなんか納得できん。
>3.性能
>In addition to the other reasons given, FLET can be a bit
>more efficient in some implementations.
あくまで some implementations では、なんだよね。
flet で書いたコードと labels で再帰/相互呼び出ししないで書いたコードは
高性能なコンパイラ持ち処理系でバリバリに最適化すれば効率変わらなそう。
S式であらわされたデータをデータベースに保存したいのですが
そのままテキストとしてMySQLに保存させるのはあまり賢い方法でもない気がします
何か推奨された方法のようなものはないでしょうか
>>355 単純に永続化したいだけなら、極端な話writeで問題ないと思うんだけど。
データをどう使うかっていうのが、こういう場合の選択の基準になるんじゃないの?
一般的な話なら、AllegroCacheみたいな、オブジェクトデータベースが賢いと思う。
既存のKVSとかRDBMSに乗っかりたいなら、マッピングするしかない。
あとは、扱うデータが少ないなら、Object Prevalenceとかもある。
>>355 特定ディレクトリにテキストファイルとしてほぞんして、
そのパスをDBに突っ込むのではだめなんかい?
Part27 にあった冪集合に挑戦してみて、結局同じなのになったんだけど、
(define (power l)
(if (pair? l)
(let ((l2 (power (cdr l))))
(append (map (cut cons (car l) <>) l2) l2))
(list l)
))
これって末尾再帰には出来ないのかな? ちょっと考えたけど分からなかった。
>>358 んなもん楽勝だろ
でも今はISP規制されててやる気起きない
ちょっと考えた=何も考えてない
簡単すぎて一々答える気にならんな
(define (pow1 p xs)
(if (null? xs)
p
(pow1 (append
p
(map (lambda (ys) (cons (car xs) ys)) p))
(cdr xs))))
(define (pow xs)
(pow1 '(()) xs))
(time (power (make-list 20)))
(time (pow (make-list 20)))
前者の方が速いんだな
>>363 感覚とかそういう問題じゃなくって、学校の状況とかそういった
社会条件が違うってことだろ。
グレアムがグラハムになってしまう程度には違う文化だしな
ハイスクールの最低カーストがまず日本と違いすぎるからな
ポールグレアムがグラハムかグレアムかで迷ったときは
DQ6の隠しボスの名前を思い出すといいよ。
ポールグレアム
ダークドレアム
な。似てるだろ。
グラハムと言ったら世界の料理ショーな
グラハムクラッカー
グラハムと言ったらグラハムボネット
♪オールナーイトローング♪
Petite Chez Scheme では foreign-procedure って使えないの?
>>372 日本でChez使ってる人の数って二桁いかないと思うぞ。
素直に公式ドキュメント当たって、駄目ならコミュニティで聞いた方が早いと思う。
>>373 有名ではあると思う。原書含めて、ここでも何度も出てくる名前だし。
>>374 ドキュメントはあくまで Chez Scheme のしかない。
Petite の方はコンパイラ以外は基本的に全部有るとは書いてあるけど、個別の説明は無い。
foreign-procedure を使おうとするとエラーメッセージでコンパイラが無い旨が示されるのでこの機能はコンパイラが必要なのだろうとは思うもののダメモトで聞いてみた次第。
Chez Scheme のユーザーはあんまりいないと思うが、 Petite Chez Scheme はかなり人気がある方じゃね?
作者が Scheme 界で特に活躍している人でもあるし。
>>375 名前といい状況といい、何かLarcenyとPetit Larcenyの関係みたいだな。
あっちも、ろくにPetitのドキュメントないんだ。
Kent Dybvigは有名だし、海外だと良くベンチマークで並んでるけど、
今は国内だとGaucheが人気ありすぎるからなー。PLT使ってる人すら少数派だし。
逆に、海外だと全然Gaucheの名前が出てこないのが面白い。
というか、もし日常使いしてるなら、印象を教えて欲しい。Chezってどうなの?
グラハム、グラハム言ってたから、今日 生ハムを グラハムに空目した。
>>376 chez は r6rs 処理系としては最も規格をまともに実現していると思う。
特にマクロまわりは。 kent 氏の立場を考えれば当然だけど。
ただ、現実の用途としてスクリプト言語的な使い方をする場合にはテキスト処理がネックにはなってくる。
r6rs が要求する (そして chez が実装している) Unicode 対応だけでは現実に多く使われている CP932 や EUC をきちんと処理するのは面倒。
ドキュメントも英語なので、 (多くの日本人がそうであるように) 英語が苦手だとつらいかも。
その点、 Gauche は日本語を意識したものになってるし、ドキュメントも公式に日本語で用意しているってところは強いな。
ただ、 Gauche はマクロまわりのバグとかがあるので高度なマクロを書こうとすると悩むことになる。
ベンチマークを意識したことは無いな。
素人がスクリプト言語的な使い方をする分にはぶっちゃけた話、速度が10倍違ったところで大したこと無いから。
>>378 なるほど。ありがとう。やっぱ文字コード周りは面倒だね。R6RSで枠組みが出来ただけマシだけど。
R6RSのマクロ周りっていったら、ラップされた構文オブジェクトの扱いの問題で、
IkarusでSRFI-99のリファレンス実装が動かないとかあったな。あの辺ナイーブで好きじゃない。
そういえば、Ikarusの作者のAbdulaziz Ghuloumって、Kent Dybvigの教え子なんだよね。
ベンチマークは単に、注目度の目安ってことで。Schemeだと速い処理系って割と使いにくいし。
380 :
デフォルトの名無しさん:2010/11/15(月) 18:50:16
348の本のコードってGaucheで動かせる?
勢いで買っちゃったんだけど
そんなわけでマクロを書いたら動作確認は petite chez scheme を使うことが多いな。
ただ、以前にも話題になったけど、 chez は implicit facinlg が採用されてるので、メタレベルの指定が間違ってても動いてしまう。
確か、この挙動は r6rs でも認められているとレスが付いたと思うんだが、具体的にどこに記述がある?
フェイズの概念の導入でダークコーナーが片付いたと思ったけど、そう単純な話でもないみたいね。
r7rs ではまた別の方針になったりするんだろうか? もしそうなったら影響は大きいぞ。
racketはあんま使ってる人いないのかな?
yaccとpython組み合わせればlispが出来ることの大部分ができる
蛇に騙されて楽園から追放されたらどうするんだ?
マクロ =俺言語からyaccで変換
Lisperからみたc++の立ち位置ってどんななんだろ?
Cで十分なのに無意味にlambdaとかいろいろ作ってる様にみえるんだろうか
それなりに理由があって作られたものの是非は
かなり後になってからでないとわからんもんだ
グリーンスパンの第10法則
>>386 ABIの魔窟とか、お前FFIで使い辛いんだよとか、規格が尖り過ぎとか、
規格の大きさで唯一Common Lispと戦える存在とか、Boostの立ち位置が凄いとか、
気付いたらオブジェクト指向からジェネリック指向になっていたでござるとか、
色々愉快な言語だよね。自分では使わないけど、傍から見てると面白い言語。
CLerとしては性能面でのライバルだし、Schemerとしては完全に別世界の存在。
無理矢理lambdaとかはむしろ感動した。あそこで新しい言語作らないのが逆に凄い。
出自がcfrontだけに、なんでもかんでも見えるコードに落とそうとするからなあ。
ランタイムの言語による支援を前提にすればいいのに。
>>386 自由にシンタックスを作れない不自由な言語
覚えなきゃいけない記述っ方法が山ほどあって近寄りたくない言語
# だけど, たまにくるんだよな. C++ の仕事 orz
LAND OF LISP受領。
ハァハァ
MingwでGauche-gl使えるようになりそうだね
楽しみだな
以前から使えることは使えたけどね。
ビルドは素直に出来なかったので、正式にサポートされるのはありがたいな。
kawa のJavaインターフェイスって頻繁に使用変わってないか?
そろそろ固定されたのかな
最初から「良い」デザインを望みすぎると、結局ものができないよ。
できそうなものから作ってかないと。
ていうか、まずは入力はreadに任せちゃえば?
schemeとclの人口比ってどんなもの?
日本ではgaucheがあるからschemeの人口多いみたいだけど
ここ2〜3年ぐらいでCLな人が増えたという印象
単に俺がネットでよく見かけるかどうかという範囲での話だけど
日本人にはKCLからのCLの血が流れている仮説
Chez Scheme って1万ドルもすんの?
Ruby は JIS 規格化にとりかかってるみたいでドラフトが公開されたけど、 Lisp 系言語は JIS 規格化の予定とか無いの?
ISLISP とか DSSSL とか、実質的に死んでるのはカウントしない方針で。
具体的にはSchemeとCommon Lispってこと?
野次馬的にはCommon Lispは厚さが死ねるからやんないんじゃない? とか。
あとCommon LispはANSIだけど、Schemeはそういう標準機関からは出てないような。
>>402 ぶっちゃけ ISLISP を JIS 化するつもりだったんじゃね?
ISLISPは、JIS X 3012:1998
DSSSLは、JIS X 4153:1998
だけど、ノーカウントで、っていう意味だと思う
R5RS にしても R6RS にしてもその冒頭で「好きに使え」的なことを述べている。
だけどなー。 JIS で規格化したらその文書の著作権は JIS が持ってることになるんだわ。
例えば ISLISP の規格書って何円するか知ってるか?
5,040円 だぞ!
SICP より高いんだぞ!
ペラい冊子にそんなに払えるか!
まっとうなコミュニティがあるんだから、あえて規格団体に頼る必要はないと思う。
>>407 その昔, 企画協会から RS-485 の仕様(英文)を買ったら、
a4 4ページ程度のコピーが送られてきて \3000 以上とられた
覚えあるもんなぁ...
Schemeを学び始めた当初は「なんでこんなに実装の数が多いんだ畜生」と思うが、
理解していくにつれ「俺ならこう実装するよ畜生」となって更に実装の数が増えるという。
Scheme無しでは生きられぬ、生きることすらままならぬ、生きているかもわからない、
そんなゾンビができあがる。Lispはまことに罪深い。
公式から落せるslibのstring-join
(string-join "," "a" "b" "c") ;"a,b,c"
gauche のstring-join
(string-join '("a" "b" "c") ",")
>>409 実質的にISLispが相手にされていないのは否めないと思う。
Common LispやSchemeと違って、コミュニティで開発している処理系も、
実用されてる商用の処理系もないし、動きも外からは見え難い。
OKI ISLispもWindows版だけ公開されて、Linuxとかはその後音沙汰がないし。
もしもまだ誰かが動いているなら、もっとそれをオープンにしてくれないと、
Lisper自体が少数民族な今の御時世、ただ忘れられていくだけじゃないかな。
仮にISLispに興味を持った人がいたとしても、興味の持って行きどころがない。
最近地味にLispが再評価されてるんだし、折角のチャンスなのに勿体無い。
>>412 Rubyの場合は「規格にないと役所とかで採用しづらい」ということで
JISでコアの部分だけを定義しようという流れ
言語自体はこれからも変化させる気満々
kawaがslib読んでくれない
slib:foo
をjavaのslibパッケージだと解釈する
>>416 CommonLisp を基準にしたら ISLISP がそれより小規模なのは言われるまでもなく当然だ。
「実用されてる商用の処理系もないし、動きも外からは見え難い。」や「もっとそれをオープンにしてくれないと」へ反応したつもりだった。
小規模ながら確実に活動は存在し、成果もオープンにしているので
>>414 が言うほど ISLISP が死んでいるわけではないと主張したい。
>>419 教えて頂いたOpenLispが、予想以上にちゃんと頑張っているようなのは理解しました。
商用処理系については認識を改めます。CLより速いと言ってるのは野心的で興味深いです。
ただ、どうせなら、同じ環境におけるCLやSchemeのGabrielベンチマークの結果も欲しかった。
さておき、実際のISLisp自体の動きが外に見えていないのは事実ではないですか?
ISOのWGのnewsやmeetingsもまるで更新されていませんし、分かり易い場所に、
動きを追える情報源もないように思えます。活動してるらしいのは分かるのですが、
何処で、誰が、何時、など、その実態が部外者にはあまり伝わってきません。
私がオープンにして欲しいのは、成果へ至る過程です。こちらも必要十分だとお考えですか?
勘違いして欲しくないのですが、ISLispという規格自体を否定したいわけではありません。
単純に、興味があるのに、知るための手段が少なくてもどかしいだけです。
>>417 ああ、なるほど。それは確かに。情報感謝。
ただ、コアの機能の定義だけでも、結構苦労しそうだなあ。
広報活動には手間がかかる。
手間をかけたくなきゃ金がいる。
))))))))))))))
extra close parenthesis
slibのテキスト処理関数を眺めてたら
入出力がstringでなくてportになってる関数が結構あった
わざわざportにする理由って何?
ambあたりと組み合わせると便利な使い方でもあるの?
>>425 Scheme入ってしばらくの間は、俺もそれ思った。
そのままファイルなどに入出力できるから、汎用性が高い。
ユーザー定義のポートでごにょごにょできる。あと、単純に速い。
なんと、週末が遠いいなー
(set! today (car (cdr (cdr this-week))))
>>430 *** ERROR: cannot change constant value
>>428 おお、自己末尾再帰もちゃんとループにするんだ。
さすがに相互末尾再帰はC++コンパイラのTCO任せ?
高階関数使いまくるのは結構厳しいな。
まじめにやるとvmを展開したような出力になる
なぜracketはslib使えないんだろ
どうしても独自仕様にしたい理由でもあるんだろうか
なんかshiroさんがイカ娘に侵略されてるでゲソw
Schemeの継続について教えてください。
(define cont #f)
(do ((counter 0 (+ counter 1)))
((= counter 10) 'end)
(if (= counter 5)
(call-with-current-continuation (lambda (k) (set! cont k)))
#f)
(write counter) (newline))
(cont #t)
これを実行すると (do ...) の部分で 0 から 9 までの数字と end が表示され、
その後 (cont #t) の部分で 5 から 9 までの数字と end が表示されます。
継続は処理を再開すべき地点を覚えていても継続が作られたときの変数値までは
保存していなかったと思います。そうだとすれば counter が一度 10 になって
しまえば、継続を再開したときも counter は 10 からカウントされると思う
のですが。実際には counter は 5 からカウントされるようです。
do の内部で作られた継続は特別に do のローカルな変数値を保存するという
こどなのでしょうか?表示の便宜上行頭に全角スペースを使っています。
>>436 doのマクロを展開すると再帰呼び出しっぽい形になって
counter=5の時点の環境を保存しているはず。
再帰呼び出しと継続による環境の保存とは無関係だと思ふ
doは名前付きletと同等の扱い、ってのはまいったなあ
おまいらdoなんて使ってないよな?
441 :
436:2010/12/10(金) 02:10:06
>>437-
>>440 ありがとうございます。
do や let で繰り返す場合には,1回の繰り返しが起こる度に (前回の束縛関係
を上書きするのではなく) 毎回全く新しい環境が作られて、1回の繰り返し処理
が完了したらその環境は (継続が生成して保存されない限り) 捨てられるという
理解で良いでしょうか?もしそうだとすると、このような挙動は再帰呼び出しに
よる繰り返しで一般的なものなのでしょうか。つまり再帰による繰り返しでは
一般に、異なる繰り返し回が共通して同じ局所変数を見ているものではなくて、
毎回別の局所変数を見ているのだ、と。
そうだよ
クロージャーはclassでメンバー変数に状態もたせてメンバー関数に処理させるのと何が違うんだ
theは無かった…
ダグは何を思って「ラムダ以上みましょう」と書いてるんだろう 国内でもタイトルは普通に Let Over Lambda なのに…
機械翻訳がおもしろかったのでネタとして、じゃないの?
昔、英語版を用意してないwebページの定型句だった "sorry, japanese only" を、
「哀れな日本人専用」とするみたいな。
449 :
436:2010/12/11(土) 00:45:13
>>442 ありがとうございました。再帰呼び出しの際には前の環境を
上書きすると思っていたので継続について混乱していました。
(define (concat lst)
(if (null? (car lst))
(concat (cdr lst))
(append (car lst) (concat (cdr lst)))))
これどこが悪いのか分からない…(´・ω・`)助けて偉い人
再帰が終わる条件がないような気がする
リストのnull要素を捨てる?
とりあえずappend使うなら
(append (list (car lst)) (concat (cdr lst)))
これがエラーになるのってracketぐらい?
エラーメッセージは
else: not allowed as an expression
(let ((x 4))
(cond ( (> x 0 )
(cond ((< x 10 ) 30)
(else 100))
(else 5))))
454 :
453:2010/12/11(土) 05:47:59
括弧の場所が間違ってただけだった
455 :
450:2010/12/11(土) 15:15:29
450です
(define (concat lst)
(if (null? lst)
empty
(if (null? (car lst))
(concat (cdr lst))
(if (number? (car lst))
(append (list (car lst))(cdr lst))
(append (car lst)(concat (cdr lst)))))))
なんとかできました 451さん 452さん
あ(・∀・)り(・∀・)が(・∀・)と(・∀・)う!
clispでlabelsとか使ったときにdisassembleについて質問。
たとえば、
> (defun sum (x) (labels ((rec (i sum) (if (> i 0) (rec (1- i) (+ sum i)) sum))) (rec x 0)))
SUM
> (disassemble 'sum)
Disassembly of function SUM
(CONST 0) = 0
(CONST 1) = #<COMPILED-FUNCTION SUM-REC>
1 required argument
0 optional arguments
No rest parameter
No keyword parameters
5 byte-code instructions:
0 (LOAD&PUSH 1)
1 (CONST&PUSH 0) ; 0
2 (CONST 1) ; #<COMPILED-FUNCTION SUM-REC>
3 (CALLC)
4 (SKIP&RET 2)
NIL
これ、肝心の #<COMPILED-FUNCTION SUM-REC> をdisassembleするには
どうすれば良いんでしょ?
>>456 1. labelsのスコープの中でdisassembleを仕込む。
2. 外側の関数を呼び出す。
>>457 (rec x 0) の部分で (disassmble 'rec) あるい (disassemble 'sum-rec) しても
Undefined function 言われるだけだなぁ
>>458 (disassemble #'rec)
>>459 おおう、いつも function じゃなくて quote してたんで盲点でした
Gauche 0.9.1 キタ
schemeの構文オブジェクトがよくわからない
schemeの構文オブジェクトに相当するものはCommon Lispにはないの?
quote evalとdelay forceが同じに見えてくる
λ計算の勉強をきっかけにschemeに入門して
チャーチ数とかで遊んでる若輩趣味グラマなんですが、質問です。
Zコンビネータってネットで調べると、使う関数の引数に合わせてlambda増やして(arg1のとこ)ますが、
(define Z1 (lambda (f) ((lambda (g) (g g)) (lambda (h) (f (lambda (arg1) (((h h) arg1))))))))
再帰部分を遅延させるためだけなら、使う関数の引数を気にせず
引数無しlambdaを使うってことをしないのは何か理由があるんですか?
(define Z0 (lambda (f) ((lambda (g) (g g)) (lambda (h) (f (lambda () (h h)))))))
;これでも動くのは確認済み、引数無しlambdaを評価するのに与える関数内に1組カッコが増えますが。
LISPの仕様でたまたま無引数が許されるだけであって、
原則として1関数1引数の世界の話だからじゃないの
そうだね。 λ計算では常に引数は一個。
と言うか、λに値を与えて呼び出すのではなく、値にλを適用するっていうイメージ。
(λ計算の世界では「値」もλなわけだが。)
Haskell とかだとカリー化があるからそのへんよくわかると思う。
例えば、
hoge a b = a + b
という定義は
hoge a = (\b -> a + b)
と同じなので、引数が2個以上みたいに書いても構文糖に過ぎず、
Haskell の世界では1引数の関数しかない。
まぁ、要するにλ計算のλと Lisp 系言語の Lambda は同じものではないってこと。
関数をオブジェクト (値) として扱うという思想の根源にはλ計算があるのは間違いないけど、同一視はできないよ。
ありがとうございます。納得しました。
これまで計算機科学は齧ってすらいない素人の独学なので気付けませんでした。
lambdaとかコンビネータである程度遊んだから、真面目に聖書から勉強してみるかな。
Gaucheはマックでcffiが動かない問題を解決できたのだろうか
Gauche-glに続いてGauche-gtkもWindowsで簡単に動くようになればいいな
475 :
453:2010/12/18(土) 13:44:44
クラスと構造体が処理系ごとに違いすぎる
せめてGaucheとRacketの間をマクロで変換できたらなあ
gauche.record使えばかなり近いんでない?
R6RSのレコードか、SRFIのレコードはないんだっけ?
そんなにRacketのレコードって独自色強かったっけ。
マクロで融通できないくらいに。
478 :
デフォルトの名無しさん:2010/12/22(水) 19:28:13
なんで声優板にLispのスレがあんねんと思ったら…。
時代は変わってんな。
LISPのイベントでCommon Lisp講座を開催したらプログラマの間で伝説になるな
LISPのイベントに「くあっどぴゅあ」のヒロインのようなシャツを着て参加するとか
>>479 まず、LISP が Common Lisp にどこまで適合してるかが問題だ。
483 :
デフォルトの名無しさん:2011/01/02(日) 00:58:29
新年早々張り切ってるねw
あなたの存在自体が、「教育用言語としてlispは素晴らしい」という主張があり得ないことを
雄弁に物語っている。しっかり戦ってきてください。
私も絶対にあり得ないと確信する。
>>483 「どのあたりの層を対象に教育?」によって提示する資料は異なると思うんだが…
>>483 そんな話を正月早々おおまじめにこのスレにふってどうする。
まぁ、面白半分でオレの意見を述べる。
LISPが教育用言語として不向きなところ:
- 見た目がとっつきにくい。
- フォンノイマン型計算機の基本的な構造は手続き的なので、「まずは手続き型」というのにも一理ある。
- 就職に有利ではない。Excelのマクロでも書けたほうがマシ。
LISPが教育用言語として向いているところ:
- マルチパラダイム。これだけで、いろいろなプログラミングパラダイムのさわりを導入できる。
- 大学での計算機科学の入門教育用言語としてはかなり実績がある。
実装の多様さは問題にならないだろう。
本当に教育用に向いているなら、教育用LISP国内統一仕様でも作ればよろしい
(Scheme R5RSとかをそのままで良いと思うが)。
LISPのマクロは他の言語と比べて独特だし、原理的には存在しなくかまわないものなので、とくに重視する必要はないと思う。
>>483 万能の解はない。 教育用として素晴らしい点もあればそうでない点もある。
LISP にはおよそプログラミング言語というものにある全ての概念を表現できる可能性があるので、ひととおりの概念を教え込めるというメリットはある。
ただ、あまりにも何でもアリというのは教える立場からすると方向を決め難くてやりづらいというデメリットもある。
LISP は派生言語が多いというのは
>>486 は問題にならないと述べているけれど、これはメリットにもデメリットにもなると思う。
emacs lisp と Common Lisp なんてダイナミックスコープとレキシカルスコープという根本から違うからな。
これは言語のあり方について示せる機会でもあるけど、混乱を生む元だとも言える。
事実としてかつては MIT での教育 (教養過程) に Lisp の方言であるところの Scheme が用いられていた。
(ただ、今では Python に切り替えれられているとのこと。)
国内でも多くの学校で実績がある。
教える側・教えられる側の素養によっても、あるいは時代背景によっても良い選択が何かというのは違ってくる。
仮に数値的に全体的な傾向があったとしても、アンケートなり何なりの取り方によっても変わる。
そんなのに客観的な要素を持ち出したって無駄だよ。
英語の方がユーザーが多いから日本語は英語より劣ってるとか言うようなもので馬鹿げてる。
個人的な見解だが、他の言語と同程度には教育用に適していると思う。
>>483 Lispは、向いてるかどうかは別としても、教育関連では割と大御所だと思うよ。
以前のMIT以外にも、国内でもScheme使ってる(使ってた)所はある。普通に探せば出てくる。
で、本題の向いてるかどうかだけど。特にScheme辺りは、最小主義を推し進めた結果、
少ない要素で多くのことを表現できるのがメリットだと思う。学生も覚えることが少なく済むし、
講師も枝葉の概念をいちいち教えずに済む。これは教育の現場では大きなアドバンテージ。
例えば、この演算子の結合順序は〜、とかは、計算機科学の本質に全然関係ないじゃない?
そういうのを排除して、本質的なアリゴリズムやデータ構造により長い時間を割ける。
教育面でのLispのアドバンテージはそれだけじゃないかな。後は他と似たり寄ったりだと思う。
カリー化とか関数的なアプローチに関しては、Haskellの方が上手く扱えるし、オブジェクト指向は、
CLOSは主流とはスタイルがやや異なるし、全てがオブジェクトでもない。PerlやPythonのように、
ライブラリが豊富なわけでもない。
あとは、上でも触れられているけど、どこに重点を置いた教育をするかで変わってくるだろうね。
即戦力ならJavaやRubyだろうし、より理論を重視するならHaskellやCleanの方が面白いだろうし、
アーキテクチャを強く意識するならCだろうし。特徴を出そうとすると、Lispは選びにくい。
あとは、流石に古典BASICとかと比べられると悲しい。
Lispは古い言語だけど、最近の言語が取り入れている(取り入れようとしている)要素を、
いち早く(数十年前のレベルで)採用した近代的な言語でもあるのよ。例えばJavaだったら、
クロージャとかtail callの最適化とか。
その辺りを調べてみると、より公平な判断を下せると思う。
知らないものについてあれこれ論じても、建設的な結果は出ないんじゃないかな。
491 :
487:2011/01/02(日) 10:44:29
あえて他の言語との比較はしなかったのだけれど、
>>490 が「易しい言語」を持ち出しているのでそのことにも触れよう。
「教育用」という立場からすれば言語が易しいことは必ずしもデメリットとは言えない。
教育したいのは言語そのものでなく、基礎的なアルゴリズムだったり、問題の定式化だったりするから、言語で手間を書けたくないからね。
ただ、ウィトゲンショタインは言葉の限界が世界の限界であると述べている。 言葉が考え方を縛ってしまうのだ。
(共産主義の国家で表現の規制が行なわれやすいのは、それが思考に方向性を与えるのに有効だからだ。)
例えば Java なら問題をオブジェクト指向で解決しようとする。
Java で教育された者はオブジェクト指向に考え方が制約付けられてしまうわけだ。
一方で、 Scheme 使いなら大抵一度は読む SICP には様々なパラダイムの構築の仕方から書かれている。
問題解決に適切なパラダイムが何かということから考えさせられる。
産業界では Java とかが幅をきかせているけど、 LISP の何でもアリっぷりはチームでの開発には向いていないことがわかっている。
言語自体がある程度の枠組みを持ってないと統制が取れないんだ。 無秩序になる。
それと、チームではたとえ個人の能力を制限してでも全員が一貫した方向性を持った方がうまくいくと言われている。
こういった産業界での事情を考えると、個人の能力を伸ばすのが適切な教育なのか、使える教育なのかということになる。
だから、どんな言語が適切なのかはまずどんな教育をするのかを定義しないと評価不能ってこと。
どんな屁理屈をこねようとポインタや再帰を理解できないダメプログラマを擁護する理由にはならない。
493 :
491:2011/01/02(日) 11:22:00
つまり、「教育」にはふたつの側面がある。
「能力を伸ばす」というのと「一貫した規律にあてはめる」というもの。
前者ならばより自由な言語を選択した方がいい。
後者なら実際に産業界でよく多く使われているものを選んだ方がいい。
>>492 はプログラマとしての最低ラインにポインタや再帰を挙げているけれど、
極端な話をするならそのチームが一貫してポインタも再帰も使わないという規律の中でなら問題にならない。
現実にはそんな規律では仕事にならないんだけどね。
普通の LISP 使い、例えばこのスレにいる人々で「LISP しか使えない」という人はまずいないよ。
LISP がわかって Java がわからんとか BASIC がわからんとか言う奴はいない。
だから、まず個人の能力を充分に高めた上でプロジェクトごとに規約を決めるという運用がだいたいうまくいく方法じゃないかなぁ。
と言うことを考えると LISP って結構良い選択ってことに。
>>493 その論旨だと、Lispでなくとも、マルチパラダイムの言語ならどれでも良い選択になる。
元の話は、教育言語としてのLisp、って話なんだから、論点がずれまくってるよ。
Lispがどう自由かという話をしないと、良い選択になる理由が読み取れない。
その辺の見解を元の質問者も知りたいだろうし、俺も聞いてみたい訳で。
言語がシンプルで憶えなきゃいけないことが少ないってのは
本題のアルゴリズムとか教えるには余計なことに時間を取られずに済むからいいことだよね
教えたいのは言語の枝葉末節じゃなくて「プログラミング」ならね
計算機科学の講義と、プログラマー養成講座じゃ向いてる言語かなり違うと思うぞ。
GCのある言語はよくない気がする。
C言語とかでmallocとfreeの対の関係を覚えさせないと。
なんでLISPでばかばか作りっぱなしで問題ないのか理解しない。
それと教育に使うならLISPじゃなくScheme限定だろう。
LISPは歴史的経緯で変な制約が残ってるし。
Schemeと対比させてLISPを学ぶのが目的ならいいけど、
そうじゃないし。
S式とquoteの問題がある。
これってLISP系独自の概念だから、
なんで括弧に括るの?とか、
引用符の片側ってなんで閉じないの?とか、
まあこれぐらいはそういうもんだ、でいいか。
記法についての問題もある。
前置記法ですよといってもわからないから、
HTMLやXMLのタグと同じですがなと説明するかな。
HTMLってナニと言われたら、 1 + 2 * 3を(+ 1 (* 2 3))と書きます、
これの利点は優先順位がなくなることです、って説明するかな。
LISPは言語のアセンブラです、他の言語はすべて
LISPの概念から作られてます、みたいなホラ吹いても多分騙される。
498 :
493:2011/01/02(日) 13:32:24
>>494 俺は最初から他の言語と同程度に良いと述べている。
逆に言えば、LISP が他の選択肢より悪いということはない。
それだけのことだよ。
複雑なトレードオフの関係を知りたいなら
>>483 には LISP をまず学んでもらうしかない。
まあ会社の新人にLispは教えない。普通はC。
逆に情報系学部の一年生ならLisp(Scheme)から入るのはいいと思う。
リスト処理の授業
(car (cdr '(a (b) c))
引用符が閉じてませんよ、
さっき説明しただろ聞いてなかったのか。
carて車の免許取れってことですか、
取っといたほうがいいな。
CDRってウケル、今はDVDの時代ですよ、
ああ、そうだね?
つーか括弧も閉じてませんよ、
そう、その言葉が聞きたかった。
carとcdrはちゃんと説明した方がいいね。
(cadr '(a (b) c)))
はあ?cadrってどう発音するんすか、
カドル。じゃあ、cadddrは?カドドドル。
caaaarは?かああああ
括弧が一杯あって気持ち悪いって言われて
病院搬送されてPTAで問題になるのが一番怖いかな。
これが本当のモンスターペアレントです。
男ならカッコつけろよ
>これの利点は優先順位がなくなることです、って説明するかな。
運動会で順位を付けない時代だから
説明次第でPTAに支持されるな。
そういう配慮をした言語です。とっても安心です。
どうしてこういう話題になると馬鹿ばっかり湧くんだろう
じゃあ数学もS式でやったらええねん
(+ 1 2 3 4 5 6)とか書けて便利やねん
そのまま計算機に落とせるねん
N88BASIC(86)で行つながりに気づかずデバッグで悩むところから始めるべき
lambdaの授業
((lambda (a) a) 1)
じゃあいきなり聞こう、これの答えは何?
はいじゃあ、順番でアキちゃん答えてみて。
えーと・・a?
ぶぶーおしいけどちがいます、わかる人いるかな?
1ですせんせー
あれー?どうしてそう思った?正解です!
サクラが必要だな。
>>491 > ウィトゲンショタイン
巣にお帰りください
(lambda (a) a)の答えは何?と聞かれたら、
なんて答えればいい?
#<closure>?関数自身?
それとも式が不完全ですって言う?
そんな疑問を抱かないように誘導する?
>>509 (lambda (a) a)がそのまま返る、
つまり式そのものが答えでいいんじゃないの?
義務教育でLISPってどうなんだろう
'a => aのように(lambda (a) a) => (lambda (a) a)
としてしまうと誤解するかな
'(lambda (a) a) => (lambda (a) a)
とは違うわけだし
「答え」に何を求めてるか知らないけど、
その式は単に引数をそのまま返す関数でしょ。
一応クロージャでもあるだろうけど、あまり適切な例でもないような・・・
そもそもlambdaって何?
英語読めませんがな。
(無名関数 (x) x)
しかし、「無名」ってなんとなくNGのような気がするし、
名前を付けなくていいってのは利点でもあるけど、
知能育成の妨げになるような気がする。
義務教育期間はlambda禁止じゃないか。
λλλλ...
名無しはタブーってありそうな話だな。
関数の授業
(define (f a) a)
上のようなfという名前の関数を定義しました、さて
(f akichan)
この答えは判るかな?
それじゃあアキちゃんリベンジ!答えてみて。
え・・a?
おしいけどちがいます。わかる人いるかな?
akichanですせんせー
ちがいまーすakichanは定義されていないので
答えはエラーです引っ掛け問題でしたー
アキちゃんいじめだー
どうでもいいけどなぜにアキちゃん?
初めてプログラムを知るならLispでもいいかもしれんとは思うが(先入観無いから)
電算機概論と平行に進めないとよろしくないので情報専門の学科以外は止めた方がぶなんじゃねぇの?
アキちゃん飲み込み悪すぎだろwww
教育というよりも、研究向きの言語であることは確か
とくに学生に論文を量産するような学部なら、始めからLISPを教育すべき
「アキちゃんが定義されていない」は
明らかに問題発言
しかも引っ掛け問題に欠陥児童の名前を使うとか論外
答えはアキちゃんでいい
もちろん問題の整合性も考慮するなら、始めから
(define akichan 'アキちゃん)とでもしておくべきだろう
それがエラーになるのはLispだからじゃないの
恒等関数に変数akichanを適用したのなら値はakichanになる
f(x) = x に x0 を適用したら値はf(x0)だ
数学ならそれで終わりでしょう
なぜLispではシンボルakichanのまま計算できないの?とアキちゃんは
疑問に思うに違いないぞ
シンボルと識別子の混同はよくない。
Scheme と Common Lisp でもそのあたりの意味論は違うんじゃないの?
両方をよく知ってる人はちょっと解説してくれんか
>>521 ごめん、Lisp用語の「シンボル」というつもりで深い意味で言ったのではないので…
俺が言ったのは、単にsymbolic algebraのsymbolだよ
数学ならakichanが何であるかは気にしないし、何でも良い
quoteがないシンボル => シンボルなLISPがあったっていいじゃない
初出のシンボルに束縛されるのはそのシンボルで
(define シンボル 値)として初めてシンボル => 値になるとか
そういう初等レベルLISP
未定義とかは中等レベル以上の概念
>>523 LISP じゃないけど、 pure なんかのシンボル (変数) の扱いはそんな感じ。
>>523 遅延評価なら
((lambda (x) x) x0) を x0 までは簡約できるのかなあ
ふつうのLispだとまっさきにx0を評価しようとしてしまう
俺も未定義はアキちゃんには難しいと思った
環境を教えざるを得ないのでλ計算+置換モデルよりむずかしいし
特に数学的でもない
先生はいじわるだ!
そんなことを思ったので
>>520を書いた15の春
既に流れが変わってるけど
>>483 は良い燃料になったな。 元の議論がどのスレか分からないから想像だけど、紹介されたウェブサイトは根拠というより資料として提示したんだろう。 LISP だけを取り上げてるわけでもないみたいだし。
探せば LISP が教育用に不向きという結論の資料だって出てくるだろうし、その逆だって出てくる。 自分で理解せずに偏った資料を提示するのが「説得」だと思ってるなら議論に加わるべきじゃないな。
簡単だよ。教育用にLispは素晴らしいという人物自身がLispで教育した人間を示せばいいのさ。
MITのコース6.001 (電気電子、計算機科学選考必修の入門授業) で
Schemeが使われていたのは、言語として上とか下とかじゃなくて、
「計算機科学の基礎を教えるコースだから、言語の説明に時間を
取られたくない」、という理由だよ。Schemeの根本的なところなら
最初の授業の前半で済ませられる。
でも現代は、最小限の部品から全部手作りするって時代じゃなくなった。
ロボットを動かして意味のあることをさせようと思ったら有りものの
ライブラリを持ってこないと一学期で終わらない。それがコース変更の理由。
ソースはサスマン。
計算の理論から教育する場合はLISPの方が楽じゃね?
>>529 lamda 計算ベースの言語なら何でもええんちゃう?
>>528 基礎を教えるのに、時代が変わると基礎も変わるって明らかにおかしいだろ
そんなものは基礎じゃねぇよ
>>531 計算の理論が登場したのが1930年末後半だから、計算機科学の基礎らしきモノが出てきてからまだ70年しか経ってない
基礎もまだ日進月歩
>>531 時代が変われば、教えなきゃならん基礎も変わる。
いいからサスマンの書いた文章をまずは読んでみろ。
>>531 基礎よりも初歩といったほうが適切かもしれない理由だから。
時代が大切なら、理論と言わず歴史を教えればいい
理論はおいといて歴史が大切だと最初に正直にそう言えば何も問題なかった
>>536 時代に合わせた教育が必要だから歴史を無視できるわけではないが、「置いといて」はないだろw
時代背景は教える側が考慮すべき要因だろ。
それを教えりゃいいってものじゃない。
まぁ
>>536 はネタなんだろうけど。
そのロボット制御用のライブラリをSchemeで実装すればいいのに。
歴史的背景がわからないもんで理論がわからない、というのは確かにあると思う。
先生たちが不機嫌になるのも要するに、お前理論が出てきた経緯を知らないくせに
知ってるふりするなよ、ということを暗に言いたいからなんだろう(自分で
教えとけよと思うけど、うっかり言えない事情もあるんだろ)。
結論としては、学会レベルでまとめて公表しておいてください。
話の流れを追えなくなった
だれかサマライズしてくれ
>>541 明けましておめでとうございます ← 今ここ
関係ないけど、
>>483のリンク先にprologがない。
彼らはいつまで引きずるつもりなんだ。いい加減区切りつけるべきだろ。
言語が登場した経緯の中に他の言語の影響が見られることはあるけど、
言語を作った理由って割と後付けっぽいよな。
実際のところは、オモロいパラダイムや機能を思い付いたから作ってみましたって感じだろ。
論文にはその機能で解決できる問題とかを列挙してあったとしても、無理があることも多い。
本当にまっとうに、それがどうしても必要なんだという理由があることはまれなんじゃなかろうか。
そんなことをまとめたところで理解に役立ちそうな気がしない。
ずっと後の世であれば歴史研究の一分野として成立するかもしれんけど。
>>544 C言語は必要だから作ったといえるだろうな。
(『どうしても必要不可欠』とまではいえないだろうけど)
Erlangもそうじゃないのかな。
でも、それ以外はどうしても必要だから作られた言語なんて思いつかないな。
最近の言語で生き残ってるのはベターCモアベターLispって感じのちゃんとした目的があるとおもうけどな。
理論的に明確な意味付けがされている、とかいう意味合いで言っているじゃないの?
教育は大事だけど、それだけじゃないよな
おれは Common Lisp か Clojure で、
すげーシステムを書くぜ
>>548 そのスレ見てて思い出したんだが
昔の8bitBASICではNEXTの後の変数は省略した方が速くなったんでもっぱら変数なしだったな
>>545 Lispは必要だから作ったんだろ?
そしたら化けた。
>>539 それを作る人が教育されなかったからじゃないかな
たとえばどんな?
個人的に実験するにはlisp系の言語はとても役に立つんだけど
教育コスト考えると使いにくいんだよね
>>551 そだね、だけど、現場でCが必要とされるほどの需要がなかった
# 高級アセンブラと高級言語を比べられても… って気はするけど
# ぶっちゃけ、手続き型言語なんて(OOPを含む)アセンブラの拡張
やっと関数を引数にする関数が認められてきた程度
関数を返す関数なんてのは邪道以外の何者でもないのが
現場なんだよおぉ!!!
>>551 数式をS式で書く実験 → これでプログラム書けね? → LISP誕生
ヾ /
,. -ヤ'''カー、
ー―ァ /r⌒|:::|⌒ヾ
_ノ オ{( |0| )} オオオォォォォ!!!!!
__,ヽ,ヾ,_|V|,_ノ、/ ,r-,,=
,゛==ゝ_ViV_ノ~i/ 〃 `ー―-、
/ /⌒`//´⌒c/^^^ ))))))))))
,,―イ {ー''"~{ {~゛`ー`/'`'~/ー--―'
)) ,./ゝ_/∧ゝ_ノ ノ
ー''" |ロ ロ |
激しく違うし。
MLか何かと勘違いしてね?
MITのAI研でAdvice Takerの実験のために作ったんじゃなかったっけ?
>>551 そうか? LISPの最初の実装こそ、いわばジョークプログラムみたいなもんだったと思うけど。
すくなくとも、ターゲットアプリケーションなんてなかっただろ。
>>559 lispは仕様が(方向性がというべきか?)固まる前から
「こんなふうにコーディングできるはずだ!」といって
ゼミで机上コーディングが盛んに行われ、討論されていた言語だからなあ。
規模はともかくとして、実行させたいプログラムは
処理系の実装が動き出した段階でたくさんあったんじゃないかな。
まぁ、当時の言語って言うと Fortran とか ALGOL とかの時代だからな。
それでもリスト操作やら述語論理を書けるにしても、表現形式としてはあからさまに不向き。
今なら必ずしも LISP でなくてよいと思うけど、当時にしてみれば全く新しい概念だったには違いない。
>>545 たまにはOCCAMの事も思い出してあげてください
CSPの為に作られたんだけど専用プロセッサと相まって話題にはなったが普及はせんかった奴
>当時にしてみれば全く新しい概念だった
歴史って、その当時ごくふつうだった概念を扱うんじゃないのか?
>>563 トランスピューターかよ
昔、8 個使って専用画像処理装置組んだことがある。
量産品は売れなかったけど、試作品はごく一部で公表だったw
>>566 そそ
大規模な奴だと阪大の先生がCGでがんばってたな〜くらい
でも昨今のマルチコアでちょっと再注目されるかもってかんじ
スレに合わせてLispの話だと純粋にプログラムの事を知らない人が必要にせまられてlispでカスタマイズスクリプト書く時の方が
プログラマが新たにLisp覚えるよりも早く習得するとかいう話が昔あったのだけどだれか出典覚えている人いませんかね?
autocadかemacsのどっちかだったかすらうろ覚えですまん
>>567 > 純粋にプログラムの事を知らない人が必要にせまられてlispでカスタマイズスクリプト書く時の方が
> プログラマが新たにLisp覚えるよりも早く習得するとかいう話
ストールマン(当然elispの話)がインタビューか何かで喋ってたような記憶が…
「プログラムの事を知らない人」ってのがFSFの事務の女の子だったような記憶も…
Gaucheの人がスクェアの仕事してたみたいなこと書いてたけど
FF14スレには中国人がみんな作ってるって書いてあった
謎だな
>>569 Gauche の中の人が関わってたのは FF7 の頃の話だべ。
>>569 時系列を考えろよ。
Gaucheの中の人がやってたのは、
>>570も言ってるけど、確か、FF7とか、壮大にコケたFFの映画。
>>568 おお、それだと思うちと検索キーワードに追加してみるよ、ありがとう
>>554 > やっと関数を引数にする関数が認められてきた程度
> 関数を返す関数なんてのは邪道以外の何者でもないのが
> 現場なんだよおぉ!!!
板違いの愚痴かよw
プログラマーの文章は読めたもんじゃないな
だからHow I lost my faithを書いたErann Gat = Ron Garretは、
用途に合わせてPythonとかも使うようになっただけで、
Lispを使うのを止めた訳じゃないと何度言えば(ry
つい最近もCCLのMLとかTracにいたよ。
lispからffiでpython使うのが最強
>>578 ライブラリ使うだけならpythonの必然性皆無
そもそもCのライブラリの管理方法が自由すぎるのか
自由だと何をやっても必然性皆無
ライブラリ管理のためにグルー言語を利用するのは悪くない。
グルー言語に頼らずに管理するのは意外と難しいのかもしれない。
グルグルー
>>582 えっと、それはmakeの代わりにperl使うとか、debパッケージみたいなのをpythonで構築するとかいう話ではなく、
ライブラリはCでゴリゴリ書いて、それをLISPやRubyで使うのが気持ちよいプログラミングっていう話?
後者なら、オレも賛成。
これからは速度が非常に重要なときはOpenCLとか使うことになるんだろうし、そのへんはCとかCライクな言語でゴリゴリ書けばよい。
それを関数型言語で優雅にラッピング。これ最強。
マクロのあるlispはグルーコード向け言語
>>585 意味がわからない
グルーというのはライブラリをくっつけるのだから、マクロは関係ないよね
>>586 >>585じゃないけど、APIをラップするとき、マクロがあると凄い便利だけど。
FFIでマクロ抜きとか、割と死にたくなる。リソースの管理とか特に。
with-dbみたいなマクロ使わないの?
mysql sqlite posqr を全部同じ様に扱えるようにマクロ等うでうまくラップしたのは、割とどこの処理系にもあるよね
>>585のような考えはLisperの常識かと思ったが、
最近はAPIも統一傾向だし、
OOラッピングが一般的だから、
そういう感覚も薄れてきてるんじゃないのかね。
GaucheのコードをあんまりいじらずにネイティブコンパイルするScheme処理系って無いでしょうか?
Windows7です。
Gaucheも非公式だけどdll作れるが、完全にネイティブコードにしたいの?
>>590 無い。R5RSとSRFIくらいしか使ってないなら別だけど。
それ以外のライブラリの互換性は、Schemeでは無いに等しいから、
マクロ様のお世話になるしかない。いずれにせよ、色々書かないといけない。
C経由も含めると、Chez(商用)、Gambit、Chicken、Larceny、Bigloo、MIT、Stalin(R4RS)、
Ikarus(開発停滞)、Vicare。JITも含めて良いなら、Racket、Mosh(ブランチ)、Ypsilon(trunk)。
とりあえず、何のためにネイティブコンパイルしたいの? 速度?
>>593 フォルダをあさって特定のファイルをカウントして結果をCSVファイルに書き出すスクリプトをGaucheで書いたんですが、
そのスクリプトを、Gaucheがインストールされていない(勝手にインストールできない)会社のマシンで使いたいです
>>594 Gauche のバイナリにインストーラはついてるけど、インストール時にやってるのは環境変数の追加程度のはず。
インストール後のフォルダをそのままコピーして持っていってもおおよそ問題ない。
slib を使っている場合なんかだと slib の場所を gauche が見付けられないこともあるが…。 それもちょろっと弄れば大丈夫。
USB メモリか何かに入れていってそこから起動させればいいんじゃないかな。
>>594 GaucheのWindowsバイナリはどこに展開しても動くはずだから、手っ取り早くやりたいなら
自分のマシンのGaucheのツリーをzipで固めて持ってくとか、usbに入れてゆくとかは?
それさえも出来ないのなら、バイナリ作っても持ち込めないよね。
Gauche\ 以下をUSBメモリにコピーして試してみます
define-syntaxのメリットがわからないので
defmacroを使い続けている
メリット
define-syntaxで書かれたソースが通る
デメリット
処理系が肥大化する
手間の割にメリットは少ないと思う
プログラマが充分に注意深ければそうかもね。
ハイジニックって性質は出来ることを増やそうというよりも誤りを防止する防壁的
なものだから直接的にこれが出来るあれが出来るというものではない。
Lispをアセンブラに落とすコンパイラを作ろうとおもったけど、
Applyとかどうすんだろとか、quoteとかどうやったらよかんべとか結局すくれてない。
>>601 そこは別に悩むところじゃないと思うが… quoteはコンパイル後は単なる定数データだし、
applyは引数積んで関数ポインタcallするだけだろう。
とりあえず単純なVMをターゲットにしてコンパイラ書いてみたらコツがわかるんじゃない?
>>602 ありがとう、もうちょいがんばってみる。
>>602 横から質問だけど、例えば外部ファイルからreadでS式を読み込んでapplyとかするプログラムの場合、
そのプログラムはSchemeインタプリタを持ってないといけないんじゃないの?
外部ファイルからのS式がlambdaを持ってた場合、
(apply (lambda (x) x) '(1))とかだったらlambdaをevalしなきゃならないんじゃない?
>>604 そうだよ。 インタプリタを内臓してる必要がある。
chicken scheme とか見てみれ。
Scheme の議論の中では eval 不要論も大きいし、実際俺は eval なんて使ったこと無いんだよな。
あ、内臓ってなんだよ内蔵な。
>>604 何かレイヤをごっちゃにしてる気がする。S式をapplyすることはできないぞ。
実行時にapplyが見るのはあくまで手続きオブジェクトであって、lambdaから始まるリストじゃない。
(apply (lambda (x) x) '(1)) というプログラムがあった場合、コンパイル段階で
(lambda (x) x) のところは「実行されると『引数をそのまま返す手続きオブジェクト』を返す式」
という内部表現に既に変換されてる。lambdaとかはもはや関係ない。
データとしてのS式と、実行されるプログラムは別の世界にある。
その二つの世界をつなぐのがevalな。
evalは必ずしも「インタプリタ」を持ってる必要はなくて、その場でコンパイルして
動的リンクして実行したっていいわけだが。SchemeでSchemeインタプリタを書くのは
そんなに難しくないから、インタプリタを持つ設計があってもいい。
evalが二つをつなぐのは、インタプリタの世界での話では?
その行で唐突にインタプリタの話になってる。
>>607ではないけど、
>>608の言いたいこととしては、lispでインタプリタは普通REPLで実装される。
つまりインタプリタという言葉を出してくるなら、すでにevalがあってしかるべき立場じゃないと
おかしいので、循環論法になってるじゃないか、ということだと思う。
話を読む限り「インタプリタ」じゃなくて単純に「解釈方法」とかでもいいんじゃないだろうか。
要は解釈されて保存されるデータの表現方法はどうでもいい、みたいな話じゃない?
stalin使ったこと無いのだけど、ああいう処理系って入力要素にeval可能なの?
>>607 emacs lisp その他古い lisp だと
関数はまさに lambda で始まるリストだったりする。
(apply '(lambda () 42) nil) => 42
とか
(defun f ())
(symbol-function 'f) => (lambda nil)
とか。
Common Lisp や Scheme では
>>607 のいうとおりだね。
この辺知らずに古い文献読むと混乱すること請け合い。
>>610 eval自身をSchemeで書いてstalinでコンパイルすれば可能。
evalで実行されるコードにはstalinの超絶最適化は効かないし、既にコンパイルされてるコードの
振る舞いをevalから変えることはできないけど。
Schemeではもともとevalされるコードとevalするコードは相互作用しなくていいことになってる。
applyとevalの分担は、
1.evalでS式が「適用式」であれば、
2.引数をevalして、
3.applicableかどうかチェックして、
4..applicableの種類に応じた「適用」を行う。
の1と2がevalで、3と4がapply。
Schemeは3でevalしてからチェックする。
コンパイルするならば、頑張れば2と4だけにできるってことだよね。
4も分岐がなくなることが多いし、2もload命令だけになるかも。
手続きはアセンブラに落とせるが、
データはインタプリタでもアセンブラでも同じだからアセンブラに落とせない。
すべてがデータだと豪語するLispのソースコードの中から、
本当はデータではない部分を見抜いてアセンブラに落とすのは結構むずかしいと思う。
いやquoteされてない部分は全部アセンブラに落とせるっしょ。
マクロはプログラムをデータとして扱うけど、それはコンパイルの前段階の話だから。
scheme48って以外といいな
関数を呼ぶ直前に引数をevalすると教わった人は
eval不要論とか理解できないし
evalがそこらじゅうに散らかってる前提でコンパイルしようとするだろ
インタプリタ作った段階で止まってるならそうかもしれないけど。
その後コンパイラの作り方まで説明している本はたくさんあるよ。
aconsってなんの略だろ?
連想リストのconsじゃないかな
623 :
デフォルトの名無しさん:2011/01/15(土) 03:17:00
array cons??
association list (a-list) の cons かな。
625 :
デフォルトの名無しさん:2011/01/15(土) 12:22:19
ありがとう、すっきりした!
>>619 おれも気になります!
もしよろければおしえてください!!
インタープリタからコンパイラって、構文木→実行だったのを
構文木→ターゲットマシンのアセンブラにするだけじゃないの?
と、コンパイラを作った事の無い俺が偉そうに語ってみる。
エイホウルマンに書いてある(キリッ
このスレでひげぽん氏って初めて見た希ガス
619じゃないけど、すぐ思いつくのはSICP、PAIP、Lisp In Small Piecesあたり?
実践 Common Lisp の23章とか?
racketは使い込むといろいろ不備があるな
やっぱりGaucheが一番安心か
Gaucheはソースを隠せないのでダメ
そうしたいならプリコンパイルすればいいじゃん。
>>632 どの辺が不便?
Schemeの処理系の中だと、Racketは最上の物のひとつだと思ってるから、興味がある。
racket も使うけど r6rs モードでしか使わないなぁ。
独自路線自体は悪いとは言わないけど、あえて標準から外れてまでやりたいことのビジョンが見えない。
amb
をマクロ展開したら
あらゆる条件組合せのif文の列挙になるような書き方ないかな
>>636 マイ方言作るためのフレームワーク、結構面白いよ。> racket
>>639 Gaucheでできるかどうかというとできるだろうけれど、Windows APIの
ラッパーとかほとんど無いから、自分でstubファイルを書かないとならないと思う。
そのへんはあんまりドキュメント化されてないから、stubファイルと聞いて何か
わからないのなら、茨の道だと思うよ。
>>639 Gaucheだと、stub書くのが厄介だから、c-wrapper使えるなら使った方が良いと思う。
個人的には、GaucheのFFIは現状では鬼門だと思っているので、Racketの使用を推す。
ラッパーって、Cのヘッダーファイル読み込んで自動生成できないですかね…
>>644 Guile、Mzscheme、Chiken なら SWIG でできるらしい。
他の言語にも対応してるから、確認してみてはどう?
>>645 Guileでできるなら、GuileでできたやつをGaucheに変換できると思う
>>640 >もはやPerlは過去の言語
今も現役だと思うんだけど
Perlは変遷が激しくて、どんな書き方がよい書き方なのかわからん。
ソース拾ってきてもまちまちだしなあ・・・。
>>640 Lispってずっと13位辺りなんだな。
それにしても、Java, Cは相変わらず強いな。
実装方法や使い方が確立された言語が上位ってことな
LISPは亜流も多すぎてどう使ったらよいやらも謎だらけという認識なのさ
その程度で謎だらけなら、GCCとVC++の違いでも謎だらけだろうな。
業務で使うならACLでほぼ一択だろうし、スクリプト用途で使うならわざわざLispを選ぶ意味がなぁ。
>>654 Gaucheは業務に使ってる人いなかった?
Linux限定でいいので、フリーで実用的に使える度ランキングってどんな感じなんだろうか?
SBCLは日本語周りについてちゃんと理解できていない。
Gaucheは触ったら負けかなと思っている。
実際のところのGaucheの実用的な評価はどうなんでしょう?
豪酒
日本語を安心して扱えるlispはGaucheしかないと思ったんだけど
アスキーアートとか読みこませてみればわかるよ
日本語前提なら Gauche はリードしてるかな。
r6rs には transcoder があるけど、
定義済みなのは ISO 8859-1, UTF-8, UTF-16 だけだからなぁ。
まぁ、中途半端に日本語対応するくらいなら
(C がそうであるように) 一貫してバイト単位
で見せてくれた方がいいケースもあるだろうし、
実用的っていうのはどういう状況で実用するかによるんじゃないの。
Gauche はいわゆる「スクリプト言語」としては充分に優秀だよ。
>>656 Gaucheに関しては、実用度はかなり高水準。
必要になりそうな基礎のライブラリとかもある程度揃ってる。
正規表現やCL風のキーワード、CL風の引数の処理、CLOSとか、
有用なものを柔軟に取り入れてる。開発者が仕事で使ってるのは伊達じゃない。
弱点は、仕様が完全に固まってなかったり、文書化されてない部分。
デバッグ周りとかC APIとかがそう。あとは、R5RS Schemeだから、
他のScheme処理系とライブラリを共有し辛いとかのデメリットもある。
例えば、CFGのパーサが欲しいとき、BiglooからLALRのパーサを持ってくる、
とかは安直にはできない。コードの修正が必要になる。GaucheにもPEGがあるけど、
まだ非公式だし。とにかく、CLみたいにQuicklisp一発とかは無理。
長所、短所を踏まえた上で、使い所を間違わなければ、非常に強力なツールだと思う。
論文を大量生産した言語ならLISPがトップ3に入ると思う
LISPは黒板に書かれてなんぼの言語だからな
いや、Lispの時代は来るよ。
俺の勘だとまず間違いない。
lispの時代がこなくても、他言語に変換するの簡単だから
とりあえず使うわ
drschemeでタグジャンプできないの?
>>668 open な処理系ならソース読め
64bit 版 SBCL は low tag 4 bit
64bit 版 clisp は (log most-positive-fixnum 2) => 48.0 なのでおそらく 16bit
あ、CLISP は 32bit 版です。
64bit だと実メモリ搭載量よりアドレス空間が遥かに広いのでレイアウトが楽そうですね。
clispにパッチ投稿してる人に日本人がいるそうだけど
たまに変な日本語コード入力すると落ちる問題は、そろそろ解決してるのかな
昔sbclでwebクローラー作ったらアスキーアート読みこんだとたんに落ちてたんだよなあ
どうして日本人ってわかるの?
CLISPで落ちるのかSBCLで落ちるのか、どちらなのか。
てーか、昔って何時なのか分かんないし、そもそもデータ読んだだけで処理系が落ちる訳?
あるいは、デバッガに落ちてんのを、落ちたとか言ってるの?
CLISPもSBCLも、Unicodeの範囲ならある程度実用的な日本語処理が可能。
本当に処理系の問題なの? 何かFUDっぽくて嫌だなー。
CLスレに書き込んでた人と同一人物じゃないんだろうか。
俺はエスパーじゃないが、とりあえずバイト列型とjpライブラリを知らないのは受信できた。
https://gist.github.com/809515#file_lisp_electric.el ruby-electric面白そうだったからlispでもやってみた。
動作はコード読んだほうが早いかも知らん
ぼちぼちドキュメント書きます。使う人がいればだけれども
軽く説明すると
"("かスペース押すとタブかバックタブでS式単位で閉じ括弧置く場所を指定できて、
適当な動作でその動作を入力しつつ抜ける感じ。
スペース2連打でyas/expand、
タブとか使ってくくる範囲選択してyasで展開するとタブで指定していた範囲がその中に入る。
んー、やっぱり読んだほうが早いな
とりあえず暇な人使ってみてください
ちなみにntemacsでしか試してないので本家emacsだとうごかねーよとかあったら教えてください
普段Vimmerだが使ってみるよ。
>>677 vi使いの人ってREPL支援とかどうやってるのか知りたいんだけどどこかでvideo配信してないかな?
Cやshスクリプトならviよく使うんだけどLispとかpythonだとemacsから足抜けが永遠にできなそうで少し困ってさ
vi 系は起動が速いから、エディタの中から Lisp を呼び出す様な使い方は稀。
LOLの著者って、viつかってんだよな
4月に初シングルと初アルバム出るらしいな
数寄魔さん達は継続があれば大域脱出も例外処理もコルーチンもライブラリレベルで
実装出来ると言うけど、継続を使って実装するより言語のプリミティブな機能として、
処理系の実装言語で実装しちゃった方が実行効率は良いよね。
あんまりそういうのを気にしない人が使ってるのかな。
例外は R6RS で規定された。
具体的な実装が継続を使うのか、
もっと効率のよい実装であるのかは問われないけど、
気合の入った実装者ならそれなりに効率的なものにするだろ。
主要な処理系にある限定継続を使えばコルーチンは結構効率的なはず。
プリミティブな機能として実装するのと大差なくなる。
限定継続は今後の議論の行方の中で注目すべき点だと思う。
大域脱出に継続を使うのは豪華すぎると思うけど、
一般に大域脱出は一度きりであって、
そういったケースを検出したら軽量な継続を作るように切り替えるアイデアは存在する。
"call/ioc" でググってみ。
まぁ、ナイーブな実装だと継続は効率悪いんだけど、
色々と効率的な実装について研究はされてるよという話。
>>684 限定継続って知らなかった。どうもありがとう。
>>683 Schemeの仕様は効率よりも綺麗さ優先だからな。
まず「正しい」仕様を決めて、それをいかにして効率良く実装できるかを競う。
現実的には、継続みたいな仕組みは既にやり方がわかってる大域脱出とかを
再実装するものじゃなくて、新しい制御フローの仕組みを試してみるための
部品と考えたらいい。大域脱出にしても、動的環境との相互作用のセマンティクスを
変えてみるとか。そういうのは普通の言語では言語の実装に手を入れないと
実験できないけど、SchemeならScheme自身でポータブルに書けると。
それで有用性がわかったら各処理系が効率良いサポートを追加するっていう方針。
例えば限定継続も、(効率は悪いが)call/ccを使ったポータブルな実装がある。
その上でいくつかの処理系は効率の良い内部実装を持っている。
>>686 >新しい制御フローの仕組みを試してみるための部品と考えたらいい。
なるほど、納得しました。
皆さんには今更の話題で済みません。部分継続って面白いですね。
もう一度 scheme を勉強し直してみます。
688 :
676:2011/02/06(日) 20:08:33
>>677 ありがとうございます。
vimあんまり使ったことないけど
「vimならこんなことができるのに」とかあれば教えていただけると幸いです。
yasnippet用のsnippet同じ所に置いたけど見難いな。
ユーザが適当にインストールできるといいな
emacslispにファイル埋め込んで簡単に展開できたりしないかなー
と思ったので、最後にそのための式を書いてみた。
クオートはずしてc-x c-eとかするとインストールされます。
てか、これのためにyasnippetインストールしないといけないから手順的に重いか
そっちのが問題?
CLOSの時も、いろいろなCommon Lisp用のOO拡張を検討する上で、
必須のコア機能は何だろうかってことでCLOSがデザインされたからね。
抽象的なプリミティブはいいから、リッチなライブラリ充実しろって人は、
あまり向いてない言語だと思う。
そういう雰囲気は R6RS で大分変わったね。
R7RS はリッチ派とミニマリスト派で別れて作業するみたいだけど、
現実のプロジェクトでも採用し易い言語に育つと良いね。
GCがあるせいだな
いや、javaはそれなりに成功してるから
型が無いせいだな
性敵型のLISPが必要だな
S式だと型指定子の表現が難しい
S式をやめないと
つまり、必須のコア機能は何だろうかという事だけを考えたい人は small な方を使えって事だね。
それとはまた別の話。
別の話って、リッチなライブラリ充実しろって人は large な方を使えって話かな。
R7RS でスレッドのサポートが入るなら喜ばしい
C1X と同程度の進歩だが
全部規格に入ったら、厚さはともかく、範囲では確実にANSI Common Lispは越えられる。
CLtL3とR7RS largeとC++0xの三つ巴で覇権を争うかと思うと、胸が熱くなるな。変態規格的な意味で。
後は静的型付けとコンパイラ命令とオブジェクトシステムと、、、
その頃にはDが完成してるな。
perlが最高
perlにFFI持ってるschemeってないのでしょうか
racketはないですよね
Common Lispはあるみたいですが
>>703 80年代ならともかく、いまどきperlは勘弁してほしい
これからPerlでメンテしていかなくてはならない俺に謝れ!w
perlのどこがまずいのか説明してもらおうか
phpとpythonよりはるかにましだぞ
ここでやるなよ
perl は php よりマシだが python よりはグダグダという印象。
理由は文法の一貫性。 perl は複雑すぎる。
よくあるケースに短い記法が割り当てられているのはメリットでもあるけど、
習熟に時間がかかることに繋がるデメリットでもある。
メリットとデメリットが表裏一体でメリットだけ取るわけにいかない話だから、
どのあたりで妥協するかっていうトレードオフなんだよな。
でもまぁ、そろそろ perl 4 はフェードアウトしていい頃なんじゃないかとは思う。
>>707 そういう話題はLLバトロワスレあたりでどうぞ
githubの使い方教えてください
* 本体
* 関数
* モジュール
っていうやつが灰色になってうまくみえてえんだよ
早く教えろ
人のために尽くしたい!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!!!!
tempの場所のスタイルシートだろこれ???
Perlに対するFFIっているのか?
Perlの足の軽さとLispのもっさりFFIの感じだと普通にスクリプト実行して十分じゃね
>>704 Perl で Scheme を実装して、Scheme から Perl の関数を呼び出せる様にすれば
良いだけじゃないの。
或は Perl を Scheme だと思って頑張るという手もある。
objective-c を smalltalk だと思って頑張るよりもつらそうだ
Common Lispに手をだそうとSLIMEを入れたのですがC-jについて質問です。
lisp-interactive-modeのscratchではC-jで式を評価→表示が出来ていて、私はこれに慣れていました。
slime-modeでも同じことをやりたいと思い以下のようにしてみました。
(define-key slime-mode-map "\C-j" 'slime-eval-print-last-expression)
すると一応出来たのですが、lisp-interactive-modeの場合と違い出力のあとに改行が付きません。
改行が欲しいので以下のようにしてみたのですが、実際にC-jすると引数が間違っていると怒られました。
(defun my-Cj ()
(interactive)
(slime-eval-print-last-expression)
(insert "\n") )
(define-key slime-mode-map "\C-j" 'my-Cj)
(+ 1 8) C-j
my-Cj: Wrong number of arguments: (lambda (string) "Evaluate sexp before point; print value into the current buffer"
(interactive (list (slime-last-expression))) (insert "
") (slime-eval-print string)), 0
slime-eval-print-last-expressionに引数が入っていないようなので以下のように
してみましたが、今度はmy-Cjの引数が間違っていると怒られました。
(defun my-Cj (s)
(interactive)
(slime-eval-print-last-expression s)
(insert "\n") )
slime-eval-print-last-expressionにはどのようにして引数を送れば良いのでしょうか?
lispbox-0.7-clisp-2.37を使っています。お教えください。
>>719 one liner 以外は perl で書かないから興味ない
とっとと消えていなくなれ
# 変数の指定の仕方が変態だろう? > perl
dis りたいだけなら他へ行け
>>718 それはどっちかっていうと、Emacs Lispの書き方の話じゃないでしょうか。
(defun foo (s)
(interactive (list (slime-last-expression)))
(slime-eval-print-last-expression s)
(insert "\n"))
という感じにしたかったんですか? なら、interactiveの仕組みを調べると良いと思います。
ttp://www.bookshelf.jp/texi/elisp-manual/21-2-8/jp/elisp_21.html#IDX1085 ただ、こういう場面でslime-eval-print-last-expressionを呼んで良いかは調べていません。
Emacsで対話的に関数を呼ぶ場合、interactiveはこういう風に使うよ、って話です。
実際、上のコードは、こちらでは結果の前に改行が挿入され、意図した動作になりません。
詳しく調べていませんが、SLIMEが評価にスレッドを使っているのが関係してると思われます。
個人的には、REPLを使うか、C-c C-pで一時バッファに結果を出す方が便利に感じますが、
(コードのバッファを変更せずに済むから)この辺はそれぞれの好みがありますね。
興味が湧いたので、それらしいものを書いてみました。
(defun eval-print-last-sexp/slime (s)
(interactive (list (slime-last-expression)))
(insert (format "\n%S\n" (slime-eval (car (read-from-string s))))))
手元の環境だとそれっぽく動いてる感じなんですが、いかがでしょうか。
おまえらさあ
LISPでなにつくったの?
言ってみろや
本当にしょうもなさすぎて 答えられねえのか?
つ守秘義務
lispは他の言語のコード生成の基
表面的にはjavaだったりするけどね
727 :
718:2011/02/09(水) 18:42:26
>>722 丁寧な説明ありがとうございます。たしかにcommon lispというよりemacs lispの話でした。
interactiveを使ってsに値を入れる必要があったんですね。
そのコードを動かすと自分の環境でも改行が入ってからの出力になりました。
スレッドの影響ですか。(sleepを挟んでから改行を挿入してみようか)
>>723 なるほど、受け取って整形してから表示という事ですか。
実際にC-jにそれを割り当てて動かしてみたのですが以下となってしまいました。
EVAL: undefined function SWANK-IO-PACKAGE::+
[Condition of type SYSTEM::SIMPLE-UNDEFINED-FUNCTION]
Backtrace:
0: #<SYSTEM-FUNCTION EVAL>
1: #<COMPILED-FUNCTION SWANK::EVAL-FOR-EMACS-1>
2: #<COMPILED-FUNCTION #:|472 477 (DEFINTERFACE CALL-WITH-DEBUGGER-HOOK (HOOK FUN) ...)-52-3-1-1|>
3: #<COMPILED-FUNCTION SWANK::EVAL-FOR-EMACS>
4: #<COMPILED-FUNCTION SWANK::READ-FROM-EMACS>
5: #<COMPILED-FUNCTION SWANK::HANDLE-REQUEST-1>
(car (read-from-string "(+ 1 3)"))
;=> (+ 1 3)がうまく取れる
(slime-eval '(+ 1 3))
;=> EVAL: undefined function SWANK-IO-PACKAGE::+
slime-evalで+が使えないようなのでそのあたり調べてみます。
>>727 深く考えずに適当なことを言ったんで、もうちょっと考えて発言すると、
SLIMEはポート経由で処理系と通信して情報をやり取りしていて、
スレッド対応環境では、評価ごとに処理系のスレッドを使って通信してたと記憶してます。
で、その結果を非同期で受け取ったりするので、多分その関係じゃないかと。
考えてみると、あんまスレッドは関係ないですね。非同期なのがポイントであって。
で、そのエラーはパッケージにcl:+がimportされてないのが原因みたいですが、
それって、ちゃんとslime-modeのバッファで実行してます? 他のモードで呼んでませんか?
SLIMEはlisp-modeをフックして、slime-modeっていうマイナーモードも起動するようにするんですが、
その環境じゃないと、slime-evalが現在のパッケージを見付けられなくて、失敗すると思います。
lisp-mode + slime-modeになってるバッファか、slime-evalの第二引数にパッケージを指定してください。
あー、何か長い割に意味が掴みづらい。
要は、SLIME起動後、M-x lisp-modeしてLispモードなバッファで使ってください。
731 :
718:2011/02/09(水) 19:37:15
>>729,730
レスありがとうございます。.emacs上(Emacs-Lisp mode)でやっていました。
(slimeと繋がっているtest.lisp上(Lisp mode)で(slime-eval '(+ 1 3))をするとclispのslime-evalを探しに行くような気がして)
test.lisp上で↓を実行するとこうなりました。
(slime-eval '(+ 1 3))
EVAL: undefined function SLIME-EVAL
[Condition of type SYSTEM::SIMPLE-UNDEFINED-FUNCTION]
M-x describe-functionでslime-evalをすると確かにあるのですが・・。うーん。
.emacsで(slime-eval-print "(+ 1 3)") ;=> 4
test.lispで(slime-eval-print "(+ 1 3)") ;=> EVAL: undefined function SLIME-EVAL-PRINT
.emacsで(slime-eval '(+ 1 3)) ;=> EVAL: undefined function SWANK-IO-PACKAGE::+
test.lispで(slime-eval '(+ 1 3)) ;=> EVAL: undefined function SLIME-EVAL
>>731は見当違いの書き込みだったかも知れません。
C-jにeval-print-last-sexp/slimeを割り当てたあと、
それをslimeと繋がっているlisp-modeモードなバッファで使えという事ですね。
それをするとEVAL: undefined function SWANK-IO-PACKAGE::+になりました。
test.lisp
(+ 1 3) ;C-jすると EVAL: undefined function SWANK-IO-PACKAGE::+
(defun eval-print-last-sexp/slime (s)
(interactive (list (slime-last-expression)))
(insert (format "\n%S\n" (slime-eval s))) )
こう変えてから
(+ 1 3) ;C-jすると
"(+ 1 3)
"
(defun eval-print-last-sexp/slime (s)
(interactive (list (slime-last-expression)))
(insert (format "\n%S\n" (car (read-from-string s)))) )
こう変えてから
(+ 1 3) ;C-jすると
(+ 1 3)
>>732 モードラインのモードの部分は、ちゃんと
(Lisp Autodoc [COMMON-LISP-USER clisp])
のようになっていますか? そのバッファでM-x describe-modeすると、
「Enabled minor modes:」の一覧にSlimeは含まれますか?
レスありがとうございます。
--(Unix)-- test.lisp (Lisp Slime)--L1--Top------------
M-x describe-mode
The major mode is described first.
For minor modes, see following pages.
Lisp mode:
Major mode for editing Lisp code for Lisps other than GNU Emacs Lisp.
(略)
Slime minor mode (indicator( Slime ((slime-modeline-package (: slime-modeline-package) ) slime-state-name))):
SLIME: The Superior Lisp Interaction Mode for Emacs (minor-mode).
とあります。
>>734 それ処理系と繋がってないです。M-x slimeしてます?
736 :
718:2011/02/09(水) 20:54:49
あれ、繋がってませんか?(+ 1 3)でC-u C-x C-eすると4が出力されるので繋がっていると思っていました。
今まで実行していたコードは実は全て組み込みのEmacs Lispで実行されていたとか・・?
サンプルで試したクロージャなどもうまく動いたのでそれはないと思うのですが。
M-x slimeは起動時にされるようです。起動後にM-x slimeするとCreate an additonal *inferior-lisp*? (y or n)
と表示されy押すと新たにREPLが作られます。lispboxだからうまくいかないのかなぁ。
>>736 自分でインストールしてみましたが、バージョンFURIIIIIIIIIIIIIIIIIIIIII!!1!
Emacs 21.3に20060110のSLIMEですか。流石にこれは想定外。
取り敢えず、もっと新しいLispboxを使うか、それぞれを新しいものに入れ替えることをオススメします。
>>726 他の言語のコード生成の基って具体的にどういうの?
CentOSでも使っているの?
>>718は環境全部を晒した方がいいだろうな。
一応、
>>737でもテストしてみましたが、
(slime-eval
'(+ 2 3)
(slime-current-package))
確かにこれが同じメッセージで失敗しますね。(slime-current-package)も":cl-user"なのに。
+をパッケージ名まで含めてcl:+にすると結果が戻ってくるので、何かしらのバグがあるのか、
現行のバージョンとは仕様が変わっているのか。
どちらにしろ、過去のバージョンを詳しく調べるのも不毛なのでご容赦ください。
Emacs 21.3だと日本語のインライン入力とかUnicodeの取り扱いもできませんし、
そういう意味でも、新しいバージョンにする方が良いと思います。
743 :
718:2011/02/09(水) 22:00:48
Windows7 64bitです。
>>738,739
古かったんですね・・。新しいのをダウンロードして実行しました。
(defun eval-print-last-sexp/slime (s)
(interactive (list (slime-last-expression)))
(insert (format "\n%S\n" (slime-eval (car (read-from-string s))))) )
(define-key slime-mode-map "\C-j" 'eval-print-last-sexp/slime)
;(define-key slime-mode-map "\C-j" 'slime-eval-print-last-expression)
上を評価した後、(Lisp Autodoc [COMMON-LISP-USER clozurecl])のバッファの(+ 1 8)でC-jすると
Undefined function SWANK-IO-PACKAGE::+ called with arguments (1
8) .
[Condition of type CCL::UNDEFINED-FUNCTION-CALL]
となりました。
M-x describe-modeでは
Enabled minor modes: Auto-Compression Auto-Encryption Blink-Cursor
Eldoc File-Name-Shadow Font-Lock Global-Font-Lock Line-Number Menu-Bar
Mouse-Wheel Show-Paren Slime Tool-Bar Tooltip Transient-Mark
と、なりSlimeが有効に鳴っていると思います。何故うまくいかないんだ・・。
744 :
718:2011/02/09(水) 22:13:17
(define-key slime-mode-map "\C-j" 'foo)
(defun foo (s)
(interactive (list (slime-last-expression)))
(slime-eval-print-last-expression s)
(sleep-for 0 50)
(insert "\n"))
みなさんたくさんのレスありがとうございました!!!!!111111
>>744 あー、ごめん。何かこっちでも色々いじってたんでミスってたかも。
(defun foo (s)
(interactive (list (slime-last-expression)))
(let ((r (cadr (slime-eval `(swank:eval-and-grab-output ,s)))))
(insert (format "\n%s\n" r))))
最後に試してみて。多分これでいける。
>>745 うまく動きました。eval-and-grab-outputの動作はまだよく分かっていませんが、
slime-evalに与える引数に変更が必要だったのですね。
>>744の場当たり的方法ではなくなったのでさっぱりした気持ちになりました。
遅くまでお付き合いありがとうございました。m(_ _)m
ここは僕のお気に入りスレだから
荒らすなよカスども
お前らハンドルネームくらいつけろや
バカか?
なに2chルール守ってんの?
なんだこいつ
キチガイか
ツイッターはキチガイしかいないな
Perl忍者とか言う馬鹿が荒らしてるんだろ
お前らがスルーしないのが荒れる原因ですよ
racketは互換性なくなる拡張を今後いれてくる可能性あるんだろうか
racketはSchemeの実装というより「言語作成ツールキットと、それで作られた
いろんな言語の集まり」を目指してるんじゃないのかな。改名もそのためで。
だから「racketで作られた一実装」としてRnRS互換のSchemeというのは
提供され続けると思うけれど、ツールキットたるracket本体は独自に進化するんでないの?
うんちく笑
うんちく垂れ流してるカスだけど
まつもとひろゆき以下だろ
だったら、かっこつけてLISPやってんじゃねえよカス
所詮ゴミLISPERなのにがんばっちゃって 痛いよ
っでさあ LISPでなにやってんのこのカスは
俺てきにLISPで作りたいものないからさ
つまらなそうだし
> かっこつけて
かっこ つけない奴がLispを扱えるはずない
かっこつけてんじゃねえよ
受け狙い
真剣に死ぬかLISPやめろカス
かっこ イイ!と思ってるからLispやってるわけで。
かっこ イクナイ!と思ったらLispは絶対に書けない。
上級Lisperは全員「かっこ、こっか、かっこ、こっか」ってブツブツつぶやきながらコーディングしてる。
それは所詮、括弧之弧括というもの、好漢いまだLispの真髄を知らぬと見える。
ある伝説的なLispハッカーは、知人のEmacsを後ろから覗き込むと
「確かに見憶えのある記号だが、どうしてもその名前が思出せぬし、
その用途も思い当らない。それは何と呼ぶ記号で、また何に用いるのか」と尋ねたという。
彼が指差していたのは、.emacsに並ぶ無数の括弧の一つであった。
かっこ、こっかとか言ってるのは初級Lisperだったか。
竹内先生ジャネーノ
unixのsh厨じゃないの
cl-cont
と
amb
で検索しても何も出てこない
ないのか
何かの言語で習作にLISPの処理系書いてみるってよく見かけるけど、
その逆ってどうなのかな?
LISPでBASICだのRubyだのを書いてみた人っている?
prolog乗っけるのは教科書で見かけるが、やったことはないな。
電卓までだ。
LISPでHTML言語解析なら見たことある
>>765 「コンパイラ・スクリプトエンジン」相談室15
にTiny Algol by racketのURL張ったばかり。
clでscm動かすマクロみたいなのないでしょうか
逆は検索すると見つかるのですが
うんこな人が書いたperlは読みたくなくなるが
うまい人の書いたperlはすぐわかる
言語の違いなんてそんなもの
773 :
デフォルトの名無しさん:2011/02/15(火) 22:48:51
〉〉
call-with-current-continuation を(car, cdr とかの)基本的な手続きで実装したサンプル無いかな?
>>774 不可能。
処理系から作るのでない限り。
call/ccの説明みてもevalとの違いがよくわからんorz
call/cc と eval を混同するのは意味わからん。
要するにどこでもセーブでしょ?
だったらコピーしてevalにぶちこんじゃえば同じ事じゃなくて?
>>775 やっぱ不可能なのか。安心した。
情報サンクス
自分でevalを作る要領で作れる。
つまりSICPにあるようなインタプリタを作りましょうなわけだが。
>>778 コピーじゃない。
実体は1つ。
>>778 その発想は無かった。
とりあえず違うから一旦忘れてもう一度読め。
手作業で CPS 変換してみるといいぞ。
第一級継続はこういうものだと簡潔に示すのは無理だし、
だからこそ色んな形で解説したものはある。
理解できないなら別の解説を読めよ。
なんか変にアセンブラの知識があるせいかこんがらがるなあ。
アセンブラは俺も使うが、
あまりに Scheme とは通すぎてこんがらがる要素とかないと思うけど。
レジスタ壊されたくなかったらユーザースタックヘ積んじゃえって感じというかなんていうか
自分は、アセンブラレベルでどう動くのかがイメージできるまで、amb を理解できなかった。
ambに限らず、具体例から一般化して抽象的に理解はできるけど、いきなり抽象イメージからスタートできないのって、頭が悪いから?
凄い頭の回転で袋小路へ突進、というケースがあるからなんとも言えん
恩氏の教授(数学者)は「”難しい”には2種類ある」と言っていた
複雑すぎて難しい場合と、単純すぎて難しい場合だとさ
単に難しいっていうと前者を連想しがちだが……
常人が「えーそれ面倒だろ」というようなことを平気でこなして袋小路へ
racketでmecab動かしてる人いませんか?
790 :
デフォルトの名無しさん:2011/02/16(水) 14:30:32
test
>>778 セーブはしない。call-with-current-continuationする(現在の継続を引数にして呼ぶ)だけ。
以下を読んでみて欲しい。
ttp://practical-scheme.net/docs/cont-j.html 継続っていう概念は、本当にSchemeのコアになっていて、言語仕様の様々な所で出てくる。
例えば、多値辺りは継続も理解しないと、本質的な理解が出来ない。とても重要な要素。
また、継続自体は計算機科学の一般的な概念だから、理解に時間を割いて損はないと思う。
関数型なら、値を返す代わりに継続を返す、というのは普通にある。遅延評価したいときとか。
より実用的な応用例だと、継続ベースのアプリケーションサーバとか。
一応、継続と同じ内容の式をevalして、似たようなことはできるだろうけど、
evalでのレキシカルな環境の扱いは、Schemeだとダークコーナーだった気がする。
R6RSの例だとレキシカルな束縛参照してるけど、詳しい定義規格中にあったっけ?
R5RSだと処理系依存だった覚えがある。とりあえず、制約が付くのは確か。
あとは、その継続と同じ内容の式をどう作るか、ってのも大きな問題になるはず。
lambdaで普通に継続を自分で書き下すならともかく、call/ccを使う複雑なケースだと、
継続と同じ内容の式を用意するのは難しくなってくると思う。
そもそも、継続自体は、ネイティブコードにせよ、バイトコードにせよ、インタプリタにせよ、
コードを処理した段階で既にもう存在しているわけで、それをわざわざS式を組み立てて、
その上でevalするっていうのも、随分迂遠な話だと思うよ。新たに作るものじゃなくって、
継続は既にあるものだから。
>>792 > call/ccを使う複雑なケースだと、継続と同じ内容の式を用意するのは難しくなってくると思う。
つまり、可能と?
>>793 同じ動作をする微妙に異なるコードを最低二種類保守する覚悟があって、
かつ移植性を犠牲にし、下手をするとコードの根本的な構造すら変えるリスクを背負い、
低い性能と劣悪な可読性を許容すれば、「似た」ことはできると思うよ。
処理系によって違う行列計算をマクロで統一できないものか
フラットランドが推薦されてる意味がわからない。
誰か教えて。
>>791 > 例えば、多値辺りは継続も理解しないと、本質的な理解が出来ない。とても重要な要素。
それは言いすぎでしょ。
CSPで多値を扱うと美しさを感じることはあるけども。
>>792 全く同意できない。
>>774はフルセットのSchemeを所望しているわけではないし。
SECDマシンで継続を実装するのはすごく簡単です。
S式でSECDを表現するのも簡単です。
>>799 誤解させたのなら謝るけど、
>>778に対するレス。
Schemeで継続を処理する抽象機械を作るのが楽という話と、
evalを継続の代替として使うのが楽という話は違うよね?
多分
>>792は既存のevalでcall/ccが作れるかどうかの話で、
SECDとか自作evalで作れますよって言う人と話が噛み合ってない
>>800 表示的/操作的意味論理解してないと、Schemeを理解したと言えない
みたいな話?
racketにもgsllみたいなのあればいいのになあ
やはり実用はclだ
gaucheの持ち運びについて質問します
gaucheがなかなか良さそうなので、
gaucheをusbメモリに入れて会社外でも使おうと思うのですが、
(出先のosはwindows xpとwindows7です)
gaucheを持ち運ぶには全ファイルをコピペすればいいのでしょうか?それとも何か特殊な設定を施すのでしょうか?
速さは求めておらず、想定しているのは
既に作成している.scmファイルを実行することだけです。
欲を言えば、gaucheのページに、スクリプトのポータブル化の話がどこかにあったと記憶していますが、
バイナリのサイズが数M程度で収まるなら、できればそうしたいのですが。
よろしくお願いします。
>>805 USBメモリにOSを入れて、OSごとgaucheを持ち運んでる
出先でTrojanとして検出されて大問題の巻
>>805 Windows版Gaucheはディレクトリツリーをそっくりコピーするだけで動いたはず。
インストーラから入れたならC:\Program Files\Gauche 以下ね。
その下のbin\gosh.exeかbin\gosh-noconsole.exeを起動すれば、
付属ライブラリはそっからの相対パスで探してくれる。
M式が使える処理系ってあります?
(require :maxima)
(setf a #$ x+20*y*b$)
元ネタ読んだけど、パンチカード云々の話が、わけわかめだった。
813 :
453:2011/02/24(木) 02:05:41.05
2000年かぁ… (遠い目
2000年からの蓄積があるperlがいかに素晴らしいか
そうかぁ、perl って 2000年前からあるんだぁ。
一万byte2000年の前から愛してる
8000年すぎたころからスパゲッティ
一億年と二千年あともデスマーチ
gaucheのwilikiの質問です
WiLiKi最新版にcode 要素、kbd 要素、ルビに関係するruby 要素諸々を追加したいのですがやり方が分かりません
公式サイトの「WiLiKi:リファレンスマニュアル」が「WiLiKi リリース0.4用」なので
もしかしたら最新版では要素を追加する機能が何かあるのかもしれませんが
よろしくお願いします。
公式ドキュメントは無いね。マクロで良ければ
(define-reader-macro (ruby base text)
`((ruby (rb ,base) (rp "(") (rt ,text) (rp ")"))))
とか書いとけば
[[$$ruby 補毛 ほげ]]
でruby要素になるけど。
つかWiLiKiで質問したら?
WiLiKiのメーリングリストとかはないんだっけかな。
Gaucheのメーリングリストで聞けばいいと思うよ。
ざっと WiLiKi の中を見れば define-reader-macro がそれだってのはすぐわかる。
だけど現時点ではとても整理されているとは言えないコードになってる。
コードの整理が出来てない状況ではドキュメント化は後回しになっても仕方ないだろ。
フォーマッタとかRSS生成とかは単独で使えるようになって欲しいしなぁ。
フォーマッタは分離しようと思ったけど、いまいち綺麗にまとまらなくて保留、
とかどっかで言ってなかったっけ? 凄いうろ覚えだけど。
あと、reader/writer両マクロの仕様を変えるかも、みたいな事も言ってた気が。
$$と$がややこしい、みたいな話で。確かにあれは素で間違う。
とりあえず、WiLiKiの要望とかのページに書いとけば、返事もらえると思う。
それらの話題は既出。 返事を貰うまでもない。
ただ、綺麗なコードでは無いにしても実際に明確なトラブルなく動いている (あるいは運用でなんとかできる) ものを修正するのは
重い腰が上がらないということはあるので、そういう要望をもっている人が結構いるというのを認識してもらうという意味ではたまに
むしかえすのもアリかな。
shiro さんのブログが今は WiLiKi ベースの独自システム使ってて、いずれ WiLiKi に盛り込む形でリリースする予定らしい。
そのときに整理するかもしれないな。
Kahuaは開発止まってしまったの?
828 :
821:2011/02/25(金) 22:20:14.91
WiLiKi が git に移行した。 Gauche も近い内に移行する模様。
時代の趨勢というやつだな。
svn は全部ディレクトリっていう概念がわかりやすくて簡単だけど、
動作が遅いっているのが致命的だったな。
それさえ改善されれば git より使い勝手のよい場面もありそうなんだが。
流石に今の時代、保守目的以外でSubversion使う意味ってほぼないと思う。
Git、Mercurial、Bazaarの分散三強で、ほとんどのケースをカバーできるだろうし。
Gaucheって開発者は実質一人?
ひとりだね。フィードバックしてくれるコアなユーザは一定数いるけど。
ChickenとかGambit、Bigloo、Ypsilonなんかも基本ひとりみたいだし、
LarcenyとかMoshも二、三人でやってるし、あんまり大勢ではないことが多いと思う。
そもそも、Schemeだと規模も割と小さいし。
Common LispのSBCL辺りは、割と多くの人でやってるっぽいけど。
srfi なんかは既存のものを手直ししたりして使うこともあるし、
sxml まわりのライブラリも既存のものを取り込んでる。
だから全体をひとりで書いてるというわけではないけど、
大半はひとりで書いてるし、方針の決定も(ユーザーの意見は訊きつつも)ひとりの裁量でやってる。
「Gauche の開発者」と言えるのは shiro さんひとりだろうね。
>>833 SBCL は CMUCL が少人数でやっていたのを、もっと皆でワイワイやろうぜっていう
感じで始まった気がする(気のせいかもしれないけど)。
CL だと Clozure も独りっぽいね。
shiroさん一人がコントロールしている訳だから
バランスもよく取れてていいね
CCLはフルタイムの開発者が二人(Gary ByersとR. Matthew Emerson)と、
他のClozure Associatesの社員もたまにコミットしてるよ。元々MCLの開発者で作った会社だし。
バグレポートとかすると、大抵前述の二人が対応してくれる。
あ、そうなんだ。情報サンクス。
いつも思うんだよ、shiroさんやっぱ超人だと思う。
shiroさんほどのlisper/schemerになるにはどういう手順で勉強すればいいんだろう
ハードルがあまりにも高すぎて何から手をつけてよいのか分からないw
ときたま思うことだけど、純粋なlisper(?)と多言語に精通しているlisperの差はかなり大きい気がする
前者のコードが奇麗なのは勿論だけど、後者の方は組み立て方そのものが何か違う
見ている世界が違う、って感じかなあ
うまく言葉で言い表せないのが残念
つ 地道な努力
コードを書くときに一番重要なのは「抽象化」だと思うんだよな。
それと「名前」
goto や関数呼出しや大域脱出やその他諸々のフロー制御が継続ひとつで
説明が付くっていうのは自分では到底思い付けないけど、
Scheme を設計した先人はうまいこと抽象化したもんだと思うよ。
継続までいかなくても、 fold とか思い付いた奴は超偉いと思う。
map くらいならまぁ思い付くけど、
fold をひとつのパターンとして抜き出すのは優れた洞察力が必要だろう。
そういう抽象化された世界、メタな世界で考えることができて、
なおかつ低レベル (下層) の現実を忘れないっていうことが出来るようになるには
結局はそれが必要な場面に遭遇したことがあるという経験の積み重ねじゃないかな。
shiro 氏は東大卒ってだけあって天性の才能はあるかもしれないけど、実務で鍛えられた部分は大きいと思う。
数学に王道なしって言うけど、どんな分野でもそうだよね。
東大卒なんだ、知らなかった。
継続を考えたのは、ALGOLの意味論をやっていた理論屋さんたち。
Landinさんもほぼ同時にプラクティカルな視点から同じことを考えていた。
SECDマシンは継続を直接扱うことが出来る抽象機械だから。
その後も継続の研究は続いていて、中にはfirst class objectとしての研究もある。
Schmeの貢献はfirst class objectとして洗練した形で広く提供したこと。
Fold関数は昔から数学であるけど、
APL、BackusのFPの貢献が大きいと思う。
Backusさんはたった一人であんな事掘り下げちゃって凄い。
さすがTuring賞。
gotoや脱出は継続を無視する。無視してるのに継続継続いうのは余計なお世話。
逆に、堂々と出てきて良いはずの関数呼び出しの時はどこかに隠れている。
nonlocalと同じパターン。
今までlocalなんて一言もいわなかったのにいきなりnonlocalの話になる。
できる奴は、授業で習ってないはずの話になぜかついて行ける。
できない奴はここで落ちこぼれる。
ループや関数呼び出しの意味付けから継続が出てきた。
gauche も git に移行したね。
>>844 これはわかりやすい
なるほどそうだったのか
Kawa ABCLで実用的なもの作られた事例をみかけない
Clojureはあるのに
SECDマシンとforthを比較するとどんな感じになるの?
forth はユーザースタックとシステムスタックしかない
>>851 LispマシンのCPUコアもそんなもんだぞ
なんか Gauche の git の head が configure の段階で変になってるっぽい。
make を初めたら必要なマクロ (GAUCHE_SIGNATURE とか) が定義されてないことになっててコンパイルできない。
俺の環境のせいかもしれんから一応だれか確認してくれんか?
肝心なこと言い忘れた。
環境は Mingw な
>>849 知っている範囲で、KawaやABCLを使ってる人と、Clojure使ってる人の数を比べると良いと思う。
それに、Clojureはもう別のLispだし、SchemeのKawaやCLのABCLとは立ち位置も違う。
あと付け加えるとしたら、Javaと連携したいときって、仕事の場面でのことが多そうだから、
そういうケースだと事例が表に出にくいはず。
>>844 何か勉強になったぞありがとう
やっぱ論文読まなきゃ駄目だな
>>853 うちでも再現した。
config.statusはsubversion版で作られるのと同じなんで、configure自体はうまくいってる。
だが src/gauche/config.h.in の行末がCRLFだと、置換がうまくいかないようだ。
config.h.in の行末をLFに変換してやったら通るっぽい。
gitの設定次第だと思うがよくわからん。
>>857 thx
改行の問題だとは気付かなかった。
git の設定を変更するコマンド
git config core.autocrlf false
これで改行変換が起こらなくなる。
その後に
git checkout .
でワークディレクトリのファイルを更新しなおしてOK
Ypsilon の開発って止まってんの?
ピンボールの新作のリリース後サポートとかにかかりきりなんじゃないかな。
Ypsilon を組み込んだピンボールって、
夢の、現代版 Pinball Construction Set になる予定ということなんだよなぁ
LispってSpueakみたいなのは無いの?
Elisp使う人って居てるの?
>>865 興味があるなら elisp のスレに行けば?
>>865 いっぱいるよ
emacesnでelisp使えないやついない
というかelisp使えないならemacsにこだわる理由がほとんどないと思えばいい>>今時の編集緩急
eclipse と elisp は少し似ている(字面が。)
elispで証明系書いちゃう人も何人もいるくらいだし。
SwindleはCommon Lispのコードを移植するのに使えないのだろうか
setfはあるよね
racketには何種類かclassの定義があるみたいですが
Gaucheと一番互換性が高いのはどれなのでしょうか
蓮舫、民主党が仕分け ・ 廃止したもの
・ 石油と塩の備蓄 ( 仕分けパフォーマンスの生贄 )
・ 防衛費 ⇒ 自衛隊災害救出活動も縮小 ( 日本の自衛・防衛弱体化は民主党の継続悲願 )
・ スーパー堤防 ( 100年に1度の大震災対策は不要 )
・ 災害対策予備費 ( 生活保護枠拡大(母子家庭)の財源化 )
・ 地震再保険特別会計 ( 子ども手当の財源化 )
・ 耐震補強工事費 ( 高校無償化の財源化 )
・ 学校耐震化予算 ( 自民党が推進していた政策 )
・ 除雪費用 ( 蓮舫が東北地方整備局を目の敵に、結果は言わずもがな )
・ 八ッ場ダム ( 「河川は自然堤防のままが環境にやさしい」 )
「二百年に一度の地震に備えてお金を使う必要があるんですか?」
そのスーパー堤防が完成してたとしても無駄だと証明されたのが今回の震災なのだが
スレ違いに付き合う奴はいずれにしても賢くない
そうだ!マクロの力で震災被害者生き返らせようぜ
俺って転載
Dead Over Lambda
elispで大きいプログラム作れる人はホンモノのハッカーだ
道具としたら不便すぎるelispで作れるってことは、実際何ででも作れるレベルの人だ
elispはすごく便利。
Emacs固有機能のprimitive, bindingが素晴らしい。
Ypsilon は Windows では VC でのコンパイルだけしかサポートしてないの?
>>877 パッケージが無いってのが致命的に駄目言語だと思うんだけど>elisp
>>879 シンボルの命名規則で何とかなってますが?
現実的にかなり大きなライブラリ集を管理できてるわけで。
>>879 世の中パッケージ管理がサポートされてる言語の方が「はるかに:少ないよ
>>881 何とかなってるか?例えば適当に navi2ch から見つけたこんな関数。
(defun navi2ch-multibbs-subject-callback (board)
(navi2ch-multibbs-get-func
(navi2ch-multibbs-get-bbstype board)
'subject-callback 'navi2ch-2ch-subject-callback))
パッケージがあれば多分、一行で書けるぞ?
(defun multibbs-subject-callback (board)
(multibbs-get-func (multibbs-get-bbstype board) 'subject-callback 'subject-callback))
それ同じ意味じゃないし。
レベルの低いプログラマの意見は無視させていただきます。
lispで名前空間が問題になるのはアプリケーションが共通のプラットホーム上で動く事に起因するんだよな
プロセス毎とかプロジェクト毎にシンボルがぶつからないならここまで問題にならんだろう。
Buffer localな変数とか、dynamic scopingとかあるから、
意外と問題にならないです。
>>883はパッケージがあったゆえに、
名前参照が複雑になって問題になったケース
つか, 作れるだろ, elisp でパッケージシステム…
なしでやってんだからほっとけばいいじゃん
navi2ch-ifxemacs とかのユーティリティぐらいは
ifxemacs と書けるほうがちょっとは見易いはず。
だれか作って寄付してやれよ
おれはしらん
命名規則でなんとかなるって
運用対処でなんとかするのと同じで
開発運用ユーザが少人数の場合だけじゃないの
みずほの障害が本当にバッチ処理の遅れだとしたら、こんどこそ本当に
MapReduceみたいな並列計算が必要とされるようになるのかもしれん。
そのときは関数型言語も付随して地位向上といきたいね。
>>892 スマソ。恥じかいた。。
ただ、並列計算の知識を入れていく必要性が今後もっと上がるのは確かな気がする。
銀行に限らず、普通に扱うデータ量がめちゃくちゃ増えているんじゃないかと思うんだ。
>>893 今時はどこでも並列計算はやってるけど、割と泥臭いノウハウの塊みたいだなー。
Google ではフレームワークのレベルで作り込まれててちょっとしたアイデアを試す
のが簡単に並列化できるみたいな話は聞いたことがある。
言語よりもフレームワーク、ライブラリの作り込みで対応できる部分が大きいんじゃないのかな。
並列化に注目が集まってもそれが関数型言語への注目へは繋がらない気がする。
いわゆるdistributed computingは、いまだとJavaのApache Hadoopが流行ってるのでは
関数型じゃないですね
googleがそもそも関数型使ってないですし……
並列計算って一口にいっても、データや計算の性質によって扱い方は色々違うよ。
何らかの並列計算ってことなら、現場で使われるようになってもう何十年、ってとこだろ。
Google的なアプローチは、大量のデータから何らかの傾向を抽出するには良いんだけど、
トランザクションを矛盾無くシリアライズしないとならない銀行のシステムとは全く性質が違うと思う。
勘定系は触ったことないけど、でかいデータベースの実装の中身いじってるんで。
Lispで書いてるけど低層は全然関数型っぽくない。
それもそうだな。
銀行システムで MapReduce しようとしたら Map できるように切り分けるのが大仕事になりそうな予感。
今回のみずほのトラブルは
並列ソートマシンが想定しているケースを大幅に上回る
口座集中が起きたため。
ワーストケースを見積もって、落ちないように、
あるいは完全に処理できるように投資するかどうかの問題。
プログラミングパラダイム的なことでは解決できない。
まあ窓口閉まってから一気に勘定する業務のあり方を見なおせばいいんだが。
特定の口座に取引が集中してってのはいかにももっともらしいんだけど
みずほ側からそういう発表ってあったの?
ぐぐれかす
> 同行は「東京都内の特定支店の特定口座への振り込みが
> 想定以上の件数に上った」と説明しており
ああほんとだ
だけど1秒一回のトランザクションが処理できない
webシステム作った大手開発会社なんてものもあるしね
例の図書館?
racketで作ったWebサイトをdocomoの携帯で見てみたら
textarea も submit ボタンも表示されない
とあるLISPのソースを読んでおります。
append2という関数の動作がよく理解できません。
もしよろしければ解説を願いいたします。
自分でよんだかぎりでは、
a_ と同じ構造の cons cell list を、新たに取得した cons cell
で構築し、末尾に b_ を接続しているように思われます。
この際 b_ が Atom の場合は終端が .対になる。
以上のような理解でよいのでしょうか?
----以下ソース----
//セルの型
typedef void* cell;
//cons cellの仕様
typedef struct {
cell car_e;
cell cdr_e;
} cons_t;
//機能:
// cons cell を取得し、car に car_、cdr に cdr_ を設定して返す。
cell cons( cell car_, cell cdr_ );
cell append2( cell a_, cell b_ ){
if( NIL == a_ ) return b_;
return cons( CAR( a_ ), append2( CDR( a_ ), b_ ) );
}
いや、ごく普通の再帰によるappendだろ?
append の実装も貼ってみたらいいんじゃないかな
>>907-908 レスありがとうございます。
ソースを実行して動作確認したところ普通に a_ と b_ を接続しているだけでした。
お手数おかけいたしました。
なんで2なんだろうな?
ループ版があるとか?
それとも二引数のsubrは全部末尾に2付けるとか?
>>910 ほかにも concat2 という関数などもあったので、Cの標準ライブラリと
名前が被るかもしれないと思って 2 をつけたのかもしれないですね。
lispのappendは不定長引数を取るのが普通だから、2引数版であることを明示したかった、とか?
不定長引数版のappendはappend2をもとに定義されたりしてないかな。
ああ下請に付ける2か。
guile2 って Windows では動かないの?
glint が最新の Gauche で使えるようになった模様。
ほほぉ
Gauche-gtkも簡単にwin,linux両方で使えるようになればいいなぁ
地獄のミサワ「ラムダとか俺はとっくに超えててクシーだから」
>>918 やっぱmingwじゃ簡単にはビルド出来ないんか
>>920 根本的な部分では問題ないけど、ささいなひっかかりはいっぱい有る。
C の基礎やビルドツールの基本的な使い方くらい知ってればなんとかなるレベル。
面倒ではあるが。
Emacs Lisp が色々とレキシカルスコープになるって話を聞いたんだけど、実際のところどうよ?
ついにelispもレキシカルスコープかぁ
これは歴史的だ
>>923 これマジなの?それともエイプリルフールネタ?
うに板より転載
>ここまで lexbind が trunk にマージされた話題無し
>洒落た返信があったんで載せとく
>
>On 01/04/11 18:32, Stefan Monnier wrote:
>> Just a note that the lexbind branch has been merged into trunk,
>
>wow, very cool... waaaiiit...
>
>;;; -*- lexical-binding: t -*-
>(defun april-fools? ()
>(let ((a t)
>(check (let ((a nil)) (lambda () a))))
>(funcall check)))
>
>(april-fools?) => nil
>
>This is great news.
dynamic binding だと check には (lambda nil a) が入って、
lexical binding だと check には (lambda nil nil) が入るのか。
なるほど・・・
それで、dynamic binding でも (let ((a nil)) (funcall (lambda () a))) だと nil が返ると。
評価される時の環境に応じて値が決まるから dynamic binding なのか。勉強になった。
>>924 そうするとelispにもschemeのparameterizeみたいな機構が導入されるの?
(CLispはよく知らない)
あ、先に (setq lexical-binding t) しておく必要があるのか・・・
バージョン確認したらリポジトリ古くなかったし、スマソ。
何もせんでも変わったらこれまでのプログラム動かんやん…
いやー、お恥ずかしい
スレ汚しスマソ・・・
>>924 fluid binding はいい加減もう古いよねえ
elispはclと互換になるってこと?
Common Lispにはbuffer localな変数なんてないし…
T,NIL まくらが欲しい。
>>924 長い時間掛かったけど、ここまで来るのは並大抵のくろうじゃあ無いよね
(setq before (lambda () "before"))
=> (lambda nil "before")
(setq lexical-binding t)
=> t
(setq after (lambda () "after"))
=> (closure (t) nil "after")
>>937 なんで枕?
昔nilシャツってのはあったけど(Tシャツに対抗したらしい)
新consさんいらっしゃい
窓辺のマーガlet、cdr三枝です。
(setq pillow T)
Ada に負けてるとは
Adaって活発になるイベントってあったっけ?
それは国家機密。
あれだ、きっと原発制御に使われてるんだ!
静かだな。lispはもう死んだのか
ここがLispの中心だったのか
そりゃあ失礼したね色々とw
どういたしまして。
Gaucheを組み込みで使用したいと思っております。
以前はコンパイル結果を保存出来なかったようですが、
現在はバイナリを保存しておけるようになったのでしょうか?
今の日本語圏での中心ってどこ?
関西?
>>955 プリコンパイルはだいぶ以前からできてた。
後に仕組がかわったりはしたが。
とりあえず src/precomp を見ろ。
組込ってどういう規模のもの?
自家製のゲームに組み込みたいなと。
リアルタイムローグライクで、モンスターのAIとして使ってみたいと思いました。
AIといっても反射型なので単純なものです。
昔は組み込み用途も想定してたみたいだけど、
最近はスクリプト用途を重視するようになってる。
あまりインターフェイスが整備されていないしドキュメントもないので、結構面倒かも。
GC が問題にならないか気になる。
Gauche が使う領域だけが GC 対象になるの?
詳しい人、説明よろ。
Gaucheのアロケートルーチン(実体はBoehm GC)でアロケートしたメモリだけがGCの対象。
Gaucheでアロケートした領域を指すポインタをアプリ側で保存したい場合、
それがGCに見えるように工夫が要る。Gaucheのハッシュテーブルに登録しておくとか。
ケースバイケース。
このへんの話はGaucheに特別のものではなく、GCのある外部ライブラリを使う場合に
普通に考えるようなことを考えておけばOK。
ちゃんとしたドキュメントは無いけど、メモ的なものはどっかで見たような気がする。
examplesの中だったかな。
adaなんか使ったら仇になる。
elisp にasdfも入ったらいいのに
>>965 声優スレに突撃してアレは痛い痛すぎる
93で返されてるし
竹内先生のところにLISPの3人を放り込んで
『初めて(/ω\) の人のためのLISP』という本を出したら買うのに
多分、連中はわけわかめやろ ええねんあれで
このまえR6RSが出たばっかりのような気がするのはなぜだろう...
もう何年も経ってるんだよな
>>970 Thanx!
>>971 あっと言う間だね
この調子だとオレSchemeがRnRS対応できる日が永遠に来ない
[]が予約に戻ったり、SRFIからcond-expand、parameterize、guard、環境変数へのアクセス等が導入されたり、
recordがR6RSから大幅に簡略化されたり、byte vectorがblobに改名されて再導入されたり、
loadが復活して、レキシカルスコープに外部ファイルを展開するincludeが導入されたり、
libraryがmoduleに改名されたり、差別されてた手続きが適切なモジュール名で復権したり。
取り敢えず、読んで思ったことは、R6RSを黒歴史にしたがっているというか、
後方互換性とか取る気ないだろ、これw
>>973 NOTES Language changes ってところ見たら Revised "5" report からの差分が書いてあった
R6RS 涙目w
>>970のR7RSはかなりいい方向に行っていると思う
gaucheはどうするんだろうか?
ていうか R6RS って誰が得したんだろうね
色々統一されたら得する予定だった。
統一感に興味ない人はPerlでもなんでも得する。
なんかBSフジでLispの番組が始まるって 書いてたよ。竹内せんせが教授する番組か?
竹内って仏様の奴かw
はやく死ねよ
R5RS 1996
R6RS 2007
なのに、
backgroundに、1992までしかでてこないw
R6RSは完全にハズレだったなw
やみくもに機能を追加した感がある
SRFIが相応しい物まで仕様に突っ込んで酷いことになった感がある。
それと、厳密で網羅的な仕様が欲しいなら、Common Lispを使えば良かった。
しかも、推進した側のPLTは、Racketで違う地平に旅だってしまったという。
ライブラリはここで変えちゃったらせっかく決めた甲斐がないと思うんだが…
まぁ、今の内に変えないとって感じなのかもしれんが。
やっぱ俺はR5RSが好きだな
無駄がなくて洗練されてるわ
schemeのasdfはまた仕様変更したってこと?