面倒くせえ 後は誰か頼むw
□その他(3)□
初心者が集うIRC(布教してくれる先生も大募集です)。
irc.scenecritique.com
port 6667
チャンネル #Lisp_Scheme
Schemeのテストコード書いたり、簡単な実行したりコードさらしたりするにはここへカモン。
ttp://codepad.org/ コードを書いて実行した時のURLを記録しておけば、実行結果も一緒にさらす事が出来て幸せです。
// / / パカッ //⌒)∩__∩ /.| .| ノ ヽ / | | ● ● | / | 彡 ( _●_) ミ まピョーん☆ / | ヽ |∪| /_ // │ ヽノ \/ " ̄ ̄ ̄ ̄ ̄ ̄ ̄(..ノ
テンプレ長いよ! 連投規制に二回も引っ掛かったよ!
>>3 諦めんなよ!
>>8 >>15 お前らも手伝えよ!
これは乙じゃなくてλなんだからね
乙です
1乙 Little終わったので萩谷先生の関数プログラミング買った。 3月まではこれとものまね鳥読む。
てんぷら増えすぎじゃないか? 毎回20レス近く潰れるのは無駄な気がする どうせ雑談しかしてないし、こんな長いと読まないっしょ 仕様書程度でいいんじゃないか
つまり Common Lisp→EuLisp R6RS→R5RS ですね 乙と違うんだからね
>>24 「仕方ない。代わりに貼るか→この分量マジすか」
というコンボを喰らった身としては、同意せざるを得ない。
細かい内容は、テンプレ置き場でまとめれば良いと思う。
∩_ 〈〈〈 ヽ 〈⊃ } ∩___∩ | | | ノ ヽ ! ! / ● ● | / | ( _●_) ミ/ まピョーん☆ 彡、 |∪| / / __ ヽノ / (___)
なんだお前?やるんか? くらえ!つ nil
テンプレ置き場ってないし。 WiLikiあたり借りる?
テンプレが役に立ってないことがよくわかる。
on lisp読み終わったんだが 次はpractical common lisp読んだらいいのかな schemeの対応する本はないのかな
SICP
>>34 昔、飛ばし読みしちゃったので
今度は問題やりながら読んできます
その辺は場合にもよるから一般化はできないね。 反例は例えば with-input-from-string は入力が先だし。 まぁ、主要なもの、対象とするものが前のほう、くらいだろうね。
既にCyanスレで見たから。
そんなのもあるんだ
クラスのないオブジェクト指向とかS式のないマクロとかは面白いね 大前提をぶっ壊すところが
>>43 S式の無いマクロならDylanがあるし、
プロトタイプベースのOOPならSelfとかがあるじゃん。
むしろ、そういう引用元の概念を、あの歳できっちり理解してるのが末恐ろしいよ。
5つの自然言語ならよかったのになあ
46 :
デフォルトの名無しさん :2009/01/17(土) 15:28:41
高速で使えるライブラリのそろったCyan実装が登場したら Ruby以上に世界中のハッカーにインパクトを与えそう。
私は信じんよ、ニュータイプの存在など
既存のpythonのlibraryが使えてマクロありなら便利かもね
現状だと荒削りだし、そりゃ言い杉なんじゃないかな。将来は楽しみだけど。 素直に理論面とかハードウェアの知識を学んでいったら楽しみだね。 まだだ、まだ終わらんよ!とか言わされちゃうのかなー
本人乙www
クワトロ・バジーナ降臨ときいてすっ飛んできました。 アクシズ落とさないでね。
wikipediaのclikiのリンクが古いままだ
>>37 goshだとexactな数値のlogがとれなかった
>>56 他の処理系みた?
Gaucheで数値計算するから・・・
>>56 普通にとれるだろ
gosh> (log 1000)
6.907755278982137
gosh> (log 10000)
9.210340371976184
gosh> (log 100000)
11.512925464970229
gosh> (* 0.4342944819032518 (log 1000))
3.0
gosh> (* 0.4342944819032518 (log 10000))
4.0
gosh> (* 0.4342944819032518 (log 100000))
5.0
gosh> (* 0.4342944819032518 (log 3628800)) 6.559763032876794 gosh> (* 0.4342944819032518 (log 93326215443944152681699238856266700490715968264 38162146859296389521759999322991560894146397615651828625369792082722375825118521 0916864000000000000000000000000)) 157.97000365471578
gosh> (log 402387260077093773543702433923003985719374864210714632543799910429938 51239862902059204420848696940480047998861019719605863166687299480855890132382966 99445909974245040870737599188236277271887325197795059509952761208749754624970436 01418278094646496291056393887437886487337119181045825783647849977012476632889835 95573543251318532395846307555740911426241747434934755342864657661166779739666882 02912073791438537195882498081268678383745597317461360853795345242215865932019280 90878297308431392844403281231558611036976801357304216168747609675871348312025478 58932076716913244842623613141250878020800026168315102734182797770478463586817016 43650241536913982812648102130927612448963599287051149649754199093422215668325720 80821333186116811553615836546984046708975602900950537616475847728421889679646244 94516076535340819890138544248798495995331910172335555660213945039973628075013783 76153071277619268490343526252000158885351473316117021039681759215109077880193931 78114194545257223865541461062892187960223838971476088506276862967146674697562911 23408243920816015378088989396451826324367161676217916890977991190375403127462228 99880051954444142820121873617459926429565817466283029555702990243241531816172104 65832036786906117260158783520751516284225540265170483304226143974286933061690897
96848259012545832716822645806652676995865268227280707578139185817888965220816434 83448259932660433676601769996128318607883861502794659551311565520360939881806121 38558600301435694527224206344631797460594682573103790084024432438465657245014402 82188525247093519062092902313649327349756551395872055965422874977401141334696271 54228458623773875382304838656889764619273838149001407673104466402598994902222217 65904339901886018566526485061799702356193897017860040811889729918311021171229845 90164192106888438712185564612496079872290851929681937238864261483965738229112312 50241866493531439701374285319266498753372189406942814341185201580141233448280150 51399694290153483077644569099073152433278288269864602789864321139083506217095002 59738986355427719674282224875758676575234422020757363056949882508796892816275384 88633969099598262809561214509948717012445164612603790293091208890869420285106401 82154399457156805941872748998094254742173582401063677404595741785160829230135358 08184009699637252423056085590370062427124341690900415369010593398383577793941097 00277534720000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000) +inf.0
on lispの原著が34000円もするなんて・・・ 最後のいくつかの章で図がみえないから欲しかったのに
何千ページの本なの?
67 :
デフォルトの名無しさん :2009/01/19(月) 20:55:42
>>67 そこのは、例えばFigure 24.1
が見えないよ。他にも見えない図がいくつかあった
日本語訳の本に載ってないって事?
Head First Common Lispはまだか。
たぶん一生でないよw
主婦の友増刊号「誰にもわかるコモンリスプ」
片仮名で書くとめちゃくちゃイメージ違うなぁ。
フランス語みたい。 イロムサコン・フィヨンセ・コモンリスプ
特別寄稿ガイ・スチール・ジュニア氏 「君もリスプやらないか?」
「いいこと思いついた。 お前、俺のテイルジャンプで、メッセージパッシングしろ」
「アッーーク!」
アンジー・コモン・リスプ
微妙にワロタ
GaucheにIDE付けれの人まだ張り付いてるのか
Lisp 系言語だと emacs か vi しか選択肢が無いのは事実だけど、 あらたに統合環境を用意する積極的な理由ってのも無いんだよなー。 欲しいのはデバッガみたいだけど、 仮にデバッガが便利だとしても Scheme にふさわしいデバッガのモデル は過去事例を研究したところで容易に決められるとは思わんのだよなー。 これだけ長い Lisp の歴史の中でいわゆる「デバッガ」が言及された ことがそんなにないってのはただの偶然だとでも思ってんだろうか。
pltはそのへんがんばってるんじゃないの
なんでlispは歴史的にデバッガが言及されないの?
>>85 文脈嫁。
>>83 は、GCを考案し、動的言語の先駆けとなったLisp に、デバッガの話が持ち上がらなかったのは、Lispにデバッガが不要だから、と云いたいんだろ。
>>83 は、これだけ長い Lisp (スレ)の歴史の中で、と言いたかったんだよ。
>>83 Schemeの話をLisp系と一般化しないでくれ。Emacs Lispのデバッガはなかなかいい、
CL系は昔から規格に最適化オプションで debug 指定ができたりと、デバッガは
売りにしてたよ。SchemeでもPLTやGuileはがんばってるじゃん。
DebuggerのないLisp machineなど存在しない。 もともとsmalltalk実装のモデルになったような 統合プログラミング環境を持っていたのがLisp。 今はむしろLLみたいな軽い環境が流行りで、 外界とのインターフェースは昔より豊か。
eclipseあたりに自力で作ってみたらいいのに
調べるのめんどくさいんでここで聞きますがscheme ってバイトコードはけるの
>>91 Kawa, JSchemeでググレカス
>>89 Smalltalkより前にIDEを持っていたLispってどんなLispだよw
まったく関係ないがh抜き不便
アセンブラ使え
>>93 TECO+MacLisp
後継のEmacsがSmalltalk-76と同時期。
超古代文明の発掘みたいな。 断絶があるのはなぜだろう。
車輪の再発明と言ってだな、
>>82 別にどんな主張をしようが構わないが、
「デバッガ」っていう重要なカテゴリ以下を私物化してるのがちょっと……。
あれのどこがGaucheのデバッガの話なのよ?
何で、自分のページとか作って、そこでやらないんだろうね?
まあWiLilki的にひどすぎるということになれば管理者のShiroさんが強権発動するでしょ
俺はffiの項目を私物化したいぞおお ジョジョオ〜
継続渡しマクロなんて作るぐらいなら common lispの上にscheme作っちゃえばいいのに
みんながACL使えばみんなが幸せ
もっとお手頃価格でACL売ってくれ。 俺も使うから。
一方、ロシアのSchemerは黒板を使った。
>一方、ロシアのSchemerは黒板を使った。 作らないところが寂しいよな >もっとお手頃価格でACL売ってくれ。 なんであんなに高いんだろうね? 年間売り上げみてみたいよ。 株主になっても一票そこに投じられそうもないのが悲しいやね
ロシアのLisp事情ってどんな感じなんだろう。 あそこは数学も物理も凄いんでしょ?
行って確かめてこいよ
ロシアは遠いし言葉がわからないから かわりにロシアンパブ行ってきます。
ttp://sourceforge.jp/magazine/09/01/27/0039208 あとまあ、これもある意味予想通りではあるが、LispやScheme、Haskellと言ったあたりは、
結局のところ「語られる」言語であって、「使われる」言語ではないようだ。
HaskellにしろCommon Lispにしろ、近年ではライブラリも相当揃ってきており、
パフォーマンスの面から言っても実用言語として遜色ないものになりつつあるので、個人的には残念なのだが。
Emacs Lispも仲間に入れてほしいんですけど。
だが断る
各個人の問題として何故使わないのか。
先週新聞に載ってたセンター試験の数学UAをやってみたんだけど 21世紀になって10年たとうというのにひどいBASICのプログラムが載ってたんだわ 高校生に勉強させるなら COMETでもMIPSでもいいからアセンブラでやらせるか BFで難易度高めにするか LispやHaskelやForthで教養を身につけさせるかすればいいのに あるいはスパコンのためにFortranを教えるか
>>114 次々と新たな処理系が開発されるのは、既にある処理系を使いたくないのかもな。
勉強のためだとしても、なんで人のソースを読むことより自分で書くことを選ぶのか。
それが問題だと思うよ。
IT音痴大国の名に恥じないな。
Lispはラテン語ではない。と誰かが言ったとか言わないとか。
むしろラテン語だろ
まあもう少し待ってれば予想外の変化が起きるかもよ
Lisp/Scheme類は法律で禁止され、地下で開発するしかないのだ。
>>115 あれはなんの冗談なんだろうと思ったな。
釣りじゃないのか、とか日付を確認したりとか。
徐々にその事実が恐ろしくなっていった。
>LispやHaskelやForthで教養を身につけさせるかすればいいのに
お前は俺かw
BFで難易度をってところにワロタ
Lisperだけで会社作ったら、経営していけるかな。
漢詩って何かいいね。
情景が目に浮かぶようだね。霜ってのがまた良いな。 ……ところで、ここ何のスレだっけ?
comp.lang.lispに何度か書き込みしてるはずなのに反映されない なんでだろ
ネットニュースだから配送の問題とか?
http://quasiquote.org/log2/Scheme/Gauche/Gauche-lazy-ffi をconfigure make make installしてから
gosh> (use lazy-ffi)
*** ERROR: Compile Error: failed to link "lazy-ffi" dynamically: /usr/lib/gauche/site/0.8.12/i486-pc-linux-gnu/lazy-ffi.so: undefined symbol: strlcpy
"(stdin)":2:(use lazy-ffi)
Stack Trace:
_______________________________________
gosh>
何が問題なのでしょうか
だからここはサポート掲示板じゃねえっつーの またどうせバージョン違うんだろ
やっぱlinuxってきもいなー
gimp2.6.3(ほぼR5RS互換) のscript-fu で (let ((foo 2) (bar 3)) (display foo) (display bar)) ->23#t これと同じ事がしたくて(返り値は無視して) 下のように書きましたが変数ではなく 文字列として扱われてしまいます。 (let ((foo 2) (bar 3)) (mapcar (lambda (arg) (display arg)) '(foo bar))) ->foobar(#t #t) 上に書いたlispと同じ動作にするにはどう書けば良いでしょうか?
>>135 「'」(クォート)をつかわず、 (list foo bar) としたら良いのでは。
あるいは `(,foo ,bar) (先頭はバッククォートね)かな。
letやmapcarが出てくるのにquoteが判らないとは えらい偏った学び方したんだな quoteはLISPの基礎
>>137 偏ってない。変数とシンボルを混同するのはLISPの名物。
変数とimmutableな文字列なら、混同することはあまりないのだが。
最近思うんだが、LISPは動的スコープに戻したほうがいいんじゃないか?
変数は常に(eval シンボル)と等価で、関数は常にS式と等価。
静的スコープではこれが成立しない。
'(1 2)と(list 1 2)の結果が同じだし、勘違いしちゃうことってあるよね
'multiple-value-bindについてるクオートがよくわからない. (defmacro mvbind (&rest args) (let ((name 'multiple-value-bind)) `(,name ,@args)))
これでうまくいった (let ((foo 2) (bar 3)) (mapcar (lambda (arg) (display (eval arg))) '(foo bar)))
>>138 かなり偏ってるね
混同するのが名物とか、変な偏見も持ってそうだが
多分
>>140-141 もお前じゃないか?
きちんとした処理系で基礎から勉強し直した方がいいと思うね
>>136 そうだね。前スレ372-390でも話題になってたよね。
(list foo bar)
== (list `,foo `,bar)
== `(,foo ,bar)
quasiquoteの分配則では気をつけないとね。
データとコードの違いは最初に叩き込まれると思っていたがそうでもないのか?
マクロの勉強でもしてみれ
eval使って解決した気になれるとか、初心者の特権だねえ。
>>135 それよりmapcarの使い所を間違えてないかね?
処理系変えるとうまく動かないかもよ。
quoteはちゃんと理解した方がいいよ。
>>140 どんだけ頓珍漢なことやってるのかって
最初は気付かないもんだよ。
149 :
135 :2009/02/03(火) 20:15:17
ありがとうございます。
もう一度 quote の部分を見直しましたが
まだいまいちわかっていないので
もう一度じっくり読んでみます。
>>148 mapcar の使い方を確認しようと
Revised5 Report on the Algorithmic Language Scheme
を見てみたところ mapcar は乗っていなかったので
map を使うことにしました。
>>135 は展開すると
'(foo bar)
== (list 'foo 'bar)
となる。
これと
>>143 を比べると違うことは明白。
(list 'foo 'bar)ではlistの要素はシンボルになっている。
>>135 (list foo bar)ではlistの要素は変数になっている。
>>136 ,
>>143
初心者ならそこまで気を回さなくてもいいかもしれないけど (equal? '(foo bar) (list 'foo 'bar)) => #t だけど (eq? '(foo bar) (list 'foo 'bar)) => #f ; ほとんどの場合 quoteはquoteでlistとは別物(返り値も含めて、書き換え可能かどうか等も) 返ってくる値がequalなだけ
それからR5RSのmapは返り値の順序は規定されているけど 評価順序は未規定 だから (map display '(A B C)) => '(#<undef> #<undef #<undef>) 標準出力にはABC、ACB、BAC、BCA、CAB、CBAのいずれか 評価順序をリストの順通りにしたいのならfor-eachを使う (for-each display '(A B C)) => #<undef> 標準出力には必ずABC 評価順序と戻り値のデータ構造内の順序の区別は HaskelのIOモナドにもつながる (たぶん) R5RSでは関数の引数の評価順さえ未規定
>>152 >>それからR5RSのmapは返り値の順序は規定されているけど
>>評価順序は未規定
うわ…これ今ごろ知ったよ、ありがとう。つかこの仕様で誰が得するんだろ。
慌てて調べたけど、Gauche は独自仕様で常にリスト内の順番どおり、なのね。
ちょっと安心。
154 :
デフォルトの名無しさん :2009/02/04(水) 00:06:16
並列処理が楽になるとは聞いたな。
少しActorも意識してるんだろうね。
各要素に並行にfがメッセージパッシングされて。
>>138 funarg問題の時代までタイムスリップかよ。
funarg問題の例: compose (lambda (f g) '(lambda (x) (f (g x)))) こうすればいいんじゃないの? (lambda (f g) `(lambda (x) (,f (,g x))))
quoteが嫌いな人はクロージャやsyntax-rulesを使う quoteが大嫌いな人はPythonやRubyを使う そんな気がする
quasi-quoteの便利さは異常。 そんな嫌いになるなんて、これが本当のくぉーつ嫌いってやつか・・・
昔のマクロにはバッククォートなんてなかったよな ひたすらlistでS式をこさえてたっけw
どんだけ昔の人だよ
Lisp-85とかって言っても分からんだろうなw
そんな最近かよ とっくにバッククオートあるよw
Lisp-85ってS-OSというZ-80のOS上で動く奴なんだが fexpr形式やmacro形式はあってもバッククォートは無かったぞ
'の逆はevalだと思ってた
>>163 Z80には荷が重かったのでは
メモリどんだけ積んでたとか知らないけど
展開後は再帰関数のかたまりだし
全然問題ない。
あっそ ならLisp-85作った人が入れ忘れたんだね
quasi-quoteを効率を保ってきちんと実装するのは意外と難しい。 80年代になってもマクロと組み合わせた時の実装手法の論文があった。 アンチquasi-quote派というのが昔はいた。Common Lispで決着。
Gauche WiLiLiのあんまり目立たないとこに自分の作ったパッケージ書き足す方法はないものだろうか
>>156 その関数の引数f,gにシンボルxを引数として渡すと死ねる。
やっぱり gensym が必要なんだね。
関数名じゃなく、関数「値」を式に埋め込めばいい。 gosh> (define x (list + 1 2)) x gosh> (define y (list '+ 1 2)) y gosh> (define + -) + gosh> (+ 1 2) -1 gosh> (eval x (current-module)) 3 gosh> (eval y (current-module)) -1
再帰関数だったら?
そこまで行くとR5RSでも解決できてるかどうか怪しい R6RSは再定義禁止だっけ
R5RSの件は (define f (letrec ((f ...)) f)) と書けば安全かも
仕様に自由があるから面白い。
>>173 で'の使い方わかった気がするけど
本格的に勉強するならどの本がいいのでしょうか?
>>178 SICPがいいよ
マクロの話題は一切ないけど、マクロは遊ぶものであって勉強するものではない
それでもSICPがSchemeを使ってる理由を考えながら読めばおもしろいかもね
俺はOnLispをお勧めする。
ふつうにあのお魚の本でよくないか?
処理系のソースで十分
うわーっ!びっくりした と避ける
>>169 ふむふむ、勉強になります。
そういえば関係あるかわからないけど、 scheme じゃなくて elisp も、
Emacs19 のころは
`(foo ,bar)
とはかけなくて、
(` (foo (, bar)))
と書いていたような。
関係ないけどチャイティンのLispでは'はシンボルで (QUOTE X) == (' X) って書いてたな
(define (% num1 num2) (remainder num1 num2)) としてるんですが、関数に別名与えるもっと良い方法はありますか?
引数の数が一致しているのなら (define % remainder)
それでいいんですね。 気づきませんでした。 ありがとうございます。
指定のクロージャが束縛されているシンボルを探す方法ってありますか?
処理系によってはあるかもしれないけどRnRSにはないんじゃないかなぁ。 CLにはあるかもしれませんけどSchemerだから知らないです。 シンボルのリストを引数に与えるのであれば グローバル束縛されているクロージャをevalで取り出してeq?して調べられるけど グローバル変数のリストはどうやって得ればいいかわかりません。 それにローカル束縛も含めるとなると不可能じゃないでしょうか。
CL なら do-symbols で探せるんじゃないかと。
Haskellとlispの得意不得意ってどんなところなのでしょうか?
別に無いよ?
>>193 特にないんじゃないの?
文字列を扱うとめちゃくちゃメモリ食うってのがHaskellの弱点かもしれんけど
今時のマシンだったら何の問題も無いし。
Haskellとlispを戦わせたくてしょうがないらしい
ムシキングか何かでやってください
[Lisp] 攻撃:85 素早さ:94 防御:96 命中:68 運:32 HP:154
[Haskell] 攻撃:68 素早さ:55 防御:65 命中:52 運:31 HP:233
Lisp vs Haskell 戦闘開始!!
[Lisp]の攻撃 HIT [Haskell]は91のダメージを受けた。
[Haskell]の攻撃 HIT [Lisp]は11のダメージを受けた。
[Lisp]の攻撃 HIT [Haskell]は109のダメージを受けた。
[Haskell]の攻撃 HIT [Lisp]は0のダメージを受けた。
[Lisp]の攻撃 HIT [Haskell]は76のダメージを受けた。
[Lisp]が[Haskell]を倒しました(ラウンド数:3)。
魔法のMD5 - MD5バトル
http://www.newspace21.com/mix/btl.php
いちいち貼らなくていいよ
>>193 Haskellは近くのコンビニにぬり絵が売ってます。
Lispはドンキホーテに行けばぬいぐるみが売っています。
>>193 君はどちらが好きですか?
外に出なくても済む方がいいです
λ
maximaの中に面白いのみっけた (defun for-eval-then-quote (var) `(list 'quote ,var)) (setq x 1) (for-eval-then-quote x) -> '1
>>203 えーと、ほんとにそれを動かしたら'1になったのかい?
正しい結果は(list 'quote 1)になるのでは。
関数とマクロの評価はごっちゃにしないように。
この辺り何か思い違いしてると思うよ。
ちなみに'1を期待するなら関数の中身は`',var または(list 'quote var)
>>204 間違えました
(eval (for-eval-then-quote x))
->'1
loopマクロ勉強したのにiterateの方が使われてたり 言語の発展はゆるやかだ とか言ってたのどこのどいつだ
>>206 それ言語じゃなくてライブラリの発展だと思うんだが……。
[clojure] 攻撃:28 素早さ:67 防御:78 命中:87 運:55 HP:202
[Qi II] 攻撃:51 素早さ:21 防御:48 命中:69 運:23 HP:189
clojure vs Qi II 戦闘開始!!
[clojure]の攻撃 HIT [Qi II]は1のダメージを受けた。
[Qi II]の攻撃 HIT [clojure]は16のダメージを受けた。
[clojure]の攻撃 HIT [Qi II]は56のダメージを受けた。
[Qi II]の攻撃 HIT [clojure]は1のダメージを受けた。
[clojure]の攻撃 HIT [Qi II]は56のダメージを受けた。
[Qi II]の攻撃 HIT [clojure]は10のダメージを受けた。
[clojure]の攻撃 HIT [Qi II]は38のダメージを受けた。
[Qi II]の攻撃 HIT [clojure]は1のダメージを受けた。
[clojure]の攻撃 HIT [Qi II]は25のダメージを受けた。
[Qi II]の攻撃 HIT [clojure]は1のダメージを受けた。
[clojure]の攻撃 HIT [Qi II]は57のダメージを受けた。
[clojure]が[Qi II]を倒しました(ラウンド数:6)。
魔法のMD5 - MD5バトル
http://www.newspace21.com/mix/btl.php
kill
連邦のモビルスーツは化け物か!?
array->list 変換関数がみつからない 自分で書くものなの? (array->list #2a((1 2)(3 4))) ->((1 2)(3 4))
>>自分で書くものなの? R5RSには記述がないからそうだと思うけど, それより#2a(...の2aって何?
#2A(..)ってのはCommon Lispの二次元配列かな。
ARRAY (2)のリストになってほしいのか、リストのリストになってほしいのか。
まぁ、結論からいうと
>>212 ARRAY (2 2)はLISTと互換性がないからムリ。自分で書く。
ベクタとかなら (coerce #(1 2 3) 'list) で変換できる。
lispに興味があるんですが、 いまからlispを勉強するならなんの書籍がお勧めですか? SICPってのがお勧めっぽいんですが、MITで使われてるとなると・・・ 読みこなせるかなー
SICP日本語版はちょっと高い
なんでいきなりSICPなんじゃーー
「良い本だ」ってよくScheme関連のWEBに載ってるから。
良い本には違いないけど、 SICPも買いたいなら、別の本と併読した方がいいと思う。 言語仕様書が日本語化されているからそれでいいか、 って人ならSICPだけで問題なし。
maximaが使いたいだけだったので on lispはじっくり読んだが SICPは問題もやらずに流し読み
SICP は Scheme の本というわけではない。 Scheme を使って解説してる本。
>>223 え、そうなんですか?
自分はアルゴリズムの勉強のために買いました。
序盤の関数 f(x) の話とか、大学の数学が懐かしいです。
SICPにアルゴリズムの話が出てないわけではないが、 SICPをやってもアルゴリズムを勉強したとは言えない。
>>226 降り続く雨
きしむ廊下
立ち止まる足音
遠のく意識
SICP読んだら魔法使いになれますか?
>>230 さあ、30歳になるまで貞操を守る作業に戻るんだ
30歳を越えてるのですがSICPは読めますか?
読めなかったら困ると思いますよ
60歳とかでも読めるらしいですよ 読めなかったら数学勉強してから再挑戦しましょう
30歳過ぎてもSICP読むと童貞になりますか?
俺はSICPを読んで、背が10cm伸びたよ
SICP読んで宝くじ当たったよ。
もしかして訳者の和田さんってスーフリの和田さん?
プログラマ50人に1人ぐらいはSICP読んでるよね。
SICP未読で許されるのは小学生までだよね!
ちょっと待ってくれ。「人生に必要な知恵はぜんぶ幼稚園の砂場で学んだ」とあるように、幼稚園のうちに読んでおくべきものではないだろうか?
なんてこったい/(^o^)\
人生に必要な知恵はぜんぶサンドボックで学んだ。
俺、人生に必要な知恵はぜんぶ死後の世界で学ぶんだ…
次はアメンボに生まれてきたりして
おれも人生に必要なことは幼稚園で一通り学んだ覚えがあるな
>>249 ってことは、幼稚園で、チュー済ませたタイプか。
登り棒オナニーなら幼稚園の時に覚えました
SICP以外誇れるものはないのか
essential of なんたらとかreasoned schemerとかもいいかも
時代は宝石の名前の言語じゃね?
党員の友人とMercuryを学んでいます。
Perlのことですね、わかります
あのバージョン6がすべった言語のことか
>>255 それは金属であって宝石ではない(゚д゚)!
真珠の綴りはPerlじゃないぞ・・・
まぁなんにせよ変な宗教言語は使いたくないわなw
()とか幼稚園じゃ習わなかった
幼稚園の時、世の中はすべてnilだと習った。
うちの幼稚園ではnil派と()派が闘争を繰り返していた。
little schemerって幼稚園児でも理解できるように書かれたんだっけ
誰が象のラムダ君役をするかで喧嘩になってみっちゃんが泣いた。
ここは幼稚園で人生のすべてが再帰的だと悟ったみなさんが集まるスレですかね。
継続渡しスタイルで幼稚園ドロップアウトした。
ところで、 チョコはいくつもらえましたか
カーチャンから一個、姉さんから一個
(´;ω;`)
ええい、FOR文でもらえた奴はいないのか!
「末尾再帰!」と叫んで保母さんのスカートをめくったのはいい思い出
Next Boston Lisp Meeting: Monday February 23th 2009 at 1800 at MIT 34-401B
http://fare.livejournal.com/139926.html vyzo will talk about gerbil, a little language for distributedprogramming
using PLT-Scheme. Gerbil is a macro language that provides facilities
for actor-based distributed programs and transparent network simulation.
これおもしろそうね。
274 :
デフォルトの名無しさん :2009/02/14(土) 18:38:38
Seasoned Schemer ってどうですか?
275 :
デフォルトの名無しさん :2009/02/14(土) 18:39:22
Let Over the Lambda ってどうですか?
海は死にますか?
nilもそうですか?
水曜どうですか?
明日来てくれるかな?
このスレのネタの応酬はハイレベル過ぎて
終いますか〜?
括弧の山を愛する連中の嗜好が平凡なわけがなかった・・・・
別に愛してるわけじゃないけど、無いと不安になるというか不安定に感じる。
十分平凡でないです!
アイちゃんも冗談を言うようになったか。
hogehoge
(hage? >287)
一連の1行の糞レスをあぼーんするプログラムを作れ
あぼ〜ん
>>289 navi2chちょっといじればいいだけ
こういうlist が返ってくるときに ((1 2 3) (1 2 3) (1 2 3)) こういう処理にするにはどうすればできますか? (map + '(1 2 3) '(1 2 3) '(1 2 3))
(apply map (cons + list))
>>293 wikiのテンプレに書き加えておいて。
(setq list1 '((message "X") (message "Y"))) があったとして、list1 の各要素を順番に実行していく方法を教えてください。
(eval (cons 'progn list1)) こういう話? それともこんなのをお望み? (mapcar #'(lambda (x) (apply (car x) (cdr x))) list1)
(mapcar #'eval '((message "X") (message "Y"))) とかでもいいのか。
仮定が分からないな。 messageというのが関数なのか? (setf *func-hash* (make-hash-table)) (setf (gethash 'message *func-hash*) #'(lambda (x) (princ x))) (setf list1 '((message "x") (message "y"))) (mapc #'(lambda(x)(funcall (gethash (car x) *func-hash*) (cadr x))) list1) => 以下が結果 maximaとかはこの手のことをやってるね。 xy ("x" "y")
302 :
298 :2009/02/20(金) 03:13:07
>>299 >(eval (cons 'progn list1))
すごいです。これでできました。
ありがとうございました。
Scheme (let ((list1 '((display "X") (display "Y")))) (map eval list1)) ⇒XY(#<void> #<void>)
(cons 1 '(2 3)) -> (1 2 3) となりますが (cons '(1 2) 3) -> ((1 2) . 3) になりますよね 今は (append '(1 2) '(3)) と書いてますが (cons 1 '(2 3)) に比べて冗長だと感じます もっと良い書き方はありますか?
書き方というか、片方向リストの仕様だから
(define (wahacons a b) (append a (list b))) (wahacons '(1 2) 3)
>>307 quasiquoteは?
> (define x '(1 2))
x
> `(,x 3)
((1 2) 3)
肝心な部分コピペし忘れとかどうなのよ、俺……orz > `(,@x 3) (1 2 3)
Luaスレがschemeネタで盛り上がってるw
ちょっと見てくルア
見てきたけど、あんまり面白い流れでも無かった。 速いなら実装を参考にしよう、とか建設的な意見が出る訳でもなく、 単にSchemeイラネ、だし。
括弧うぜえとか。
Schemeは作るの簡単とか。
ypsilon軍団とgauche軍団どっちが多い?
[gauche] 攻撃:52 素早さ:32 防御:27 命中:74 運:17 HP:258
[Ypsilon] 攻撃:88 素早さ:69 防御:92 命中:95 運:96 HP:144
gauche vs Ypsilon 戦闘開始!!
[Ypsilon]の攻撃 HIT [gauche]は154のダメージを受けた。
[gauche]の攻撃 HIT [Ypsilon]は1のダメージを受けた。
[Ypsilon]の攻撃 HIT [gauche]は173のダメージを受けた。
[Ypsilon]が[gauche]を倒しました(ラウンド数:2)。
魔法のMD5 - MD5バトル
http://www.newspace21.com/mix/btl.php
何という二番煎じ、お前は車輪の再発明でもしてろ
車輪の再発明はハッカーの大好物
>>315 遅くないのは知ってるけど、向こうの話題の発端がそういう話だった。
俺の場合、VCSのmonotoneで組み込まれてて知ったんだけど、
かなり評価高い言語だよね。Adobeとかも採用してるとか。
Lispが早いとか
CLでもSchemeでもいいので話題のHSPみたいに簡単にゲーム作れるソフトはありますか?
>>322 CL/scheme はしらんが、どこぞのメーカは
ゲーム開発ベッドで専用 Lisp 使ってなかったっけ?
>>322 LispやSchemeをゲーム制作に生かしている企業とかはあるみたいだけど、
誰でも分かり易いライブラリだの、特化した処理系だのはないんじゃない?
一応、SDLとかOpenGLとか使ってゲーム作るのは、大抵の処理系で出来ると思うけど。
というか、HSPが話題っていつの話だ。
LuaとかSquirrelは遅かったらC++に書き直せばいいだけだからな
Lisp/Schemeも同じことができると思うんだが……。
書き直す際に 実装が多いのが弱点ではないかと。
Squirrelは書き直すのが楽そうだ
StalinならCより速くなることもあるんじゃなかったっけ?
Stalinって実際どんな感じ?
StalinってCを出力するんでしょ? Cより速くなる事は無いと思うけど… Cで「人間が」書くより速くなる事ならあるかもしれないけど
stalin ... それは、かつてソ連で大量虐殺をおこなった恐怖の支配者。。。 だから 非人間的な行動(コード)だろ?人間が書くCのコードより速いってことじゃ?
Stalinは、人間がかくCコードよりかなり早い場合も多い。
ただし、継続が使えないとか制限が多いし、コンパイル時間がめっちゃかかる。
>>332 > Cより速くなる事は無いと思うけど…
> Cで「人間が」書くより速くなる事ならあるかもしれないけど
こんなこというやつ初めて見た。
そうか?理論値と実情を別に語るのは良くあると思うが。
だって、人間が書いたものではないCを含めて 「C言語より速い」 を語るなら、それって実質的にCコンパイラの最適化の差に帰着するじゃん。 コンパイラによってはCから (ほぼ)最小のアセンブリを生成できることだってできるし、 そうすると何をもって「Cのソース」とするのかって話になって、 「Cのソースを吐くんだからCより速いはずがない」 っていう議論は空虚じゃない? まぁ言い出しておいてアレだけどスレチだな。すまん
Stalinの話は定期的にでてくるけど、流れとしては・・・ 「同じ問題を解くのに俺様の書いたCよりXXにあるStalinのコードの方が速かった!」 「でも俺様のCのコードがヘボいことはありえない!そんなことは考えられない!」<- これが間違い 「Stalinはどんな魔法を使ってるんだ!スゲーよStalin!」 一部で盛り上がるけどスルーする人も多い。 同じ速度を出すのにStalinを使った方が簡潔に短時間で書けるというのはあると思う。 だからあれほどコンパイル時間がかかってもユーザーは気にしないんじゃないかな。
まぁStalinはある種の一発モノだからな。 研究とか勉強の材料としてはすごいけど、プロダクションでは使えないから 盛り上がるのは一部にとどまる。 俺は盛り上がった派だけどw 最適化の解説の論文は勉強になった
schemeのマクロを使って 見た目から括弧を無くしていくことって出来ますか? 例えば括弧のない1 + 2を3と評価するとか for リスト do 処理 done みたいな構文がmapの意味で動くようにしてみたい
>>339 まえにどっかでみたことがある。srfiなんとか だったと思う。
SRFI 49のI-expressionsは、インデントで構文木を表す表記法であって、 マクロは関係なかった気がするんだけど、違ったっけ?
つ Standard Lispの記号モード
>>339 「schemeのマクロを使って」も
マクロ使用を囲う括弧と、マクロ名さえあれば中置記法もできます。
ただしこの3つをなくするのはRnRSではできない。
処理系によってはリーダマクロをサポートしているのでそれを使うと可。
なるほど、やはり出来ないのかー リーダーマクロ、存在だけは知ってましたが コンパクトでかっこいいSchemeで出来たらなぁって思いまして 昨日考えてたんですが、 Schemeには演算子の優先順位がないのが原因でしょうね もし優先順位がつけば、括弧省略出来る それはそれで、F#やらHaskellやらでみかける パイプライン演算子みたいなのが定義出来たり、と夢が膨らむが 言葉に表せない大切な物が犠牲になってしまう気がします >マクロ使用を囲う括弧と、マクロ名さえあれば中置記法もできます。 これ非常に興味あるんですが、どういうことでしょうか? 適当に試してはみたんですが、わかりません (define-syntax plus (syntax-rules () ; ((x _ y) (+ x y)))) ; ((x (_) y) (+ x y)))) ; (((x _ y))(+ x y)))) Gaucheの拡張で優先順位を計算して括弧を省略ってページなら見つけましたが そういった話でしょうか?
こういうことじゃないの (define-syntax calc (syntax-rules (+ -) ((_ a + . rest) (+ a (calc . rest))) ((_ a - . rest) (- a (calc . rest))) ((_ a) a) ) ) > (calc 1 + 10 - 5) 5
5かよ
> Schemeには演算子の優先順位がないのが原因でしょうね > >マクロ使用を囲う括弧と、マクロ名さえあれば中置記法もできます。 > これ非常に興味あるんですが、どういうことでしょうか? そうゆう reader を作ればいいじゃね? 作るだけだったら誰でも作れると思うし…
>>345 俺は344じゃないけど、344の言ってることは違う。
344が言ってるのは、「一番その側のカッコがあれば」 ということ。
いちばん外側のカッコは、どう頑張ってもRnRSでは省略不可能。
しかし、一番外側のカッコとマクロ名を許容すれば、
そのマクロの引数を全部自力で解釈すれば、そういうことは可能ということ。
文字通り、言語をもう1つ作るようなもんだけど。
× 一番その側 ○ 一番外側
>>344 これ面白いなぁ。
引き算は
(calc 1 - 2 - 3)
こう展開されてしまうから
(- 1 (- 2 3))
正しい値にならないね
けど、面白いからちょっと考えてみます
>>349 なるほど、勉強になります。
「マクロ使用を囲う括弧と、マクロ名さえあれば」
というのは、344氏の例でいけば、
一番外側の()とマクロ名であるcalcっていう意味なわけですね
そして、それより内側であれば、がんばり次第で自由自在だ、と。
('A`)y-~
そもそも、何で括弧なくしたいんだ? 知的好奇心満たしたいだけなら何も言わんが。
Lisp Scheme初心者です。マグロウヒルの「プログラムの構造と実行」をテキストに Schemeを勉強しようと思っています。 そこで皆様のアドバイスをお願いしたいのですが、どのScheme処理系がお勧めでしょうか? あまりにもたくさんありすぎて判断できません。 OSはWindows XPです。よろしくお願いします。
>>354 windows上で勉強目的なら統合環境のほうが楽だろうしPLT schemeで良いんじゃないかな。
さもないなら、linux上でemacs+gauche(日本語の本があるから)とかでも良いように思うん
だけどね。
>>338 stalinがダメなら
記述力と速度を同時に達成できるのって
ocamleぐらい?
GCの停止時間がなくて 記述力も同時に達成できるのはC++しかないんだぜ
確か2月前半ぐらいに comp.lang.lisp でreadable なlisp -> C 変換の話がでてたはずなのに見つからない
C++はOOPの振りをした関数型言語だからな
OOPは言語関係ねーす
c++でoneceonlyマクロって書けるんだろうか 前にoneconleyできない関係で何度も代入評価されてる 「そんなエラー絶対みつかんないだろう」ってエラーがboost関係で報告されてた
>>353 どっちかっていうと実用的な理由
・タイプ量を減らしたい
・括弧がネストすると、対応が激しくおいづらい
emacsを使えばそんなこと屁でもないな むしろ()がある方がタイプ量が減るし、移動が楽ってぐらいになる 逆にエディタの支援が無いとなるとなるほどそれは確かに致命的だ
エディタの機能でどうのこうのっていうのは 言語の話とは別のような・・ 俺もemacsは使ってるが >()があるほうがタイプ量が減る それはない letよりlet1のほうが読みやすいし打ちやすい
>>363 実用的な理由で括弧を消すのはないだろー。
前者の理由なら、そのために高階関数やマクロがある。
後者の理由なら、そのためにエディタの支援機能がある。
というか、インデントで対応を追うのが普通。
まあ、実際にやってみて、構文を増やす度に複雑化する、
仕様やリーダーマクロのメンテにうんざりしてみれば、
その辺良く分かるとは思うけど。
実用ってことはコードを編集することを含むだろう? ならエディタは関係あるじゃないか
emacsの括弧うんぬんはいじる方の腕しだいで楽になる。
emacs はこのへんを組み込んでるかどうかでも全然ちがうよ。 1. insert-parentheses を使ってるかどうか 2. show-paren-mode を使ってるかどうか 3. transient-mark-mode を使ってるかどうか
>>365 プログラムのコードのタイプ量は減るだろうけど、
編集作業全体のタイプ量は驚きの増加量、って感じになる気がするよ。
S式単位での編集を使わないと、移動に掛かる手間が段違い。
emacs userは1匹見ると10匹いると思え
>>371 ごきぶりみたいにいうな にがわらひ
370みたいなべてらんもいるけど、C-F C-B C-N C-Pもままならずマウスな初心者も
いるから。
viでもlispモードは普通にあるよ。
>>371 むしろ1匹しかいない絶滅危惧種扱いの所が多いよ。
google trendsをみても検索数の指数は減ってるけど、多い地域はアカデミックなところが 多いね。日本も亜米利加もね。
俺ベテランじゃなくて異端。 viper-modeで、viとEmacs両方のキーバインドを同程度に使う変態。
vipperかお?
お じゃない。
>>375 viper-modeかぁ。15年以上起動したことがない。笑い
>>375 ___l___ /、`二//-‐''"´::l|::l l! ';!u ';/:::l ', ';::::::l ';:::::i:::::
ノ l Jヽ レ/::/ /:イ:\/l:l l::l u !. l / ';:::l ', ';:::::l. ';::::l:::::
ノヌ レ /:l l:::::lヽ|l l:l し !/ ';:l,、-‐、::::l ';::::l::::
/ ヽ、_ /::l l:::::l l\l ヽ-' / ';!-ー 、';::ト、';::::l:::
ム ヒ /::::l/l::::lニ‐-、`` / /;;;;;;;;;;;;;ヽ! i::::l:::
月 ヒ /i::/ l::l;;;;;ヽ \ i;;;;;;;;;;;;;;;;;;;l l::l:::
ノ l ヽヽノ /:::l/:l /;;l:!;;;;;;;;;', ';;;;;;;;;;;;;;;;;ノ l:l::
 ̄ ̄ /::::;ィ::l. l;;;;!;;;;;;;;;;;l `‐--‐'´.....:::::::::!l
__|_ ヽヽ /イ//l::l ヽ、;;;;;;;ノ.... し :::::::::::::::::::::ヽ /!リ l
| ー /::::l';!:::::::::::::::::::: u ', i ノ l
| ヽー /イ';::l ’ し u. i l l
| /';:';:!,.イ し 入 l l U
| /,、-'´/ し / ヽ、 u し ,' ,' l
| /l し _,.ノ `フ" ,' ,' ,ィ::/:
| /::::::ヽ ヽ / し ,' ,' / l::
| /::::::::::::`‐、 し ', / u ,、-'´ l,、-
| ``‐-、._::::::::::` ‐ 、 ',/ , -'´`'´ ,-'´
| _,、-‐'"´';:::::::::イ:l';:::` ‐ 、._____,、-‐'"´ u /
| | | | \ l::/ l::::::/リ ';:::::lリ:::::l';:::l l:l:::::l\ u /
| | | |
>>375 viperモードたまに使うけど、完全に終了させる方法教えて下さい。
viper-go-away しても別のファイル開いたらまたviperになってて、
仕方ないからemacs毎再起動してる。
>>380 せっかくなので、ソースコードを読んで原因を探ってきました。
viper-go-awayを呼ぶと、viper.elのviper-remove-hooksで、
仕掛けていた各メジャーモードのフックを解除していくのですが、
コードを見ればお分かりの通り、とても素敵なバグがありまして、
find-file-hooksとかは完全スルーです。
なので、自分でコードを修正するか、本家にフィードバックするか、
俺のようにVIPER常駐野郎になるか選んでください。
と思ったんだけど、追加で調べていったら、 デフォルトのメジャーモードを元に戻さないってバグもあって、 これが本筋っぽい。CVS最新版では修正されてる。 ↓を.emacsに追加でひとつ。 (defadvice viper-go-away (after revert-default-major-mode activate) (setq default-major-mode 'fundamental-mode))
maximaの細かいbugが未だに放置なのは common lispの問題なんだろうか schemeで書かれてるならbugは少なくなるんだろうか
妄想はそのくらいに
もともと"Common Lisp"じゃないものをGCLに、そして"Common Lisp"に書き直したからじゃない? 最初から"Common Lisp"で書かれていたら違っていたかも Maxima使ってないからよくわからないけど
質問。この2つに違いってありますか? (define (f x) (define g 10) (+ x g)) (define (g x) (let ((h 10)) (+ x h)))
5.2.2 internal definitionsに変らないと書いてある。 > A <body> containing internal definitions can always be converted > into acompletely equivalent letrec expression.
(define (g x) (letrec ((h 10)) (+ x h))) となら同じ、が正しいのでは? letとletrecは違う この例はたまたまコンビネータ式が束縛されているに過ぎない (正確には式が束縛されているわけではないけど)
質問の意図によるだろうけど 最終的な機械語に落とす段階では同じコードになる
390 :
388 :2009/02/26(木) 23:57:23
とはいったものの、束縛する式が1つならSchemeレベルではletとletrecは等価ですね
>>387 ありがとうございます
自分の知らない、
何か違う意味があるんだろうと思って質問したんですが
letrecと同じ意味なんですね
おっちょこちょいですね。
>>393 了解です。Schemeってシンプルですね。ありがとうございます
>>387 編集ミスった。
acompletely→a completely
否定のa-に見えてしまう すまん
さしずめ「うは宇宙のう」
>>382 遅くなったけどありがとう。これでviperモードと仲良く暮らせそうです。
お
399 :
デフォルトの名無しさん :2009/02/28(土) 09:35:38
399
400 :
デフォルトの名無しさん :2009/02/28(土) 09:36:03
400
shibuya.lisp ストリーミング中! って今ごろ気付いたorz
見逃した…… ニコニコ動画辺りに上げてくれないかあ
他の関数型言語でこの手の集まりをみないのは 学会で代用してるからなのだろうか
>>403 あー、配信のときとは別テイクで音声がずいぶん聞きやすくなってる!
ありがとうございます。
>>406 HaskellとかOCamlだと人がそんなにまだ多くないし(Lispに比べれば)、
ゲーム作りましたみたいな大きいネタとか、その筋なら誰でも知ってる大先生とか
そういうのないからねぇ。
さがせば
>>407 が書いてるみたいに勉強会とかあるからメイリングリストとか
入ってみれば? 今時捨てアドのひとつやふたついくらでも作れるし。
lispが多いといってもschemerが多いんじゃない? やはり、川合さんとか、処理系製作者が3人もいるくらいだからね。 common lispは人は少ないよ。Qiやclojure,newLispに至っては壊滅的。 そーいえば、abclがバージョンアップしてたな。
ircを覗くと、常駐者が #lisp 250 #haskell 550 #ocaml 50 #scala 50 #clojure 100 #ruby 250 くらいみたいだね。haskellがなんでこんなに多いんだ?
has略は中ニ設定豊富だからな
>>410 Qiというものを始めて知りましたが、Haskellっぽくて面白そうですね。
ところで皆さんはこういった面白い実装の情報をどこで得てるんでしょうか?
英語のメーリングリストなのかな?とは思ってるんですが・・・
>>414 それはねぇ。。。こまめに調べてるだけよ。ふふふ。。。lisperがあつまる日本語のチャット
も情報源だよ。
うんQiはHaskellっぽいね。
>>416 made with secret alien technologyのシャツが無いなんて信じられん
schemer多いのはシンプルだからなんだろうか
Qi ECLでは駄目なんだ・・・ 高速化って書いてるから期待したのに
>>413 (use srfi-1)
(define request '((hoge . 1) (fuga . 2) (piyo . 3)))
(filter (lambda (x) (member (car x) '(hoge fuga))) request)
とか
>>414 Planet LispってRSSあるよ。
>>421 おおっ、有り難うございます!! さっそくGoogle Readerに追加しました。
>>420 3行目 srfi-26使って(gaucheならuse不要)
(map (cut assoc <> request) '(hoge fuga))
ハッシュテーブルに代入したら負けですねわかります
(defvar *request* (make-hash-table)) (mapc #'(lambda (elem) (setf (gethash (car elem) *request*) (cdr elem))) '((hoge . 1) (fuga . 2) (piyo . 3) ...)) (let ((res (make-hash-table))) (mapc #'(lambda(key)(setf (gethash key res) (gethash key *request*))) '(hoge fuga piyo)) res) とくに簡潔ではないな。
schemeで論理の勉強しようと思って (tflist n)で#tと#fの組み合わせを列挙してくれる関数を書こうとしたんだが 意外と難しい 最初mapで#t → (#t #f) (#t #t)という風に書こうとしたが これだとflattenが居るし、flattenを再帰で呼び出してみたら 全部平らになってしまって(#t #t #t #t #t #f #t #f #t ...)みたくなっちまった 誰かたすけて 動作イメージ (tflist 1) '(#t #f) or '((#t) (#f)) (tflist 2) '((#t #f) (#t #t) (#f #f) (#f #t)) (tflist 3) '((#t #t #t) (#t #t #f) (#t #f #t) (#t #f #f) (#f #t #t) (#f #t #f) (#f #f #t) (#f #f #f))
(define (tflist n) (cond ((<= n 0) '()) ((= n 1) '((#t) (#f))) (else (let ((l (tflist (- n 1)))) (define (add-t l) (cons #t l)) (define (add-f l) (cons #f l)) (append (map add-t l) (map add-f l))))))
(define (tflist n) (if (= n 1) (list (list #t) (list #f)) (append (map (lambda (x) (cons #t x)) (tflist (- n 1))) (map (lambda (x) (cons #f x)) (tflist (- n 1))))))
>>427-428 おお、神よ。なるほど、(append (map..)(map..))の形になるのか
もしよろしければもう1個
以下の例で最後の行は動くようになりませうか?
;guile/gaucheでどちらもエラー
(define (mujunritu p) (not (and p (not p))))
(define (haityuritu p) (or p (not p)))
(define (try1 f) (map f '(#t #f)))
(try1 mujunritu)
;これがダメ。try1のfでλx(apply f x)やλx(eval(f x))も試してみたものの
(map try1 '(mujunritu haityuritu))
OCamlでは動作
let mu p = not (p && (not p));;
let hai p = p || (not p);;
let tr f = List.map f [true;false];;
List.map tr [mu;hai];;
前きたquote判ってない人かね
>>429 `(,mujunritu ,haityuritu)または(list mujunritu haityuritu)
'(mujunritu haityuritu)との違いわかるかな
>>431 別人です。あれからROMしかしてないですよ。
>>432 Lisp属の初心者には、このあたりは難しすぎます
調べるのは本当に大変でしたが、何とか見つかりました
ttp://www.ice.nuie.nagoya-u.ac.jp/~h003149b/lang/comparison.html これのことですよね?
Common Lispでも、関数引数に関数実体も名前も両方使える。
(略)
Schemeでは、関数しか受けとらない
確かに、CLでは両方動作することを確認
(defun muj (x) (not (and x (not x))))
(defun hai (y) (or y (not y)))
(defun tr (f) (mapcar #'(lambda (z) (funcall f z)) (list t nil)))
(mapcar #'tr (quote (hai muj)))
(mapcar #'tr (list 'hai 'muj))
schemeの場合
(list mujunritu haityuritu)だと関数実態が返ってくるが
(quote (mujunritu haityuritu))だと名前が返ってくる
schemeにもCLのsymbol-functionみたいな関数があれば
quoteのほうでも動作すると思い調べてみたものの
該当の関数が全然見つからない\(^o^)/
しかし、関数はおいといて、この考えでたぶん、大丈夫ですよね?
quoteとevalは静的スコープな言語にふさわしくないとつくづく思う
スコープと評価が?
schemeのシンボルは文字列に毛の生えた特殊オブジェクトと思えばよろし。 プログラム内でそのシンボルに何が束縛されているかとは基本的に全く関係ない。
R5RS の eval だと、その時点の環境での評価ができないから symbol-function の代わりにはできないし。
あくまでも、定義中の名前はシンボルではなくただの変数の入れ物の 名前として使われる。また、プログラムを実行するには変数の位置を 表現できれば名前のような冗長な情報は必要ない。 よって名前は実行前のある時点でアドレスに変換されていると考えるべき。 evalやCLのsymbol-functionみたいな実行時にシンボルからその位置情報へ 変換する仕組みを作るとなると、処理系のインタプリタやコンパイラ相当を 必要時に起動するのと全く事になり、非常に馬鹿げたコストが掛かる。
>>436 evalはともかくquoteはこの件と関係ない
>>440 文章として突っ込みどころ多すぎw
内容的にも、後段のsymbol-functionについては、
特殊オペレータのfunctionと勘違いしているとしか思えない。
(defun foo ()
(print 'foo))
(flet ((foo () (print 'foolet)))
(foo)
(funcall (function foo))
(funcall (symbol-function 'foo))))
FOOLET
FOOLET
FOO
急に流れが止まったから釣りかと思ったが
やっと
>>422 の言っていることがわかった
symbol-functionってグローバルな関数定義しか参照しないんだな
schemeにシンボルが無いってことが少し分かってきた やっぱ Common Lisp 最強だな!
>>442 (let ((foo #'(lambda () (print 'fooval))))
(flet ((foo () (print 'foolet)))
(foo)
(funcall foo)
(funcall 'foo)
(funcall (function foo))
(funcall (symbol-function 'foo))))
FOOLET
FOOVAL
FOO
FOOLET
FOO
Common Lispは、symbol-valueとsymbol-functionが
シンボルセル内の別スロット。
funcallは
>>440 の後段のような処理は、
functionに任せて、関数呼び出しに専念する仕様。
funcallの第一引数は関数か、シンボル。
シンボルの場合symbol-functionの結果を使う。
何が真実なのかさっぱりわからんのでまとめてみたら
カオスになった。つっこみ希望
・evalは静的スコープにはふさわしくない
動的スコープなら1つしか環境を考えなくて良いためと想像
・schemeのシンボルは文字列に毛の生えた特殊オブジェクト
・呼び出し
(hoge)はレキシカルな環境での関数呼び出し(関数セル)
(funcall hoge)はレキシカルな環境での関数呼び出し(値セル)
(funcall 'hoge)は↓と同様。symbol-functionを使うため
(funcall (symbol-function 'hoge))はグローバルに定義されたシンボルの関数呼び出し(関数セル)
(funcall (function hoge))はレキシカルな環境での関数呼び出し(関数セル)
レキシカル環境で同名の変数がある場合に
グローバルなシンボルのsymbol-value(値セル)を参照する方法はなさそう
>>442 氏の440へのコメント
ここのあたりが一番わからない
symbol-functionは(トップレベル変数が動的スコープのため)
動的スコープを参照出来る
→functionのようにレキシカルスコープの変数を考慮しなくてよい
→symbol-functionに関してはevalもそんなにコストかからんぜ、ってこと?
>>446 442,445はCommon Lispのコードっていうのは分かってる?
> ・evalは静的スコープにはふさわしくない
これは俺も何が言いたいのかさっぱりわからんというか、
はっきり言って間違い。反証はScheme。
> evalは静的スコープにはふさわしくない はLisp1.5世代の人の意見なのかな。
現在のevalはLispらしさを演出するためだけの存在だからな
evalを使うってのは、速度的にも不利になるし、普通にlispでプログラムを組む人は 避けるところだと思うよ。避けないとすれば腕の悪い人という印象しかないな。少な くとも他の方法を探すだろう。
大抵マクロでおkだからな
Qiは データ [] program () のカッコをわけたらlispの意味ないとは思わなかったんだろうか
>>451 マクロでできることはevalでもできるみたいな言い方だな
第一印象はそんなものだろうけど
それをいつまでも引きずっていていいのかな?
451じゃないけど違うの?
Lispのマクロ機能はevalで実装されていると思うのだが・・・
(display (eval (let1 'y 2 `(+ ,x y)))) これで動くよ 何が言いたいのかわからんが
言いたいことは
>>443 >symbol-functionってグローバルな関数定義しか参照しないんだな
と同じことがevalにも言えるということ。
evalは外側のローカル変数xの定義を参照できないから
>>457 では、事前にxのところを値で置き換えたものをevalに渡している。
つーかevalは他のローカル変数のことなんか知らんから。 関数の引数として渡されたコンテクストで評価するしかない。 それを知らせる手段として(current-environment)みたいなものが 処理系にあればやりたいことは実現できるんじゃないか。
Schemeのevalの話? Common Lispでは、 (defvar x 1) (print (eval '(+ x x))) 2 (let ((x 10)) (print (eval '(+ x x)))) 20 Schemeのevalは渡された環境への変更に制限もあるよね。 ;; R5RSとR6RSで少し違う
(let ((x 10)) (print (eval '(+ x x)))) *** - EVAL: variable X has no value
>>460 が一見意図通り動いてるように見えるのは
最初のdefvarでxをスペシャル変数にしてるから。
schemeで同じことをする場合はfluid-letを使う。
(define x 1)
(display (eval '(+ x x)))
2
(fluid-let ((x 10))
(display (eval '(+ x x))))
20
x
1
コンビネータパーサを作ったから せっかくなのでR5RSかR6RS準拠のパーサを書いてみようと思ったんだが 全体のBNFのリストってどこかにまとまってる? 仕様書をざっと見した感じでは、 ばらばらにちょっとずつBNFが載っているように感じるんだが 仕様書ってのはこんな感じのもん?
Schemeの仕様書はこんな感じのもん。 まぁLispでBNFもくそもないが。
Lisp系言語の場合、構文のフォーマルな定義がBNFとはちょっと合わない。書けなくはないけれど。 構文の定義はこんな感じのレイヤになってる。 (1)まずtokenに分解 (R6RSの用語ではlexical syntax) (2)S式として読み込み (R6RSの用語ではdatum syntax) (3)S式の中の特定の構造をプログラムの構文として認識 (R6RSの用語ではprogram syntax) このうち、(2)の出力は既に抽象的な木構造のデータなんで、(3)のレベルの構文定義っていうのは 木構造に対する定義になる。もちろん木構造にマッチする文法を書けばいいんだけど。 プログラムの字面に対するBNFとは違ってくるな。 例えば、"(if x y z)" と"(if . (x . (y . (z))))" は字面では違うけどdatum syntaxとして 読まれた後は全く同じ木構造になる。program syntaxはその木構造だけを見る。
コンビネタ・パーザだとレキサも一体で書くスタイルが多い。
>>466 で言うと(1)と(2)が一体。
ただ演算子多重定義出来る言語じゃないと、
見た目がシンプルにならない。
>>467 それは知ってるんだが、要点はそこじゃなくて(2)と(3)が分離してるってとこ。仕様からして。
>>464 は言語構文のBNF定義がまとまってないってことに違和感を覚えたわけだろ。
(1)-(3)までまとめて書くことはできると思うがきれいになるかな?
(3)は、R5RSとR6RSでちょっと違うし、
内部表現的には変える必要ない上に、
read/evalの分離構造ともマッチしているから、
あえて混ぜる必要はないと思う。
>>449 そういえばEuLispにはevalがなかったな。
おもしろい試みだったけどあっさりと廃れたね。
YooTooはまだ更新されているみたいだけど。
R6RSのmoduleも一部影響受けてるね。
>>463 ですが、自己解決しました。
このコードで動きます。
(let* ((url (string->url "
http://en.wikipedia.org/w/api.php "))
(post (string->bytes/utf-8 "action=query&meta=siteinfo&siprop=namespaces&format=xml"))
(header
'("User-Agent: MzScheme"
"Accept: application/xml"
"Accept-Encoding: deflate"
"Accept-Charset: utf-8"
"Content-Type: application/x-www-form-urlencoded"))
(port (post-pure-port url post header))
(xml (read-string 1000 port)))
xml)
すくなくともen.wikipedia.orgのサーバーは、Content-Typeを指定しないとCGIだと認識してくれないようです。
>>465-469 ありがとう。こういうもんか
特に466の説明はとてもわかりやすい。
R5RSのほうはBNFついてそうだから
こっちやってみよかな
しかし、PDFって扱いにくいわ
<hoge>って表記をテキストでコピペするとhhogeiになるし
<で検索できんから不便
ファイルの basenameを取得する関数ってありますか? "foo.txt" -> "foo" "foo.bar.txt -> "foo.bar" といった風に取得したいのですが 自分で書くなら 一文字ずつ後ろから文字比較して . が来るまで探して その部分を削除。とするんですが もし既にあるなら書くのも悲しいので どなたかご存知ありませんか?
(pregexp-replace "(.*)\\.[^.]+" "foo.bar.txt" "\\1")
>>473-474 レスありがとうございます。
環境を書いていませんでした申し訳ありません。
R5RSで行うにはどうすれば良いでしょうか?
R5RSにそんな高レベルな標準関数ないと思う
R5RSで動く出来合いのライブラリが欲しいってことかね
478 :
472 :2009/03/11(水) 09:17:26
>>476-477 ありませんか…。
仕方がないので自分で書いてみました。
もうちょっとすっきり書けないもんかと思うんですが
今の自分にはこれが限界でした。
(define (chop str)
(substring str 0 (- (string-length str) 1)))
(define (basename str)
(if (string? (basename-if-thereis str))
(basename-if-thereis str)
str))
(define (basename-if-thereis str)
(cond ((= (string-length str) 0) #f)
((eqv? (string-ref str (- (string-length str) 1)) #\.)
(chop str))
(#t (basename-if-thereis (chop str)))))
479 :
デフォルトの名無しさん :2009/03/11(水) 11:47:54
>>472 SRFI 13 使えばいいんじゃね
(let ((i (string-index-right s #¥.)))
(if i
(substring s 0 i)
s))
basenameの本質って拡張子を省くことじゃなくてディレクトリパスの削除じゃないのかな? (my-basename "foo.txt") => "foo.txt" (my-basename "foo.txt" #t) => "foo" (my-basename "/foo/bar.txt") => "bar.txt" みたいな 472の例はgaucheではpath-sans-extensionという手続きが割り当てられている
クラススロットを辞書のように自由に登録したいのですが、 何かいい方法はありませんか? 例えば、 (define-class <test> () (())) というクラスから (define foo (make <test> :xxx 0 :yyy 10)) (ref foo 'xxx) -> 0 (ref foo 'yyy) -> 10 を可能にしたいのです。
簡単にやるならこんな感じかな (use gauche.sequence) (use util.list) (define-class <test> () (%slots)) (define-method initialize ((self <test>) initargs) (next-method) (slot-set! self '%slots (map (lambda (x) (cons (string->symbol (keyword->string (car x))) (cadr x))) (slices initargs 2)))) (define-method ref ((self <test>) slot) (assq-ref (slot-ref self '%slots) slot)) (define-method (setter ref) ((self <test>) slot val) (assq-set! (slot-ref self '%slots) slot val)) ほんとうのスロットのようにふるまわせたいならMOP使わないとだめかも。
>>484 それだとクラス内に辞書を確保して、
setterとgetterをスロット操作のようにエミュレートするってことですね。
なるほど〜
ありがとうございます。
ところで、Gauche本やリファレンスを見てもMOPの使い方がいまいち分からないのですが、
MOPを使うとどのようなソースになるのでしょうか?
よかったら教えてください。
よろしくお願いします。
486 :
472 :2009/03/11(水) 22:12:20
>>479 こういうライブラリがあるんですね、紹介ありがとうございます。
ただ、これだけのためにライブラリ入れるのも何なんで
もう少し難しい文字列処理が必要になったら入れることにします。
>>480 そうですね、確かに言われてみれば。
名前は変えることにします。
コンビネータの勉強がしたいんですが (expand S)とすると (fun x (fun y (fun z ((x z) (y z))))) が返ってくるような関数orマクロを作ろうとしたら 実質インタプリタを作るようなもんでしょうか? もし楽な方法(特定の処理系の拡張機能etc)等があるのであれば知りたいです
488 :
デフォルトの名無しさん :2009/03/12(木) 08:19:24
lispな方はバージョン管理は何を使ってますか? git svn cvs
489 :
デフォルトの名無しさん :2009/03/12(木) 08:23:19
mercurial, git
Bazaar
質問します。 組合せ問題、経路問題などの、記号処理問題をリストを使って解決するのに 相応しい言語を教えてください。 環境はできるだけ特定のOSに限定されない方が結構です。 グラフ表示は別の専門家が扱うのでロジック部分のみです。
493 :
492 :2009/03/12(木) 11:15:29
すみません。誤爆です。"初心者のためのプログラミング言語ガイド Part14"に書き込む つもりでした。直前にこのスレを確認していたのでpasteされたURLがここになって いました。 このスレの方々は それはSchemeだ! っておしゃいますよねw
cl-graph boost::graph
>>492 「リストを使って解決するのに相応しい」って、その質問がすでにLISPを想定しているとしか。その名も、LISt Processer。
昔は人工知能を書くために使われていたので、ターゲット分野的にもぴったり。
LISPをはずすなら、Haskellかなぁ。
ただ、Haskellはマルチバイト文字の処理周りが痛いらしい。
>>485 Gauche特有の話だし、wilikiででも質問してみたら?
ものまね鳥をまねる、14000円つけてるなw 今図書館で借りっぱなしで催促の電話が何度もかかってる。 忙しくて読めなかったんです。 この場を借りて予約入れてる人に謝るよ。
lispのラーメンタイマーだよ (require :pythononlisp) (py::py "import noodletimer;noodletimer.noodletimer")
QiはQiからlispよぶのは簡単なのに Qiをdumpしてlispから呼ばせるにはコードいじれって書いてある 自動でできないものなんだろうか
lispは、カッコばかりでみづらいとよく言われるけど これは、慣れだね 生産効率性については、まだよくわからないけど
入門者レベルなんですが、lambdaを使わないと書けないんでしょうか 練習問題 1 次の関数を再帰を使って書いてください。 3. リスト (ls) から要素 (x) を取り除いたリストを返す関数。 ; 3 模範解答 (define (remove x ls) (if (null? ls) '() (let ((h (car ls))) ((if (eqv? x h) (lambda (y) y) (lambda (y) (cons h y))) (remove x (cdr ls))))))
>>501 (define (remove x ls)
(cond
((eq? x (car ls)) (cdr ls))
(else (cons (car ls) (remove x (cdr ls))))))
503 :
502 :2009/03/14(土) 08:50:42
Σ(゚д゚) ls の中に x が二回以上出る場合はこうだ。 (define (remove x ls) (cond ((null? ls) '()) ((eq? x (car ls)) (remove x (cdr ls))) (else (cons (car ls) (remove x (cdr ls))))))
>>502 突っ込もうと思っていました
最初のは、(remove 5 '(1 2 3 2))でもコケますね
ヒントで実装までできました
ありがとうございました
Schemeでスタックを書こうとした場合 スタックのデータはグローバル変数に置くのが普通ですか? 出来たらクロージャとかに閉じ込めたいのですが 引数を2個にして1個目でpush/pop判断だとpopの時は引数が一つ無駄だし 個別にクロージャを使うと環境が別々になるし。 Gaucheのオブジェクト指向拡張とかだと綺麗にかけるんでしょうかね 他に思いつくのは、モジュールを作って そこにスタック本体のデータを置くとかですが どれが良いと思いますか 環境はGauche0.8.14です
どれがって、consセルで作れば簡単じゃないかと
(define top car) (define pop cdr) (define push cons) じゃまずいですか?
>>505 例外処理の項目の数値が未だに信じられない
>>508 スタックをリストとして直接触らせたくないってことなんじゃね?
まぁ、Gauche の OO 関連はそんなに効率が良くないので、
クロージャに閉じ込める方がまだ無駄は少いかもね。
>>509 > まぁ、Gauche の OO 関連はそんなに効率が良くないので、
> クロージャに閉じ込める方がまだ無駄は少いかもね。
くわしく
なにと比べて?
効率って生産効率?
>>506-508 想像だけど、破壊的更新をしたいじゃないの?
オブジェト志向なら、
a = stack.pop()
stack.push(b)
…
とか書くわけジャン。
>>511 速度とかメモリ効率とか。
メソッドのディスパッチも基本的には実行時にしか出来ないし。
どうでもいいけど、アンカ間違ってるぞ。
速度的には検証していないけど、
なんとなく
>>506 がイメージしているものを想像して書いてみた。
Gauche には依存していないつもり。
(define (make-stack)
(let ((stack (cons '() '())))
(lambda(proc)
(proc stack))))
(define (push stack-obj elem)
(stack-obj
(lambda(stack)
(set-cdr! stack
(cons (car stack)
(cdr stack)))
(set-car! stack elem))))
(define (pop stack-obj)
(stack-obj
(lambda(stack)
(if (null? (car stack))
'()
(let ((elem (car stack)))
(set-car! stack (cadr stack))
(set-cdr! stack (cddr stack))
elem)))))
スタックはconsで実装するつもりだったし、 なんか話がかみ合わないと思ったら・・そういうことか、理解しました 自分がやりたかったのは510氏のいうような意味でして ちょっと調べてたら可変長引数なる便利なものがあるってわかったので これで実装出来ました。もう少し処理を追加したら自分の目的には使えそうな感じ (define (stack) (let1 val '() (lambda a (let-optionals* a ((b 'none)(c '())) (cond ((eq? b 'none) val) ((eq? b 'top) (if (eq? val '()) '() (car val))) ((eq? b 'push) (set! val (cons c val)) c) ((eq? b 'pop) (if (eq? val '()) '() (let1 r (car val) (set! val (cdr val)) r)))))))) (define a (stack)) (a 'push 1) (a 'push 2) (a 'push) (a) (a 'pop) (a)
>>513 (規制されてて書き込みのタイミングが悪かったのですが・・)
そういえば、Schemeのライブラリは、こういう形のほうが多いですね
参考にさせてもらいます
ありがとうございました
最近のスタックインターフェースは、 top, pop, pushと三つに分けるのが主流だよ。 もはやイディオムになっているといっていい。
;; クロージャに閉じ込める (define (with-stack f) (let ((stack '())) (f ;; push (lambda (obj) (set! stack (cons obj stack))) ;; pop (lambda () (if (null? stack) '() (let ((obj (car stack))) (set! stack (cdr stack)) obj))) ;; top (lambda () (if (null? stack) '() (car stack)))))) (with-stack (lambda (push pop top) (push 1) (push 2) (push 3) (write (top)) (write (pop)) (write (top)) (write (pop)) (write (pop)) (write (pop))))
topってなんや?
解決 あとemptyっていうのも重要っぽいね
どうせそんなのはppしたら消えてしまうでしょ。 意味がある試みとは思えない。
つーかカッコが何種類も入り乱れるのは激しくウザい
世間でC言語みたいなものが好まれるのは、 演算子を含む式と文とのバランスが良く、 メリハリが付くからだと思う。 LISPは書式が関数も式も文も全く同じ規則で さらにそれを括る括弧に極端に縛られる。 C言語でも関数呼び出しだけで書いていけば 同じ印象になるが、C言語では関数のネストなんて 書こうと思わなければほとんどする必要がない。 要するに括弧の形を変えたところであまり効果はない。 S式ベースでうだうだ考えるよりは、括弧に縛られない 都合の良い構文フロントエンドを作った方がマシである。
俺は好きでよく使っているけどなぁ。 処理系によっては()[]{}の3種類が使えるから、数学の式を書くときみたいな感覚で。
・よく言われる演算子の有無 前置記法である事と関係する。 a.b.cは (ref(ref a 'b)'c) 1 2 3 のような書き方になる。 見ての通り1を脳内スタックに積んで2を読み、 1を降ろして3と結合する、という思考を要求する。 また、aとb,cは同一に扱えない。 ((ref a b c)とは書けず、何かしら歪になる) 演算子があれば a.b.c 1 2 3 や a().b().c() 1 2 3 どちらも1から3まで、左から右へと目を動かすだけで良い。 修正が発生しても一箇所で済む。 これはS式というより、前置記法では解決できない問題と認識している。
前置記法を排除すればS式でも(a -> b -> c)と書ける。 ここで、aをマクロ的に加工して実装してしまう事も考えられる。 が、それが現実的ではない事も判っている。 自分で演算子を作り、管理するのと同じ事になる。
また
>>526 の(a -> b -> c)のように、
S式内で独自言語を構築する場合、
独自言語の構文としての括弧もあるので、
S式のくくりの括弧がどうしても邪魔に見える。
ここまでやるならもうS式である意味がない。
a->b->cと書きたいならそのまま書けばいい。
だから、どうせやるなら
>>523 に書いた通り、必要時にS式も扱えるような
ちゃんぽん言語でもLISPで作ったらどうかというわけ。
不毛な縛りの中で何かやるよりはよっぽど健全ではないかと思う。
S式はデータとしてならともかく、コードとして出てくる必然性はあまりない。
>>520 とどっちが読みやすいだろうか?
let x=calculate-x(a, b, c), y=calculate-y(d, e, f)
in body ...;
if (predicate(x)) { do-something(); do-something2(); }
else if (predicate(y)) { do-another-thing(); }
else { do-whatever(); }
入門者なんですが、shchemeでS式以外の書き方の標準構文ってあるんでしょうか? 人間のパターン認知力なのか、人間の適応力のすごさ、慣れなのか、よくわからないけど 今のままのほうがいい気がする 基本レベルの正規表現が使える人で、schemeを100時間触ってみて、それで真っ当な意見を聞きたいかも みんな、「このまままでいいんじゃねえ?」って言いそう 採用する理由になった論文の疑似コードもみてみたいところだが
>>525 refが関数なら、(define ref* (lambda x (fold ref (car x) (cdr x))) で
(ref* a 'b 'c) って書けるんじゃない。
つか一般に二項演算子があるならfoldしてやりゃ不定長でも扱えるでしょ。
マクロならマクロでくるんでやればいいだろうし。
まあquoteは必要だけど、それは別の話だよね。
そういえば、syntax が安定するまでは yacc を使って試行錯誤して 安定したら手書きの parser を使うという話を聞いたことがある。 lisper は逆に yacc より更に柔軟な方向に進もうとするのか。
リードマクロがあるからね。
>>528 マクロを忘れてるぜ。
コードがS式だからマクロ変換子は単なるリスト操作をすれば済むんだろう。
Scheme のマクロは単なるリスト操作じゃないけど、S式は大前提だ。
リーダーマクロにしたところで、内部的にはやっぱりS式だしな。
リードマクロってキャラクタストリームベースじゃなかったっけ?
; M-x run-scheme で下のコードをC-x C-eすると、最後に添付するエラーになってしまいます (define (foo x) (if (= x 0) '() (cond ((= (modulo x 15) 0) (cons "FizzBuzz" (foo (- x 1)))) ((= (modulo x 5) 0) (cons "Buzz" (foo (- x 1)))) ((= (modulo x 3) 0) (cons "Fizz" (foo (- x 1)))) (else (cons x (foo (- x 1))))))) 環境 "GNU Emacs 22.3.1 (x86_64-unknown-linux-gnu) of 2009-03-10 on localhost.localdomain" guile> "1.8.0" ちなみにon emacsでloadすると、うまくいきます。 guile> (load "fizzbuzz.scm") guile> (foo 21) ("Fizz" "Buzz" 19 "Fizz" 17 16 "FizzBuzz" 14 13 "Fizz" 11 "Buzz" "Fizz" 8 7 "Fizz" "Buzz" 4 "Fizz" 2 1) また、gosh on emacsだと、こうなります gosh> (32 31 #0="FizzBuzz" 29 28 #1="Fizz" 26 #2="Buzz" #1# 23 22 #1# #2# 19 #1# 17 16 #0# 14 13 #1# 11 #2# #1# 8 7 #1# #2# 4 #1# 2 1) OS再起動してもダメでした エラー(長いので、一部略) guile> ... ... Display all 1922 possibilities? (y or n) ... Display all 1922 possibilities? (y or n) $abs EISCONN ERROR: Unbound variable: s ABORT: (unbound-variable) "Fizz"
Backtrace: In current input: 307: 0* [foo 3] 304: 1 (if (= x 0) (quote ()) ...) <unnamed port>:304:1: In procedure memoization in expression (if (= x 0) (quote ()) ...): <unnamed port>:304:1: In line 303: Missing or extra expression in (if (= x 0) (quote ()) d ((= (modulo x 15) 0) (cons "FizzBuzz" (foo (- x 1)))) s "Buzz" (foo (- x 1))). ABORT: (syntax-error) ERROR: In procedure scm_lreadr: ERROR: #<unknown port>:307:24: unexpected ")" ABORT: (read-error) ERROR: In procedure scm_lreadr: ERROR: #<unknown port>:307:25: unexpected ")" ABORT: (read-error) guile> Display all 1922 possibilities? (y or n) $abs %app %cond-expand-features %cond-expand-table %get-pre-modules-obarray %guile-build-info ERROR: Unbound variable: s ABORT: (unbound-variable) 4 Backtrace: In current input: 308: 0* [foo 3]
<unnamed port>:304:1: In procedure memoization in expression (if (= x 0) (quote ()) ...): <unnamed port>:304:1: In line 303: Missing or extra expression in (if (= x 0) (quote ()) d ((= (modulo x 15) 0) (cons "FizzBuzz" (foo (- x 1)))) s "Buzz" (foo (- x 1))). ABORT: (syntax-error) ERROR: In procedure scm_lreadr: ERROR: #<unknown port>:308:19: unexpected ")" ABORT: (read-error) ERROR: In procedure scm_lreadr: ERROR: #<unknown port>:308:20: unexpected ")" ABORT: (read-error) ERROR: In procedure scm_lreadr: ERROR: #<unknown port>:308:21: unexpected ")" ABORT: (read-error) ERROR: In procedure scm_lreadr: ERROR: #<unknown port>:308:22: unexpected ")" ABORT: (read-error) ERROR: In procedure scm_lreadr: ERROR: #<unknown port>:308:23: unexpected ")" ABORT: (read-error) guile>
(print (foo 21)) or (write (foo 21)) トップレベルプリンタが同一オブジェクトを複数回出力しないだけの問題では?
>>539 どういう意味ですか?
自分なりに解釈して、やってみたけど、ダメでした
>>540 >>539 の言っているのは gosh の出力についてだね。
guile のエラーについては式が guile にちゃんと渡されてない感じがする。
プロンプトが複数回表示されてるあたり、
式が複数に分割されて渡されている形になってそうなんだけど。
gosh だと C-x C-e でちゃんと動いてるのかな。
アドバイスをきっかけに解決しました
タブによるインデント構造をつくるとこのエラーになるみたいです
スペースに置換してみたら、通りました
おとといまでは、普通に使えていた気がしたので、謎です
特別な設定をしたとしたら、メニューバーのschme欄をちょっと触ったときなのかな
触ったあとに特別不都合は、なかった気がしたけど
>>541 >
>>539 の言っているのは gosh の出力についてだね。
把握しました
> gosh だと C-x C-e でちゃんと動いてるのかな。
もちろん、そうです
ドキュメント関係とデバッグ関係が整備されていそうなguileで行きたいんですよね
言語に慣れていないレベルなので、文字列処理関係は、まだ先っぽいので
気に掛けてくださったみなさま、お世話になりました
ああそっちの問題か readlineが悪さをしてる予感 emacsで使うときはactivate-readlineを無効にしたらどうでしょう
>>543 本当だ
cat ~/.guile
(use-modules (ice-9 readline))
(activate-readline)
の設定を外したら、tabインデントでもC-x C-eが通るようになりました
また、安直にcat ~/.gosh
(use-modules (ice-9 readline))
(activate-readline)
としていたんですが、これって効いていないんですね
goshに関しては、info関連をまだ目を通していないので、あれなんですけど
構文を多少読めるようになったので、readline.scmとguile関連のinfoを眺めてみることにします
(activate-readline)を外すのが嫌だったので、とりあえず関数に割り当ててみました scheme, lisp関連の設定って、みなさんは、どういうふつうにされているんでしょうか? 不都合がなければ、晒してほしい・・・ cat ~/.guile ; first setting (use-modules (ice-9 readline)) (define (a) (activate-readline)) ; adding (use-modules (ice-9 popen)) (use-modules (ice-9 rdelim)) (define date (read-line (open-input-pipe "date -R"))) (define pwd (read-line (open-input-pipe "pwd"))) (define echo-home (read-line (open-input-pipe "echo $PATH")))
activate-readlineはemacsからrun-schemeで使うときは不要。っていうか邪魔。 (or (string=? "dumb" (getenv "TERM")) (activate-readline)) とか書けばいいんじゃないかな (run-schemeのときは環境変数TERMがdumbに設定されるから)
>>543 なるほど、readline が \t を食っちゃうのか。
知らないと意外とはまりそうだな。覚えておこう。
逆に言えばreadlineでシンボル補完が効きます
ドキュメントとデバッグ環境でGuileを選ぶってのも珍しい気がする。 そういう場合はPLTとかに行きそうなもんだけど。
>>547 コンソール時
echo $TERM
linux
gnome-terminal時
echo $TERM
xterm
emacs時 echo $TERM
emacs
なのに、なぜemacs時だけ(activate-readline)が実行されないの?
>>551 scheme処女なもんで4つのinfoがあるguileなのかなと思って
PLTは、存じませんでした
候補として考えたのは、Gauche, guile(, tiny scheme)の2つ(3つ)ですね
ちょっとした疑問なんですが、guileにあるhelp関数ってGaucheにもあるんでしょうか?
あと日本人のguile率って少ないんでしょうか?
SchemeでぐぐるとGaucheがいっぱいひっかかりますね
Gaucheは高機能な上、日本人のShiro Kawaiさん作なので日本語のドキュメントがたくさんある。 guileはGNU標準でポータビリティは高いんだけど動作が遅くてスタックが(標準では)少ない。 入門用ならばR5RS規格に最も厳格にマッチしている上にguile以上のポータビリティがあるScheme48もお勧め。 自分はGauche>>guile>Scheme48の順に使ってます。 マクロの種類で言えば Gauche:syntax-rulesマクロ、伝統的マクロ guile:syntax-rulesマクロ、syntax-caseマクロ、伝統的マクロ、リードマクロ Scheme48:syntax-rulesマクロ、明示的改名マクロ なのでguileが最も充実してますが。
>>552 gaucheにはhelp関数は無いけどinfo関数というのがある。
ただ、表示されるのが「その関数を含むinfoの1ページ」なのでちょっと面倒。
emacsから使ってるなら、カーソルのある関数のinfoエントリを一発で*info*バッファに
表示するelispが昔MLに流れたことがあった気がする。
describeもaproposも使えるけど なんだかんだでhyperspecとslimeが使いやすいやね
556 :
552 :2009/03/17(火) 05:23:33
自己解決しました
コピペまんまだと、activate-readlineきいていました
"dumb"のところを"emacs"に変えればいいわけですね
当たり前と言えば、当たり前なんだけど
日本語WikipediaのSchemeの項目の最下部の外部リンクの「関数プログラミングは、なぜ必要か、うんぬん」の文章ってわけわからないっすね
あの疑似コード、わかりにくいw
プログラミングしていて、なんとなく関数言語がいうモジュール化がわかってきたかも
>>553 今、気づいたんですが、日本語WikipediaにSchemeの処理系の項目は、Gauche以外書かれていないんですね
そういう意味でもGaucheに流れる人が多いのかな
>>554 info関数なんてあるんですね
Gaucheのインストール失敗したのか、よくわかりませんが、info閲覧できないんですよね
まだ必要に迫られていないので、ちゃんと調べていませんが
>emacsから使ってるなら、カーソルのある関数のinfoエントリを一発で*info*バッファに
>表示するelispが昔MLに流れたことがあった気がする。
便利そうですね
>>555 slimeって聞きますね
もうちょっとしたら、導入してみます
あれ、run-schemeで起動したguileで guile> (getenv "TERM") "dumb" ってなりませんでしたか? guile> (getenv "TERM") "emacs" なら"dumb"を"emacs"でいいですけど…
>>557 shellモードもrun-schemeモードも"emacs"と返りますね
infoドキュメントでがんばって、勉強しているんですが
けっこう大変ですね
基本的なlet, set, lambda関連の記述の仕方は、わかるんですが
ちょっと複雑になると理解しにくい・・・
>SchemeでぐぐるとGaucheがいっぱいひっかかりますね 絶望した!横文字をウェブ全体から検索した結果に絶望した!
infoで勉強する心意気は結構ですけど
先ずは
>>216 あたりのウェブページで勉強するほうが楽かもしれません。
わからない所はこことかに具体的にドシドシ書きこむと
さらに後に続く人の為にもなるでしょう。
>>560 > infoで勉強する心意気は結構ですけど
> 先ずは
>>216 あたりのウェブページで勉強するほうが楽かもしれません。
infoで勉強するのが今回の目的だったりするんですよね
あとguileは、なにができるだ(どういう機能があるの?)というのも速く知りたいから、
とりあえず、なぞっているのもあります
もちろん、Schemeの学習階段的には、日本語の入門サイトは有用ですね
英語圏の人は、infoだけで事足りるのか、プログラミング経験度を前提しているのかとか
>infoだけで事足りるのか そんな完璧な文書があると思うか? あるわけねーだろ 完璧を目指すのはいいが少しずつ地道に改善していくしかない ちなみに、アジャイルとかなんとか言われるようになる以前は 一発で完璧なものが作れると思ってる奴がたくさんいたとかいないとか
>>562 完璧な文書だとは、思わないけど
十分な文書だと思うよ
common lispの情報探そうとするとhatenaなどのblogにいきあたること多い schemeは2chの過去スレが検索にかかることが多い この違いは何?
Googleの中の人に聞いて下さい。
schemeしか知らないけど、lispでぐぐればいいんじゃない? lisp --> common lisp scheme --> scheme という理解だけど
&hl=en付けたら2chにもhatenaにもいきあたらないな
>564 実用性があるか無いか、実アプリ開発に使ってるか否かの差だとオモ。 言い方を変えればSchemeは教育的効果は高いが…
おっとBASICの悪口はそこまでだ
schemeで、(car '())や(cdr '())の結果はどうなるんしょうか? 昔読んだLISPの本か何かでnilのcarやcdrはnilになるという 説明を見た気がするのですが、schemeにも当てはまるんでしょうか。
r5rsでは空のリストにcar,cdrはエラーって定義されてるな
R5RS 6.3.2
r5rs-ja.pdfにありました。ありがとうございました。
>>497 オレ、とある図書館でその本の順番待ちなんだが、
まさかオマエが止めてるのか?w
なんだこいつ
これをLIFOと言います
後入れ中出しだっけ
アッー!
>>579 そのすぐ下に書いてある通りでは。
デバッガを使わずとも、replで個々の手続きを呼べるので、色々な入力を与えて出力を
見るかな。入力と出力の関係がすぐに把握できない(手続き内でステップ実行したいと思う)
ようであればたぶん手続きが(あなたにとって)大きすぎる。
で、何のソースを読みたいの? 抽象論はもう飽きたよ
>C(手続き型言語)との対比でschemeにとってソースの動きを追うってどんな感じなんですか? そういえばあんまり追ったことないかも・・・スタックトレースが1000行と出ちゃうから。面倒なんでデバッガ使わなくなった。"Type (debug) to enter the debugger."とか出されても、もう無視(w
>>580 処理系への絶対的な信頼性ってこと?
効率的なデバッグ術の個人の差ってかなり開きがありそうだね
>>581 日本語サイトのサンプルとか、とりあえず、デバッグツールで読みたいなあと思って
バグでハマって、解決はしたけど、ものすごく時間がかかった場合は
バグの見つけ方のポイントを教えてくださいね
初心者ですけど (define (f x) (let ((a (hoge1 x)) (b (hoge2 a)) (c (hoge3 b)) (d (hoge4 c))) d)) ;; (f "なんちゃら") みたいな書き方をしています。 Emacsで、最後のコメントアウト行でC-c C-eで評価。 思ったような主力がでないときは、最後のdをcとかbとかに書き換えて、その段階での出力をみます。 手続き型に毒されたやり方でしょうか?
それをやるならlet*じゃないかね
>>579 自分はC++でプログラム書く時も、
デバッガ使うのはcore dump(assert含む)した時くらい。
基本的にユニットテストやってる。
自分のことを全然信用してないから、
全自動で網羅的なチェックした方がよい。
もちろんテストコードの方が圧倒的に多いし、
assertも馬鹿みたいに書いてる。
コードを書いたらすぐにユニットテストも書いてるから、
何かテストしたい時には、デバッガ立ち上げて操作するより、
既存のユニットテストコードを基に新たに書く方が速いw
テスト、assertコードを書くのは設計の検討にもなってる。
設計をあらゆる角度から観察する必要があるから。
もちろんdtrace, profilerなんかも使いますが。
>自分のことを全然信用してないから、 分かるわ〜 自分もいっつもデイジー・デイジー歌っちゃう
そんなんじゃボーマンさんにスイッチ切られちゃうぞ。
そのテストツールの作り方の方針というか みたいなものをまとめている本ってないでしょうか
そのってどの?
まずデバッガに依存するのをやめて徹底的に構造化プログラミングを意識するようにした方がいいんじゃね?
具体的に何のコードをテストしたいのかを意識するべき。 そうでないと、ツールとか方針とかが正しいのか、そもそも必要なのかを検証できない。
594 :
デフォルトの名無しさん :2009/03/21(土) 01:36:26
>>592 デバッガ使ってうまくいっている人は使えばいいと思うよ。
デバッグのしやすさをよく考えて作ったほうがいいよ。つまり 手続っぽく作るのも可能だけど、なるべく関数のスタイルを身につけたほうが 効率的だよ。関数のスタイルをとるなら、デバッグはassertやtraceさえ出来れ ば、大体なんとかなるし。いわゆるデバッガが必要なのは、関数がでかくって、 その中で手続的に処理が乱雑になっちゃうからなのでは?
そもそもの話はコードの読み方じゃなかったっけ。 まあ、それはreplで関数叩いて入出力確かめろ、ですでに結論出てるな。 とは言え、じゃあひどいコードはどうやったら効率よく読めますか、 とか訊かれると、どうしたもんかね、となるが。
本屋でO'reilly Gaucheをみかけて、軽く立ち読みしたけど 良さそうな感じだね
>>590 処理系のソースに付いてくるテストコード読みなよ。
>>597 新しいGauche本が出たのかと喜んでオライリーを覗きに行ったら
ふぬああ本のことだったのか…
2133?
フ ムフム ヌ クヌク ア プ ア ア
すまんがカッコ付きで話してくれんか
(+ (* フム 2) (* ヌク 2) アプアア)
Syntax Error
私のカギカッコは渚でしか見つけられませんでした。
))) ←波
))) ←こんなん見て人生おかしくならないか?
>>609 おれのヘッドホンは
beyerdynamics))))
だよ。
(((((((((((パナウェーブ)))))))))))
Lisp使い初めてから人生おかしくなったとか損したなんて人は 今まで一人も見たことがないな。 その前に周りにLisp使える人が一人も居ないお(´;ω;`)
損はしていないが、Lisp使えるだけでアレゲな現場に投入された経験はある。 周りが変態ばかりで困った記憶がある。 かくいう俺もド変態だ。どうだまいったか。
アレゲってエロゲでAI作るとか?
ぬるぽ
LISPにNullPointerExceptionあるの?
規格上はない。 補足してトップレベルに復帰する処理系はある。
おお、安心しました。
値が束縛されてないシンボルを参照したりすると出るエラーがぬるぽに相当するんでは?
それはUNBOUND-VARIABLEだよね。 NILのCDR取るとか規格の範囲内で起きるものじゃなくて、 MEMREFなどの低レベルAPIや処理系バグで起きる、 *((char *)0)な話かと思ったが。
>>574 謝ってるのにオマエとか言う奴には貸したくないな。
いやいや、アナタの本じゃないし 読んでなくても一度返すのがスジですよ。 そして列の最後尾に並び直すのです。 (セドラーから5000円だか7000円だかで新古本を買った者より)
筋というか、普通はそういう規則じゃないの。 予約を入れた人がいなくても 貸し出し期間内に図書館にいって延長手続き(借り直し)するものだと思うんだけど。
>>622 へー新古品なんてあるところにはあるんだなあ。
ところで訳書を出してたとこってたしかオンデマンド印刷とかで
幾つか出してるし、これもそれで復刊してくれないかなあ。
某大手書店の最後のディヴィグ本をゲットして喜んでたのに いつの間にか増刷されてamazonでさえ普通に新本が手に入るようになってて涙目w 手習いとかものまねも復刊されるかもね
>>625 ま、そんなこともあるさ。 どんまいどんまい。
筋ってw ヤクザやさんがこんなところに居るとはw 規則なんだから返すに決まってるでしょ。 あればね… ていうか本なくしちゃったw
>> 627 細かいこと気にするなって。買って返せば無問題♪
>>621 とか
>>627 とか、こういう奴がいるから、
図書館の中の人が苦労するんだろうな、と思った。
釣りならいいけど、素でその態度なら頭おかしいだろ。
わざわざ言うことかw
絶版Lisp本ではものまね鳥と竹内先生の本が読みたいな。 あとLisp以外ではPrologの技芸。ヤフオクみたら29500円とかwwwwww オンデマンドで売ってくれくれ。
Prologの技芸ってたまに名前を聞くんだが、そんなに偉大な本だったのか・・・・・
Prologの技芸持ってるけど読んでないぜ そんなプレミア付きとは知らなんだ
>>633 よかったら読んだら売ってよ。1万なら買うよ。
「Prologの技芸」はProlog版SICP。 SICPはアーキテクチャよりだけど、こっちは応用より。 内容グーで印刷ショボ。
間違ったヤフオクじゃなくてアマゾンだった。> 29500円
これって業者がつり上げてんの?ひどい値段だなぁ。
>Prolog版SICP なるほど
the art of prologの和訳本だよね
MITの教科書か。既に新しい版が出てるみたいだね。
641 :
デフォルトの名無しさん :2009/03/25(水) 14:53:33
話ぶった切ってすまないけど、SchemeでProcessingみたいに Arduinoを制御することができる処理系ってあるのかな? GaucheとかPLTってどうなんだろ? できればやりかた書いてあるリンク教えてください。
642 :
デフォルトの名無しさん :2009/03/25(水) 15:20:28
一方ポールグレアムはクラウドを制御した
crowdコンピューター?
生きのこる術は大衆言語。
だが気を付けたまえ。
647 :
デフォルトの名無しさん :2009/03/26(木) 17:47:48
>>641 "Getting Started with Arduino"の6章"Talking to the Cloud"で
Proce55ingを使ってクラウド上のPhysical computingを制御してます。
実はRubyやPerlやPythonでも出来るので、
もしかしたらGaucheとかPLTでもできるかも・・・Arduinoはavrdude経由で操作するかと思いますが・・・
スクリプトでなければ
>>642 のようにavr-gccでArduino上のプログラムを
作成するのが良いでしょう。
そんな感じでクラウド側もPhysical computing側もSchemeは使えます。
といってもArduino上のというかAVR上のSchemeはまだないですね。
最近はメモリサイズが大分大きくなったようですが・・・
>>647 >Arduino上のというかAVR上のSchemeはまだないですね。
つーかそもそもmegaの内蔵SRAM程度では厳しい。
外部コンパイルしてAVR上でVMを走らせる
みたいな使い方ならできるだろうけど。
マイコンでscheme動かすならアドレス空間大きめの
ものを選んだ方がいい。
649 :
デフォルトの名無しさん :2009/03/27(金) 03:23:50
atmegaでも無理なのか ならschemeからマシン語のコードを吐くコンパイラというのならどうかな
ハーバードアーキテクチャだからフラッシュとSRAMの扱いが違うんだよね フラッシュにオンタイムで書き込むにはブートローダもどきがいる
653 :
デフォルトの名無しさん :2009/03/28(土) 23:38:51
>>652 有り難う御座います。このスレでもλ計算の話は久しぶりですね。
とっても気に入りました。でも、素のλ計算はメモリを喰うので
この計算ぐらいが限界って例が書いてありますね。
簡約戦略がまずいとメモリオーバーしそうですねw
関数型スレでスルーされてしまったのでコチラで聞いてみますが lazy-kやunlambdaの式をλ式にしてくれる変換器ってないでしょうか (もしあればCombinator Birdsのような式が直接計算出来るのが理想ですが) というのも、W=C(BMR)=λab.bbb≠λab.abbな気がするので 検算してみたいんです。 後Combinator Birdsのページ、 W=SS(KI)がおそらく一番シンプルな答えですね
なんか流れを止めてしまったみたいなので、654は撤回します ごめんなさい
過疎板の過疎スレで気にするような事じゃない
>>655 いや、関係ないだろ
W=C(BMR)=λab.bbb≠λab.abbとW=SS(KI)ってどういう意味なの?
暗号にしかみえないw
撤回するな!CLかSchemeで実装してみろ! と焚きつけてみる
良かった。それじゃせっかくなので解説してみます λをlと表記すると lab.abbってのは(lambda (a) (lambda (b) ((a b) b))と同じ意味(abbの部分は左結合)で、 これはWコンビネータのλ式の表現でもあります。 W=SS(KI)、つまり((S S) (KI))ってのは以下のS,Kを用いてWが表せますよ、という意味 ;lxyz.xz(yz) (define S (lambda (x) (lambda (y) (lambda (z) ((x z) (y z)))))) ;lxy.x (define K (lambda (x) (lambda (y) x))) ;lx.x (define I (lambda (x) x)) (define turing-type-quine (lambda (x) (lambda (y) (list y (list x (list 'quote x) (list 'quote y)))))) (define w (lambda (x) (lambda (y) ((x y) y)))) ((((S S) (K I)) turing-type-quine) 2) ((w turing-type-quine) 2) 最後の2行は同じ結果になりますよね Combinator Birdsでググるとトップに出てくるページには この他にW=C(BMR)っていう定義が載っていて これを簡約するとlab.bbbになるのではないか、というのが自分の疑問です。 というか、上のようなコードを書いて気づいたけど、 Scheme殿に計算してもらえば良かったわけだ 今から試してきます。気づかせてくれてさんきゅ
(define C (lambda (x) (lambda (y) (lambda (z) ((x z) y))))) (define B (lambda (x) (lambda (y) (lambda (z) (x (y z)))))) (define M (lambda (x) (x x))) (define R (lambda (x) (lambda (y) (lambda (z) ((y z) x))))) (define W (C ((B M) R))) ((W turing-type-quine) 2) 普通に出来た。 自分の計算ミスかー、ショック ちなみにW=SS(KI)はこんな感じで計算できます。 lab.abb =lab.(ab)b =la.S(lb.ab)(lb.b) =la.SaI =la.(Sa)(KIa) =S(la.Sa)(la.KIa) =SS(KI)
>>660 2割ぐらい理解したw
あとで再挑戦・再理解してみる
lambdaを3つ使うのを初めてみた
おれはlambdaを3つ使うコードを書くことがあるのだろうか
このロジック(表記法?)は、どういう用途で使えそうなの?
意味はさっぱり分からんがラムダだらけで楽しそうだ
>>663 Thank you
知らない概念や処理系が、いっぱいあったけど
2割ぐらい理解した
感想は、うまく言葉にできない
660ですが、ML系(たぶんHaskellも)の言語ではカリー化という機能があって Schemeでいう以下の2つは同じ物として扱われる (lambda (x) (lambda (y) (lambda (z) ... (lambda (x y z) ... 3引数の関数なら書いたことあるでしょ? そう考えたらそんなに複雑でもなく見えてくるかもね
>>665 素朴な疑問なんですが
普段は、なんの言語を使っているんですか?
ちなみに自分はbash 5%, C/C++ 30%, gauche 10%, Python 30%, その他 25%
エディタはemacs?
差し支えなければ、教えてください
聞かれていない自分も晒すと gauche95%、sh3%、sed1%、C1%くらいだな。 1年半くらい前はsh70%、sed20%、C8%、(Scheme48+guile)2%くらいだったけど。 カリー化と可変長引数は両立がむずかしげでML系はカリー化を、Lisp系は可変長引数を取ったんだとおもう。 あとカリー化とthunkも相性が悪くて 正格評価のMLは、評価を遅延させる式を ():unitを受け取るなんちゃってthunkで実現してた気がする。
>>667 gaucheを使っていて、不都合はないの?
他の言語を選ばずに、gaucheを選んだいくつかの理由ってなに?
lisp系じゃなくて、gaucheの理由も知りたいかも
669 :
660 :2009/04/01(水) 20:57:38
Gauche使ってる時間が50%ぐらいで、 OCaml&F# 30% C++ 15% Perl 5%ぐらい エディタはVC付属エディタとemacs/viです ところで、可変長引数がダメなのはカリー化というより 型付けが出来ないからではないでしょうか? 呼び出し時に引数の型を指定するprintfのような関数なら I,T,Qコンビネータと関数合成とカリー化で一応実現できます 効率にハンデはあるかもしれませんが
670 :
デフォルトの名無しさん :2009/04/01(水) 21:04:07
500 :Classical名無しさん :09/04/01 20:55 ID:qtulE/8k
よろしくお願いします。
【URL】
http://pc12.2ch.net/test/read.cgi/tech/1231856193/ 【名前欄】 660
【メール欄】 sage
【本文】↓
Gauche使ってる時間が50%ぐらいで、
OCaml&F# 30% C++ 15% Perl 5%ぐらい
エディタはVC付属エディタとemacs/viです
ところで、可変長引数がダメなのはカリー化というより
型付けが出来ないからではないでしょうか?
呼び出し時に引数の型を指定するprintfのような関数なら
I,T,Qコンビネータと関数合成とカリー化で一応実現できます
効率にハンデはあるかもしれませんが
671 :
667 :2009/04/01(水) 21:20:19
>>668 自分のScheme処理系の変遷は
1.scm。多倍長整数が使いたくなる。
2.Gambit-C。SRFI周りがオレ様過ぎる。
3.MzScheme。非メジャーCPU、非メジャーOSへのポートに挫折。
4.Scheme48。本格的にSchemeを使い始めるが非保健的マクロが独自、SLIBのサポートがビミョー。
5.Guile。機能的にはほぼ文句はないが、遅い。そして重い。
6.Chicken。非メジャーCPUで最適化バグがあったような気がする。
7.Gauche。現状フリーR5RS処理系でベスト。非メジャーCPU、非メジャーOSへのポートも楽。
という感じです。
ドキュメントも豊富、高機能で軽くて高速、とくに正規表現周りはcl-ppcreよりも使いやすいのも◎。
いままでC+sed+shでやってたことをgaucheだけで置き換えられるようになったのがいいですね。
速度重視とかマルチスレッドバリバリなことをしなくなったということもありますが。
SGIが倒産したらしい
そうか、そうか
lisp系は自作に限るよ
LispスレでSGIといったら創価じゃなくて シリコン・グラフィックの方だろJK
2度目の倒産なんだって? なんかLispに関して大きいことやってたっけ? OpenGLぐらいしかシランわ。
ずっと自作のSchemeモドキを使っています。モドキというのは、あまり 使わない機能を削って代わりに部分継続やソフトタイピングを入れたり してるためです。それなりに高速でデバッグ機能も充実していると思って いますが、RnRSやSRFIの類は全く考慮せず作っているので公開していま せん。ドキュメント書くのもめんどくさいし(論文は書いたけど)。
勘違いしたかも。 SGI(非創価)ってLisperが作った会社だと思ってました。
lispでモナディウスなみの速度は出せるのだろうか
>>679 ジムクラーク? Lisper ではないね。専門は CG らしい。
ワークステーション屋で Lisper が作った会社ってあったっけ?
Sun のビルジョイはハッカーだけど Lisper じゃないし。
昔、N-Worldって、SGI (Indy?)向けの3D CG作成アプリなかった? Lispマシンから移植されたものだったと思う。Lispで動いていたはず。 プロトタイピング強いから、いろいろな分野の初期大型アプリで使われてるね。 数式処理、ウィンドウシステム、プログラミング可能エディタなど。 CG関係も昔はもっと多かった。
sgiといえば、インディゴだな。doomでネット対戦に使わせてもらったよ。
sigは破産申請したらしいね
CGはもうからないのか
>>682 ニチメンなんとか、ってやつのことかな。Shiroさんが詳しそう
前回の破産でCG方面からサーバー屋に商売変えしてたんじゃなかったっけ?
なんかMIPSの灯がどんどん消えてく気がするなぁ…
/.Jによると、どこだかに買収されるんで、それに必要な手続きなんだと。
>>681 そうゆう名前で呼ばれてかかどうかはおいといて、MIT 由来の
LISP マシンってワークステーション以外のなのものでもないが…
>>685 技術の発展とともに、作業端末は高価なUNIXワークステーションではなく
安価なWindowsマシンが優位になり、未開の領域に強く柔軟なLispから
高速で大規模なプログラムに強い? C++に置き換わったとかじゃないの。
692 :
681 :2009/04/03(金) 09:54:17
>>690 あーそうね。シンボリクスとかがそうか。
Unixワークステーション屋で、と言うべきだったかな。
carやcdrがちゃんと理解できん・・・ アセンブラの方が簡単かも。
そんなに難しいかな? 単方向リンクリストの、先頭を取り出すか、それ以外を取り出すか、 だけなんだが。
括弧とドットの表記法でつまづくか、ポインタでつまづくかのどっちかですよねー
carは左って覚えれば良いと思うよ
>>693 コンスは単なる2つのポインタの対
Lispよりも低レベルではcarとcdrは可換で線形リストとは何の関係もない
線形リストに利用しているのはLispより高レベルだけの話
アセンブラ的に考えればこう
まずボックス表記を手で書いて それからいろんな構造をconsだけで組み立てる ドット対→線形単リスト→2分木みたいに徐々に複雑にしていくといい
Common Lisp: A Gentle Introduction to Symbolic Computation 付録の sdraw 使うと図示してくれる
CL-USER> (sdraw '(1 2 3 (4 5)))
[*|*]--->[*|*]--->[*|*]--->[*|*]--->NIL
| | | |
v v v v
1 2 3 [*|*]--->[*|*]--->NIL
| |
v v
4 5
http://www.cs.cmu.edu/~dst/Lisp/sdraw/
ちゃんと理解できないったって(と)の対応はわかりますよね? Lispのリスト記法はドット記法の構文糖 任意のリスト記法はドット記法で表せる(逆は偽) ドット記法の基本は( A . B )でホワイトスペース+ドット+ホワイトスペースがcarとcdrの間の仕切り (開き/閉じ括弧の周りはホワイトスペースの省略可) そしてドット記法を(A B C)みたいなに直すのは ドット+開き括弧を見つけたら、それと、それに対応する閉じ括弧を消しゴムで消すだけ
( A . B ) ≡ [ A | B ]
(cons 'a 'b) => (a . b) (cons 'a (cons 'b '())) => (a b) '(a . (b . (c . ()))) => (a b c)
'とかquoteが絡んでくると解りづらくなるから 任意のアルファベット1文字のシンボルと空リストは自己評価的という設定にしよう (cons A B) => (A . B) ;; [ A | B ] (cons A ()) => (A . ()) ≡ (A) ;; [ A | NIL ] (cons (cons A B) ()) => ((A . B) . ()) ≡ ((A . B)) ;; [ [ A | B ] | NIL ] (cons () (cons A ())) => (() . (A . ())) ≡ (() A) ;; [ NIL | [ A | NIL ] ] (cons A (cons B C)) => (A . (B . C)) ≡ (A B . C) ;; [ A | [ B | C ] ]
lispのリストはヘテロジニアスリストでさらにペアにもなるから難しいよな ML系みたいにリストは空か値とリストを持つコンスって定義だとまだわかりやすいのに
分かりにくくないだろw
ふと思ったんですけど 効率の為にlistではなくvectorを使っているアルゴリズムって 静的にコンパイル+破壊的代入なしって条件なら プログラマにはlistとして見せつつ 内部的にはvectorとして処理できませんかね? たとえば(list 1 2 3 4 5)は 表面的にはコンスによる線形リストなんだけど内部的には#(1 2 3 4 5)であるオブジェクトを返すとか。 書き換えられない事が解っているn要素の線形リストは2ワードのセルをn個アロケートするより nワード+αのベクタで記憶するほうがよさそう。 Haskellが文字列をリストとして実装してるのはそんな理由だったりするのでしょうか?
それは「cdr coding」と呼ばれるもので散々実験済み。
書き込んでから気づいたけど、 部分リストを複数オブジェクトで共有している場合 先頭部分の参照がはずれてもGCで回収できなくて逆に効率が悪くなりますね。 ベクタの最初の方だけGCできる方法を取れば別ですけど そうするとベクタの情報が増えて結局コンスと大差なくなるかも
>>707 おや、そうでしたか。不勉強でした。
見た所、線形リストを少しでも効率よく処理する為の物の様で
ベクタを置き換えるには至らなかったようですね。
vector的利用がはっきりしているところでは、 vectorを使えばいいしね。 listで構造体を模倣してprototypingしても、 accessor使っておけば簡単に移行できるし。
evalと大域変数でhashを模倣する初心者を見てニヤニヤするんですよねー
それは君だけ。
やべえ、サボってたらSeasoned Schemerわかんねえw また後戻りか…英語もやってないし… λ.......
関数型言語を勉強してる人が増えるのは喜ばしいことだけど 初心者が初心者に教えてる姿は危なっかしくて思わず突っ込みたくなる。 話を聞いてると、初心者にはカリー化が珍しいのか興味を示していた。 ただ、もうそろそろこのうざい雰囲気がなくなればいいのにと切に願う。さっさと成長しろ。
初心者は永遠に居なくならない時点でずっとそのままうざい雰囲気のままだと思うが?
先達はあらまほしきことなり なぜそう邪険に扱う。教え導くのも初学者を脱した人の使命でしょ。
雰囲気の濃度を薄めればいいのだが、溶媒がどんどん蒸発してる。 ドライクリーニングは危ないから誰もやらない。
>>716 その通り。邪険にすれば衰退しかありえない。
>>714 のように背伸びしたい初心者もかわいらしいじゃないか
自覚している初心者と自覚していない初心者しかいないじゃないか
722 :
デフォルトの名無しさん :2009/04/04(土) 14:33:24
せっかく勉強になる流れになりつつあったのに元に戻ってしまったかwww
いや、正直うざかった
で何の話がしたかったの?
他人の事をうざいと言いたいだけだろ。そういう奴居るよね。
じゃあ漏れが話ふる。 SICPスレでLispからPythonへの移行の話が出てる。 どうして私は信仰を捨てたか、という文章が興味深かった。 こんな話。 ↓ 自分はApple II時代からのLisperで Lispで開発してきてほかの言語を使う人に実質負けたことがなかった。 Lispは圧倒的に効率がよいから。 でもなぜかLispユーザーが少ないのはどうしてなんだぜ? Lisp求人無いのは何故なんだよな? Googleに入ってみたら特にLispが開発効率良いってものでもなかった。 だからそれまで持っていたLisp信仰を捨てた。 Novicも今はPython使ってる。
捨てた過程はわかったが、直接の原因がさっぱりわからん。
Lisp「だけ」、ってのにそれほど拘る必要性も感じないが。
> Lispで財をなしたのはPaul Grahamだけ
Lispを捨てたのは仕方ないとして PerlにもC#にもなりきれないPythonでは、問題を先送りにしただけじゃないか
lispを知ってると知らないではプログラミングの発想は全然違ってくるよ。 捨てようが捨てまいがそれはどうでもいいけど、その心の影響は消えないからね。 簡単に言えば、手続型ばかりやってると関数ポインタみたいなことに到達するのは 時間がかかるけど、lispはそんなもの最初にやるからね。 map的発想ってのもそうだな。最初に付き合うかどうかって違いが実は大きい。
プログラミングに必要な抽象化の道具が最初からそろってるものと、目先のことを解くだけの 道具だけが最初にないかの違いでもある。 pythonやrubyもlisp的な観点で教えたほうが幅が広いとおもうが、どうもjava屋とかC/C++屋的 な発想でやっちゃうよな。あれははっきりいうけど愚かだと思ってるね。
Cやってないからよくわからないんですが よく初心者にポインタが難しいって聞きます。 Lispやっていれば将来Cのポインタもすんなり理解できるということですか?
また古いのをもってきたな。その文章書いたErann Gat(今はRon Garretに名前かわってる)は信仰を捨てたんであって、 Lispを捨てたわけじゃないぞ。Pythonも生産的だと認めて使うようになった、というのが正しい。
mapやfoldならhaskellの方が簡単だし 関数型プログラミングとしてしか使わないならlispなんて要らない
Cのポインタが難しいと言われるのは、 「これは難しいよ〜」と言われて紹介されるのが被害を助長させてると思う。 理解して無くてもなんとかなる。
738 :
デフォルトの名無しさん :2009/04/04(土) 17:45:35
少なくともあわてて複数の人が言い訳しなくてはならないような程度ってことね、Lispって。
Haskellのモナドが難しいと言われるのは、 「これは難しいよ〜」と言われて紹介されるのが被害を助長させてると思う。 理解して無くてもなんとかなる。
emacsが使いたくて、schemeを勉強しているだけだな 昔からある言語なんだし、後発言語はlispの影響を受けているわけで 優位差というものは、ほとんどないでしょ
emacs使いたいならschemeよりもclispだし、clispよりもelispを学ぶべきだろw
お前ら変なフラグを立てるなよ 「Pythonで財をなしたのはGoogleだけ」なんてことになったら目も当てられない
いっぽうSunはJavaを開発した
SunがCommon Lispに力を入れないのはどうしてなんだろう。
>>744 力を入れても収益になる見込みが低いからじゃね?
企業なんてそんなもんだ。
Sunは昔、Symbolic Programming Environmentってのを出していた。 LispView(OpenViewのCLOSバインディング)は面白かった。 まあ儲からないものを続けるわけにはいかない。
JavaをもってしてもSunは身売りしなくてはならないわけだし。
lispのコードが出てこなくなると話が弾むな。
お前はそんなレスばっかりだなw
初心者スレに何期待してんだ
(gc) ; ゴミレスをガーベージコレクション
>>751 未実装です。次期バージョンにご期待ください。
pythonの方が便利 マクロを使いこなせれば違うのだろうか
そういうどっちが便利みたいな話はよそでやれよ。
その手の話用っぽいスレもあるしね。
いや ホントに便利なんだって
そうだね、でもここはLispのスレだからPythonはスレ違いなの、ばいばい
宝石の名前の言語だけは使うな ってばっちゃが言ってた
ほんとどうでもいい話だが花とか植物の名前つけたlisp方言ってないもんかね。
関数型言語学びたいんだけどHaskellとSchemeどっちがいいかな?
>>760 それをこのスレで聞くの?
純粋な関数型言語をやりたいなら、Haskellでもやっとけばいいじゃない。
>>760 無理せず、両方やればよいと思う。
まぁ、
>>761 のいうように、「これぞ関数型言語」というのがやりたいのならHaskellじゃね?
まずSchemeで型無しλ計算のイメージをつかむのが先決。
>>761-763 お答えありがとうございます。
純粋関数型言語にこだわりはないのでとりあえずScheme触ってみます。
>>763 というフリがあったので、質問です
lambdaで下のプログラミングってどうやって書くの?
再帰的には使えないんだよね?
;1からnまでの和を計算する
;とりあえず、n = 50とする
(define (foo x)
(if (= x 1)
1
(+ x (foo (- x 1)))))
; これはなしで
(define (foo x)
(/ (* x (+ x 1)) 2))
(foo 50)
((lambda (f) (f f 50)) (lambda (f x) (if (= x 1) 1 (+ x (f f (- x 1))))))
これをMLやhaskellで定義するとどういう形になる?
あ、多分そのままだと型推論失敗するんだと思うけど 書くとしたらどうなるのかなと
>>766 fが重複していて、なんなのか、よくわからなかったけど
((lambda (like-func-a)
(like-func-a like-func-a 50))
(lambda (like-func-b x)
(if (= x 1)
1
(+ x (like-func-b like-func-b (- x 1))))))
こうすると多少、みやすくなるのかな?
このコードをdefineに置き換えて、できるだけで忠実に書くとどうなるの?
数式処理と数値計算の混合をしたいです haskellとlispのどっちがお勧めでしょうか
>>770 maximaが何で作られているか調べてみ。 そしたら結論でるよ。
haskellに数式処理の簡単に扱えるライブラリがあればそっちのほうが
数式に馴染みやすい扱いができる。
lispで数値計算をするときは、最適化するために、型宣言のことやプロファイラを
あつかってボトルネックを潰して行っくって作業なしでは難しいかも。型宣言や
最適化の工夫はグレアムおじちゃんのANSI common lispをお勧めしとく。on lisp
じゃないよ。
maximaからlispは直接操作も可能だしあなたがやりたいことは実力さえつければ
可能です。
いちおうね。maximaには数値計算が出来るライブラリは幾つかあるから、 速さは保証しないけどね。lispでかかれたかなり癖のあるコードだがlapack まで一応ついてる
両方覚えて用途毎に使い分けるのがオススメだ
>>774 なんでそんなこと知りたいのか知らんけど、
Haskell にベタ移植するとこんな感じじゃね
(\f -> f f 50)(\f x -> if x==1 then 1 else (x+f f (x-1)))
もちろん型推論には失敗する。
cannot construct the infinite type: a = a -> t -> b
ぐぐったらMLとかだと型推論通すにはこれ相当になるみたいです (letrec ((y (lambda (f) (lambda(x) ((f (y f)) x))))) ((y (lambda (f) (lambda (x) (if (= x 1) 1 (+ x (f (- x 1))))))) 50)) =>1275
ところで、↑letrecのyは「lambdaで定義する」という問題からしたら 反則な気がしますが、letrecをlambdaだけで定義できるでしょうか?
当然set!を使わず、かつ型推論が通るような形で。 前者はともかく、後者を満たすのは無理っぽいと考えてます
>>777 > letrecをlambdaだけで定義できるでしょうか?
無理。 set! とかも必要。
R5RSで提案されているletrecの実装方法がset!を使っているだけであって 多変数相互再帰はlambdaだけで書けるからletrecもlambdaだけでできる 過去スレにあったと思う。 もっともMLの型推論を通せるかどうかはしりません。 自分が読んだ本には、型付きラムダ計算ではfixという演算子を導入すると書いてあった。
>>776 で定義している y はまさに fix の一種だよ
ですよね・・ 昔そのfix云々を見てMLの限界を感じたので この程度ならLISPに後付けで型推論つけても同じなんだと 引数が面倒ですが
783 :
765 :2009/04/05(日) 22:17:09
lambdaの使い方の勉強したいだけなんだけど レベル高い話になり過ぎてますよ (like-func-a like-func-a 50)と(like-func-b like-func-b (- x 1))がわからないんですけど (lambda (like-func-a) (like-func-a like-func-a 50))って何よ? 765の問題をlambdaで再帰的に書くには、こう書くみたいに覚えるしかないの?
再帰する時って再帰したい関数に名前をつけなきゃならない。 f 1 = 1 f x = x+f (x-1) main = print $ f 50 fix (ここではyオペレータ) があれば define や let 類が無くても再帰できるぜー y f x = f (y f) x main = print $ y (\f x -> if x==1 then 1 else x+f (x-1)) 50 というのが fix 。
>>783 λ計算でオブジェクトに名前をつける唯一の方法は、引数にすること。
なので、自分自身を引数にするのです。
>>783 >>766 を分解すると
(1) (lambda (f) (f f 50))
(2) (lambda (f x) (if (= x 1) 1 (+ x (f f (- x 1)))))
(1)は引数を1つとる関数で、その引数を「引数を2つ取る関数」
と見なし呼び出す。呼び出す際、引数にそれ自身も渡す。
(1)は一度読んだら役割を終えるので、
(1)の呼び出しは(2)のための初期化に相当する。
(2)は渡された自身を使って再帰ができる。
>>774 が失敗する原因は推論順序に関係するらしいので
((lambda (f) (f ((lambda (x) x) f) 50))
(lambda (f x) (if (= x 1) 1 (+ x (f ((lambda (x) x) f) (- x 1))))))
のような形にすれば通るっぽい
>>786 役割を終えるというのと初期化に相当するというのがよくわからない
>>787 > ((lambda (f) (f ((lambda (x) x) f) 50))
> (lambda (f x) (if (= x 1) 1 (+ x (f ((lambda (x) x) f) (- x 1))))))
ちょっとわかりやすくなったかも
複雑になったとも言えるけど
((lambda (x) (+ x x)) 5) => 10 ;理解できる
((lambda (x) x) "ab") => "ab" ;理解できる
(string? ((lambda (x) x) "ab")) => #t ;理解できる
((lambda (x) x) 5) => 5 ;理解できる
(integer? ((lambda (x) x) 5)) => #t ;理解できる
((lambda x x) 5) => (5)
(list? ((lambda x x) 5)) => #t ;理解できる
((lambda x x x x) 5) => (5)
((lambda (x) x x) 5) => 5
((lambda x 2) 5) => 2 ;理解できる
((lambda) 5) => error
みたいにチマチマlambdaについて理解しようとしているんだけど
理解できるようになるのかなw
>>785 ((lambda (f) (f f)) (lambda (g) (display "called!\n")(g g)))
無限末尾再帰だから評価するには注意が必要だけど、これなら少し分かりやすいかな。
(f f)は、fを引数にしてfを呼び出している。
一番目のfは関数呼び出し、二番目のfはその呼び出しへの引数。
(g g)は、gを引数にしてgを呼び出している。
一番目のgは関数呼び出し、二番目のgはその呼び出しへの引数。
評価してみて、なぜそういう動作をするのか、考えてみて。
(lambda (g) (display "called!\n")(g g)) を無限末尾再帰にするためには、gに何を渡せばよい?
答えは、「(lambda (g) (display "called!\n")(g g)) に、それと同じ (lambda (g) (display "called!\n")(g g)) を渡す」。
単純な答えすぎて騙されているみたいだけど、そうとしか考えられない。
で、その答え「(lambda (g) (display "called!\n")(g g)) に、それと同じ (lambda (g) (display "called!\n")(g g)) を渡す」をやっているのが、(f f)の部分。
790 :
789 :2009/04/06(月) 00:45:24
>推論順序に関係するらしい >騙されているみたいだけど、そうとしか考えられない
>>787 がどうしてもちゃんと通るHaskellのコードが見たいってんなら
let fix f = f (fix f)
let arithProgSum n = fix (\f -> \x -> \y -> \z -> if x == y then z else f x (1 + y) (1 + y + z)) n 0 0
と書けば
arithProgSum 3 == 6, arithProgSum 4 == 10, ...
もうスレチはこれで終わりにしようぜ。ヤレヤレ。
793 :
792 :2009/04/06(月) 07:39:50
よく考えたら let arithProgSum n = fix (\f -> \x -> \y -> if x == 0 then y else f (x - 1) (x + y)) n 0 でいいね。スマソ
SchemeかCommon Lispか勉強してみたいんですが、どちらから入るのがおすすめでしょうか? とりあえずC/C++で書いたGUIプログラムの下請けとして呼び出すリスト処理部分に使いたいと考えていますが、将来的にはGUI部分もSchemeあるいはCommon Lispで書いてみたいです。 自分で考えてみた限りでは、 ・多言語との相性もある程度よいが、必要なものは全部自分で作らないといけないScheme ・最初から最後まで自己完結するCommon Lisp。他の言語の下請けにはなりにくい。 という印象です。 関数型言語を勉強するのにはSchemeがいいけれど、Common Lispじゃないと色々とめんどくさいのかな、という気がします。 そこで本題なんですが、Schemeをあるていど勉強したあとにCommon Lispへ移行(もしくはその逆)するのは、どの程度のハードルがあるのでしょうか。 (defineをdefunに直せば同じソースコードが通るほどに似ているのか、まったく別物だと思って勉強した方がいいのか、というようなことなのですが・・・) 長文失礼しました。
便乗質問として、schme, lispをやるなら、統合環境は、やっぱりemacsなの? 非emcas使いは、どうするのがいいの? それでも(最終的には)emacs?
lushというlispでshを書く方法があるみたいなのですが 使ってる人はけっこういるのでしょうか
>>795 理由もわからずに道具を使いだすと信者化するんで
メモ帳で十分とか、まがりなりにも自分の信念を持ってるほうがいいと思う
>>795 「非emacs使い」なのならなぜ最初にvi(m)のlispモードを考えない?
非emacsならviとか 頭おかしい考え方だと思った
>>799 windowsな人ならそう思うかもな。でも、lispをwindowsでするのは
無駄な労力がかかるから、それもあって798はviが浮んだんだろう。
unix系ならばあながちおかしくはない発想なのです。いちおう
vimならばlispの環境はあるからなぁ。
801 :
795 :2009/04/06(月) 20:27:07
ちなみに非emacs使いという言葉の意味は、反emacs派というわけでもありません
なんら宗教上の理由は、ありませんよw
vimを薦めている方は、なにか宗教上の理由を感じるんですが、違いますか?
Linux上ならemacs一択でいいんでしょうかね?
またWindows上(のcygwinなど)でschme(, lisp)を使うのは、適していないんでしょうか?
>>800 いちおう、存在する程度では、困るんですけど
どっちでも良いよ。早く始めちゃえ。
schmeが気になってしょうがない
eclipseでも出来るよ。
eclipseみたいなロートルPC殺しなんて使う気になれないよ
eclispの間違いでしょ?
>>800 , 801
胸をはって「使っている」といえるほどではありませんが、Windows + Meadow + mzschemeで、とくに支障ないです(.emacsをちょっと書く必要があるけど)。
Linux + emacs + mzschemeと同じ環境、同じコードで書けるし。
改めて読み返してみると799のほうが過剰反応しているように見えてしまった いつの間にやら俺も毒されて
>>801 よくしらんけど、vimって宗教がらみ?clispみたいなの?
>>801 schemeだったら、807もかいているように、mzschemeとかあるからなんとかなる。
windows上のemacsはpath表現ではまることがあるから注意が必要。IDEまであるからね。
Dr.schemeさんは。
common lispでもwindowsで動くものはでてはきてるけど、外部のライブラリを使うとき
に困ることがあるかもしれない。
emacsのほうがあとあと楽だと思うけど、グレアムみたいにviつかいで有名なのもいるから
CUIのみでやる場合は選択としておかしくはないかな。screen+zsh+vimという組み合せは
CUIではかなり強力になるから。windowsならばどうだろうね。cygwinでは同じことはでき
そうだが。ほかはeclisp(笑)というlisperのためのIDE(4/1ではないか。をい!)でも
common lispならばcupsというのがありますね。
801 まで読んだ
812 :
795 :2009/04/06(月) 22:17:27
>>794 さんの質問に(部分的にもでも)答えてあげてください
>>801 有名な方でvi使いの方がいらっしゃるんですね
vimとか、ネタかと思っていました
みなさま、レス、ありがとうございます
勉強の方向性として参考にさせていただきます
とりあえず、パッケージにguileがあったので、試しにこれを触ってみます
>>794 common lispで現状の選択ならばclispやsbcl+ltkを使えば良いよ。一番気楽。
schemeほどの美しさはないけど、気に入ったなら良い選択だ。
lisp方言は似てるから、微妙な違いはあっても片方を学んでおけばなんとかなりますよ。:p
俺も vim で書いてるけど、話を何段も飛ばして一足飛びに宗教認定されててワラタ。 vi は宗教と言うより made with secret alian technology なだけだと思うけどな。 Lispnik なら理解出来なくとも価値観を共有出来ると思ってたが、まぁ良いよ。
俺はemacsとvi(vim)を使ってる。 けどそういうのに慣れてない人には、 jEditとか他の選択肢でもいいんじゃね? シンタックス支援があれば何でもいい。
言語を学ぶのに、いきなり統合環境を聞くのも時代なのかな。 javaでいうEclipseみたいなものは便利だけど、勉強しないと補完されないと完成しないコードを書く癖が付くよ。
まあ使いたい人は使えばいいんじゃないの。
>>816 俺も同じ考えだな
初心者はIDEやデバッガは使わない方がいいと思う
>>794 プラットフォームにもよるんだけどさ
unix系(mac含む)ならemacs+common lisp+slime環境はマジでおすすめ(+HyperSpec)
windowsでならeclipse+CUPSがおすすめ(meadow+commonlispでもいいかもしれんがasdf環境の設置が面倒くさいんだ)
schemeはわからん、slime並に統合された環境ってschemeとペアになってる開発環境に依存しすぎてるら(emacsライクなエディタがscheme自身でかかれてたりする)
最初はviでしこしこかいていたなぁ。年寄ですね。。。
>>819 うんうん。そうおもう。どういですよ。おにぃちゃん。
windowsでというと如何してもcygwinに頼ることもあるかもしれんけど、
あれをやるなら、仮想環境でubuntuでも入れてそこで、emacs + cl +slimeを
やったほうが手間がかからないかな。学習のみじゃなくて、本気でやりたいなら
脱winをおすすめするよ。macならunix系だからwinほど障害がないから問題はない。
どうしてもwinラヴなら、まだ、eclipseにたよったほうがいい。
Macはマイナー言語天国だよね
>>822 いろんな言語が触れるのはunix系の強みだと思う。
まだ、CUIの扱いがunix準拠なら救われるけど、そうじゃない上に弱点だから
windowsではどうしても多様なものがでにくい。その特殊性ゆえに移植が難しい
のが影響してるんだと思うよ。lispだけじゃなくて動的言語の強みが消えやすいし。
>>818 Unixという名の統合環境がないと動かないLisp処理系が結構多いから・・・
practical common lispで説明してるのはslime
826 :
794 :2009/04/07(火) 10:23:07
>>813 ,819,821
ありがとうございます!
Mac OS X上でemacs使っているので、slime+sbclでCommon Lispから入ってみようと思います。
それはそうと、Common Lispにも、SchemeのSICPのような「聖典」的なものはあるのでしょうか?
HyperSpecが相当するのでしょうか?
CLtL2とかも
Practical Common LispのサイトでLisp Box落としてくるのが一番手っとり早い。
設定済みmeadowは?
>>826 うん。ちょっとまえの記憶でもうしわけないけど、銭谷版はslimeも付いてるけど、
古いバージョンで、今のsbclやcmucl、clojure clと組みあわせて使ったときに動作が
ちがうかもしれないので、なるべく、本家で配布しているslimeを使ってやってください
>>829 Lispboxも設定済みmeadow学習用なら問題なしよ。asdfを本格的に使う段階になっ
てくる時から試行錯誤の連続になるかもしれない。
Scheme初心者です。このスレで歓迎される模範的初心者になるには どういう点に注意すればいいのかご教示くだされば幸いです。 よろしくお願いします。
>>826 > Common Lispにも、SchemeのSICPのような「聖典」的なものはあるのでしょうか?
CLtL2とかPAIPあたりがそういう位置づけかな。
>>831 >Individuals and interactions over processes and tools
>Working software over comprehensive documentation
>>826 ,832
SICP が Scheme にとっての聖典ってのは誤解だよ。
Scheme を使ってプログラミングの考え方を解説してるけど、
言語自体の説明はほとんど無いし、
Scheme の最低限の機能しか使ってない。
Scheme のバイブルはTSPLだと思うなぁ。
cltl2はどこかpdfで配布されていたけど、わすれちゃった。 知ってるひとおらんか?
>>834 Jargon filesに"One of the bibles of the LISP/Scheme world."って書いてあるから、
それをうけてるんじゃないのか。別に「誤解」というほどのものでもないだろう。
>>831 割と親切な人も多いから、謙虚に、かつエスパーを要求しなければ、
結構色々教えてくれると思う。
ただ、最終的には、自分で動かないとやってられない言語でもあるので、
そういう覚悟は必要のはず。手厚いサポートとか期待するだけ無駄。
>>842 すごい。リアルタイムでうごくゲームだ。
皆さんご教示ありがとうございます。 人工知能関係はまったく勉強したことがないのでPAIPにはちょっと身構えてしまいますが、 839さんや840さんに紹介していただいたサイトには初心者向けの文書もいくつか載っていたので、 複数見比べながら勉強していくことにします。
ガイ・スティールにもサスマンにも見放されたってこと。かな…?
ヒントをたくさんもらって、いろいろといじくり回して、lambdaについて理解が進んだかもしれない
とりあえず、簡単なものをlambda再帰してみた
;; fibonacii lambda version
((lambda (f) (f f 1 1))
(lambda (g x y)
(if (> x 2147483648)
'()
(cons x (g g y (+ x y))))))
;; fizzbuzz lambda version
(reverse
((lambda (f) (f f 100))
(lambda (g x)
(cond ((= x 0) '())
((= (modulo x 15) 0) (cons "FizzBuzz" (g g (- x 1))))
((= (modulo x 5) 0) (cons "Buzz" (g g (- x 1))))
((= (modulo x 3) 0) (cons "Fizz" (g g (- x 1))))
(else (cons x (g g (- x 1))))))))
でも、
>>776 の(lambda(x) ((f (y f)) x))は未だに理解できていないが
(lambda (x) x)はxを返すのは、わかるんだけど
(lambda (x) (x))は、何を返すの?
引数のない関数を渡せばそれを引数なしで呼び出した結果を返す (define f (lambda () (lambda (x) (+ x 1)))) (((lambda (x) (x)) f) 2) λ式の関数適用ってλx.M Nの形だから (lambda(x) (x))は、理論的にはラムダ式ではないな 間違ってたらつっこみ希望
>>849 頭が回りませんでした
こう書けばよかったんですね
(define f (lambda () ((lambda (x) (+ x 1)) 2)))
((lambda (x) (x)) f)
; (lambda (x) ((x)))だと、こうして渡すとちゃんと受け取ってくれるのか
(define f (lambda () (lambda () ((lambda (x) (+ x 1)) 2))))
((lambda (x) ((x))) f)
> λ式の関数適用ってλx.M Nの形だから
> (lambda(x) (x))は、理論的にはラムダ式ではないな
抽象度が高くて、わからないっす
λ式の関数適用ってλx.M NのN形のの意味がわかりません
x,M,Nは、何の意味は、なんですか?
xは変数(関数も含む?),M,Nは自然数ですか?w
(lambda (x) (x))の扱い方が理解できたので、満足しました
解説、ありがとうございました
>>849 む、いわれてみれば、不思議だ。
そもそも、(f)という無引数の関数評価自体、ラムダ計算的にはどういうことなんだろう?
たぶん、lisp内の関数適用用一般関数applyを入れて(f)は(λx.apply x)fと考える、よって、(lambda(x) (x))は(λx.(λy.apply y)x)⇒(λy.apply y)みたいに考えるべきなのかな。
教えて、エロイ人。
5という値と5を返す無引数の関数は遅延評価ベースの関数型言語的には同値。 だからthunkとthunkの返す値を同一視する。 正格評価のLispやOCamlだとそうはいかないから Lispではthunkという概念を導入し、OCamlでは無引数の関数がない。たぶん あんまり詳しくないんで間違っていたらツッコミ希望。
なんとなく乱暴なような気がするけど具体的に突っ込めない駄目な僕
MIT以外のSick Peeの講義が!
Lispのapplyは (apply 関数 リスト) 引数が0個なら、空リストに関数を適用する。 (apply 関数 '()) つまり長さが0だろうが何だろうがリストが1個必要なことには変わりない。 一方、λ計算の関数適用にも引数が1個必要だがそれはリストでなくても良い。
無引数の関数なんてものはありません。
関数的には ・デフォルトでは簡約されない ・しかし一度簡約すると決めたら簡約できなくなるまで簡約するぞ なんで 無引数の関数みたいに「一段階だけ簡約します」みたいなものがないってことかな というか「簡約の段階」ってのは実装上の問題であって 言語内に持ち合わせていないってほうが近いのかな
ああ、そうか。849は撤回
(f)という表記を
λx.M Nに当てはめるとλx.f ()と考えれば良いわけだ
car/cdr/cons自体はλ式で表現出来るから
()に当たるλ式を適当に一つ決めれば
(lambda (x) (x))は
(lambda (x) (x '()のλ式表現'))とすればよいね
>>850 M,Nもλ式。自然数もλ式で表現する
ラムダ計算でググったらwikiに3行で定義がかいてある
訂正 λx.f () -> λf.f ()
ラクダ計算かぁ。
やばい、おもしろくなってきた
関数適用って(M N)じゃないのかなぁ ;; M N (λx. M N)は(M N)のλ抽象でしょう それとカリー化λ計算は全ての関数は一つの引数を受け取るという前提だから (x) ≡ xであって(x ())では無いと思う
lispは言語の仕様上たまたま0引数の関数定義も許すというだけだからね 副作用も扱うから1以上に強制する意味もないだろうし 何の基盤もないのに無理矢理当てはめようとしてもうまくいかない
(equal? (list) list) #f (equal? (+) +) #f
結局、理論的なものを触るのにlispは向いてないってことですね
Lisp式は拡張されたλ計算とでもいうものであって Lisp式で直接純粋λ計算を扱うのには向いてないだけ リストを扱うのは得意だからλ式の簡約の実装には向いているはず (S式でλ式を表現するのは容易だし)
>>862 (x) ≡ (apply x '())
零の発見みたいだな
nilもそうだが、applyの発見もおもしろい
逆だった 純粋λ計算がLispの式を表現するのに向いてない、かな
かっこを省略したりしなかったりするあれのことを言ってるのか? 確かにあれは構文木というものを教えるのに向いてない気がする
単純に無引数の関数と言う概念がλ計算やHaskell(とたぶんML)にはないから 構文木そのものをλ項として表現しないといけない。 構文木を受け取り、一段階だけ簡約した構文木を返す関数の連鎖みたいなメンドイことになりそう。 そこまでいくとForthを 「全てのワードは1つのスタックを受け取り1つのスタックを返す関数である参照透明な言語」とみなすくらいの労力がいるんじゃなかろうか。
λ式の評価器はLisp系でも関数型系でも、 単純なものは簡単に書けるけど、 (もちろんProlog系や、Perl系のスクリプト言語でも) プリティプリントの実装と、 使う評価方式の仕様策定が意外と面倒だし、 場合によっては複数の評価方式を実装しないと、 簡約具合をいろいろ試すのに実用的にならない。
過度に一般化されたλ計算を学ぶ前に、 Schemeの最小のサブセット的なλ計算もどきをやるのがよさげだな。 そうすれば、Haskellにはうんぬんとか余計なことを考えなくて済む。
>>872 > Schemeの最小のサブセット的なλ計算もどきをやるのがよさげだな。
具体的になんのことを指しているの?
>>873 defineやletrecやset!を封印したScheme
、、Little Schemer?
♪見知らぬ国のtripper
>>873 Yコンビネータなくても再帰定義できるλ式もどきじゃないのかな。
Call by valueの評価器作るのはわりと簡単なんだけど、
それじゃYコンビネータは扱えないし。
λf.(λx.f(λz.xxz))(λx.f(λz.xxz))
>>877 おいおい、一段階だけ簡約、、の話はもう終わりか
お、チューリングさんのほうのやつだね
λ計算は少しかじった程度なのですが、 Yコンビネータなしの再帰ってどんな表現になるのですか?
Y のかわりに λf.(λx.f (x x)) (λx.f (x x)) を使えばおk
それってYそのものじゃない?
Y コンビネータは Y f = f (Y f) というコンビネータ
>>881 自分を参照するには自分を引数にする
という簡単なロジックですよ
Yはその応用例のひとつにすぎない
猥コンビネータ
ロジック トリック
試行錯誤で弄ってたら (define theta (let ((x (lambda (x) (lambda (y) (y (lambda (arg) (((x x) y) arg))))) )) (x x))) こうなったんだけど なーんかλを使った表記と綺麗に対応が取れてないように思える (lambda (arg) ...て部分は一体どこから来るの?
>>889 λ算法は lazy なので、eager な lisp では 評価を遅延するために thunk を作る必要がある。
(lambda (arg) ...) がそれ。
cparen.el lispの達人にはほど遠いけど、括弧だけは見えなくなりました!・∀・ステキ!
>>889 (lambda (arg) ...) で囲むことで、これは procedure ですよという型付けをしていると
解釈することもできるぜ。
、、Schemeで無限ループする問題と、Haskellで型推論失敗する問題は、なんつーか、 同じ問題を違う言葉で言いかえただけなんじゃね?
>>890 eager な型推論では infinite type を遅延するゴニョゴニョ・・・
無限ループっていうか強く型付けされたλ計算は強停止性を持つんじゃなかったっけ?
>>890 なるほどSICP3章あたりであった気がします
要復習ですね
>>892 しかしxやyの型を考えるとさらにわけがわからなくなる気がします
エラーを参考に考えれば簡約していったらyの引数はprocedureじゃないと駄目だから適当に辻褄併せすりゃ
件のprocedureの形になるとかそういう具合の予想はできますが
Hindley-Milner type inference algorithmはsimply typed lambda calculus用のもので、
simply typed lambda calculusはstrongly normalisingで、
strongly normalisingであるのは無限に簡約できる式を含まないから??
適当にwikipediaでType_inferenceで調べた結果の単語を並べたけどよくわからない
>>893 の言う関連性というのはschemeで無限に簡約され続けて無限ループになるものが、
haskellでは型推論の時に検出されてエラーになってるということかな?
>>897 ラムダ式のコンストラクタで遅延、applyで発火とするのは、
処理系の実装上の問題に過ぎない。
たまたまS式を使っているから、Lisp上で同じ型になっているに過ぎない。
元のラムダ算法ではまったく別のもの。
thunkはラムダ算法上のファーストクラスのオブジェクトではない。
結局、型付きλ計算だと強停止性がある→ループが書けない→チューリング完全でないってこと? 型付きλ計算ではfixが型付けできないからファーストクラスの演算子として用意していると解釈していたんだけど
そうです。 その再帰用演算付加の定式化で有名なのが、ゲーテルの体系TとPCFです。 ちなみに情報学板にλ計算スレありますよ。 大学の講義用資料にいいのがたくさん転がってますしね。
>ゲーテルの体系 ゲーテルの不完全性定理?
Feferman!!!
scheme の仕様についての質問ですが(R5RS) 例えば (+ 1 2) を構文解析した場合 + は構文木上どのような項に ぶら下がることになるのでしょうか? BNFを見てる限り <program> <command or definition> <command> <expression> <procedure call> <operator> <expression> <literal> <self-evaluating> <string> <- この下? になるのか? とも思うのですが普通に考えると扱いが特別な予約語 にしか見えないですし、どうなるのが正しいのかと・・ ごく単純な考え違いっぽいですが、教えて頂けましたら幸いです
CLと違ってSchemeはリストを評価する時に たとえば、(A B C)とあった場合 まず式A、式B、式Cをある順番(A, B, CとかC, A, Bとか任意の順番)で評価する。 それからリストの先頭の評価結果(この場合は式Aの結果)を手続き、残りの式の結果を引数とみなして適用する。 (+ 1 2)はまず+と1と2をそれぞれ「ある順番で」評価する。 +は識別子なので、その環境での値が結果となる。 R5RSではトップレベルの+は評価されると足し算手続きになる。 もし (let ((+ cons)) (+ 1 2)) のように+がローカルに束縛されていたら、その値に評価される。 (R5RSの場合は、正確には識別子は値ではなく記憶領域に束縛される) 1と2はself-evaluatingだからそのまま1と2に評価される。
つまり+とか-などの識別子も fooとかxとかyなどの識別子と一緒
>>907 Aがまず評価される
その後Aが手続きであればBとCが任意の順番で評価される
>>907 お返事をありがとうございました。単独の(+ 1 2) の+は
結局、一般の識別子扱いで上の書き方でいくなら
<program>
<command or definition>
<command>
<expression>
<procedure call>
<operator>
<expression>
<variable>
<any <identifier> that is'nt..>
<peculiar identifier> <- この下
1,2は
<procedure call> 上と同じノード
<operand>
<expression>
<literal>
<self-evaluating>
<num> <- この下
になりそうですが、実装としては
「トップレベルの+は評価されると足し算手続きになる」
という内容を、露骨にリストの先頭に識別子を見つけた場合の
処理の一部に明示的に書き込まない限り、単にsyntax 上の判別だけ
では構文木は作れない・・ことを意味しているようにも見えますが・・
もう少しまじめに仕様を見てみます
>>909 書き方がまずかったけど、Aが一番に評価されるとは限らない
Aが構文キーワードか否かの判定がまずされるだけで
もし構文キーワードでなければAとBとCはどの順番で評価されても規格上構わない
識別子は ・構文キーワードに束縛されている(ifとかquoteとか) ・記憶領域に束縛されている(場所の名前ともいう、普通の変数のこと) ・未束縛 に分類される。 リストの先頭が ・識別子かどうか ・識別子なら構文キーワードに束縛されているか という判定が各式の評価に先行して行われる。
重箱の隅だが、 R5RSのformal syntax/semanticsによれば、 ifやquoteは「束縛されて」いるわけでなく、 アプリオリに構文キーワードであり、 直ちに<conditional>や<quotation>を成す事になっている。 具体的には、環境に対してifをlookupする意味関数になってない。 多くの処理系では環境をlookupしているが。
gaucheではオペレータを先に評価してるように見える マクロ環境を扱うならこの順番が自然なのかね
gaucheとかguileみたいに > if #<syntax if> と返すものはオペレータが先 scheme48みたいに > if Error: undefined variable となるものはオペランドが先の傾向にあるかも
guile> if #<primitive-builtin-macro! if> のインタプリタみたいに評価する関数ってなんですか? guile, gauche とも知りたいです できれば、clisp, cmucl, sbcl もw
>>916 evalのこと言ってんの?それとももっと哲学的な問いか?
>それとももっと哲学的な問いか?
>>917 哲学的意味ではないです
evalでいけますね
なんか勘違いしていました
関数型言語を使うと、「哲学的に考えると・・」とか、「メタ的にとらえると・・・」とか、
考えることが多くなるんでしょうかね
手続き型言語を使っていたときは、そこまでつっこんで考えていたいなかったようなあ
人生の中でそういう時期なだけなのかな
皮肉を言われていることに気が付いてないだけ
それらしい言葉を使うと響きがかっこいいだけで、実体のない虚飾だよ。
形而上学的な思考の事かとオモタ
どうでもいいことだが 厨の俺にとって、響きがかっこいい、というのは重要w Befungeとか名前がカコイイ IConとかCatはカワイイ そして、Lolliは潔い
Gaucheもこのスレでおk?
こんなことできるんだね 数式処理には確かに向いてる (setq a 'b) (setq b 'c) (setq c 5.2) (print (eval c));5.2 (print (eval b));5.2 (print (eval ( eval a)));5.2
lispな人はgitかdarcsでhg使ってるの見たことないのだけど 何か理由があるの?
lisp な人は、比較的年齢層高めだから、 hg って入力する時、 H爺を連想して嫌なんだ。
<<927評価中>>
ハードゲイですね わかります
>>926 git は判らんが darcs に関しては common-lisp.net で使えるというのはあるんじゃないか。
shiroさんのλっちゃにワラタw
guile 単独スレとはまた大胆な話だ。
>>925 なんかわかるなぁ
最初のころは??だっが、解ってしまえば、すごく単純なことだった。
>>933 guileを中心に勉強している身としては、うれしいがw
本当に大胆だな
Guileスレを立てた1は、週1で簡単なスクリプトでいいから、投稿してくれ
>>1 を見てニヤリとしてしまった。がんばってほしい
R6RSで使えるslibってありませんか?
作ればあるとかがんばればできるとか そういうのはもううんざりなんだよ
「ない」と親切に教えてくれてるのにおまい
今日の俺の悟り 「この文は偽である」の真偽値を返す述語はYコンビネータだ
そういうのが気になる人はゲーデルの不完全性定理を読みましょう。 集合論を用いて集合論の定義することは不可能です。
>>943 UNKNOWABLEがウンコはbleに見えた
ラッセルのパラドックス
>>942 > 集合論を用いて集合論の定義することは不可能です。
くだらない揚げ足取りしてる暇があるなら ドンブリ5杯問題について考えようぜ
1杯のかけそばをみんなで食す。
> ドンブリ5杯問題 それなあに?(・∀・)
多体問題の一種で、飲食店における5つのドンブリの挙動を計算する問題 与えられた店舗レイアウト、店員、客、設備、コストなどの条件からドンブリの挙動を計算する チェーン店の人員計画に利用される手法
腕が生えてロボットになったり、中身を勝手に食べはじめたりとかそういうことだろ
ドンブリは客に出すだけではなく、まかないとかにも利用されるからね まかないとして多量にごはんを転用した店員には訴訟で対応するといったルールが実在する ドンブリ5杯が目安とされることから俗に>>949のように呼ばれる
暇で死にそうな哲学者が椅子取りゲームのようなものを考案して プレイヤーを戦わせている・・・と聞いたことがある
意味が分かりません。
つまり哲学者が食事をすると
頭悪い奴がスレに住みつくみたいです
>>958 から印尿
入店・退店のオペレーションをひとつのプロジェクトと仮定して簡単に図式化して説明しておく。
http://jibun.atmarkit.co.jp/lskill01/special/pmbok3rd/pmbok_02.gif 立ち上げプロセス群: いわゆる『並び』および『食券の購入』プロセス。
ここでしくじると、他のロティストから入店を拒否されても文句は言えない。
計画プロセス群: 『着席』『硬軟コール』『トッピングコール』プロセス。
この辺は説明しなくても解るだろうと思われるので割愛。
実行プロセス群: 『食す』プロセス群。もちろん『食す』といっても実はそのプロセスはさらに細分化されるのだが、
初心者はとにかく早く食べる事を心がける事。(『撮影』『デュエル』などは上級者がすることです。)
※計画・実行プロセス群がサイクリックになっている理由はあえて説明するまでもないだろうが、
これこそがロットリズムそのものであり、オペレーションの中核である。店と客が一体になってこその「二郎」である。
監視・コントロールプロセス群: 店主、助手、他のロッターによる『マナー監視』『リズム監視』などのプロセス。
規律あるオペレーションに協力しよう。
終結プロセス群: これは簡単。どんぶりをカウンターに上げ、テーブルを拭き、大きな声でご馳走様を言い店を出よう。
ただし・・・万が一残してしまった場合は、ここには書けないような恐ろしい事になるので覚悟しよう。
以上、誰でもわかるようにおおまかにロットプロセスを説明してみた。
もちろん、このサイクルは「入店・退店」のみならず、さまざまなロット概念階層に適用される。
野菜山ひとつ口に運ぶのにもこの図式は適用されるし、
二郎と出会い、そしていつか体を壊すまでもひとつの大きなロットサイクルと捉えることができる。
デュエルやバトルにも、全く異なるプロセスで構成されるロットサイクルが存在する。
最低でも以上の説明を頭に叩き込み、理解し、イメージトレーニングを重ねた上で実戦に臨んでいただきたい。
で、誰がどこで誰のスイッチを押したんだ?
(asdf:oos 'asdf:load-op 'kmrcl) (print (kmrcl:command-output "pwd")) sbclだとちゃんとディレクトリの文字列が返値になる clispだとなにもかえってこない kmrcl:command-output使うと実装依存の外部コマンド実行の違いを吸収してくれるんじゃなかったのか
Armed Bear Common Lisp以外のABCLっていう言語があるんだね 東大の先生が作ったみたい
岩波の「モデルと表現」で使ってたと思う
あることを行うlibraryを探してて2つみつけた 1つめはいろいろ多機能なんだけどdotimesを多様してcとあんまり変わらない書き方 基本になってるクラスもあんまりよくない作りにみえる。しかし最近まで更新されてるし機能も沢山 2つめは、だいぶ前に更新止まってるけど、基本のクラスがよく考えて作ってある感じ。 しかしやる気のなさみたいのも感じられて,それぞれの機能の作りこみが中途半端 自分で書き換えながら使うにはいいと思う この2つのどっちを使うのがいいのだろう
>>966 実際に晒して、議論すればいいだろ
伏せている意味がよくわからん
lispとか、わからん エロい人の降臨を待とう こういう場合は、どのくらい真面目に使いたいのかにも関係してくるのかな
俺なら1と2を使って速い方を使うだけだな。画像処理は速度が命と思うから。
画像のことは気にしないで 改造しやすいコードとしてはどっちが好きですか?
すでに自分の中で結論が出てるのでは・・・
保守性の高い物を選ぶ。
>>975 おつ
規制というよりレス数とリンクが多すぎだね
>>976 半分同意かな
でも、ちょっと乱暴過ぎな気がする
1-3,4レスぐらい(1レス32行の範囲で)使って、うまく誘導してもいいかも
布教したい派はテンプレ案を提案するといいかも
布教したい派がいないんであれば、976さん案でいいと思う
>>975 乙。このスレ、マジでテンプレ貼るの辛いよな。
>>976 同意。テンプレが長すぎるから埋もれるんであって、
シンプルに示してあれば、自然と目も行くと思う。
>>979 みてみたけど、Wikiの編集カテゴリがないね
Wikiもそうだし、スレもそうだけど、LispとSchemeと分けたほうが良くない?
Schemeを中心に勉強している身としてはWikiは見づらいね
せっかくだし、新規の人が多少入りやすいように整えたほうがいいかも
とか、言っちゃうと
>>976 さんの案自体が流れちゃうかな
とりあえず、
>>976 さんの案に賛成か、反対か、意見を聞きたいね
反対意見がないようなら、Part27から
>>976 さんの案採用で
俺はLispとSchemeいっしょでいいと思うけどな
本スレを今更分けてもちかたない テンプレwiki化には賛成。保守する気があるなら 話題に出やすいGaucheみたいな処理系のスレなら分けてもいい
>>982 なんでそこでGaucheだけなの?w
Gaucheも含めてSchemeスレじゃ駄目なの?
今まではLL言語だからってRubyとPythonを同じスレにしているようなもんだよね
「Lispと言ったら、Common Lispのことを指して、Schemeのことは指さない」うんぬんとか、言わないんだね?
そのくらい寛容な人の集まりなら、このままでもいいと思うが
まあ、なんだかんだ言ってスレ内でうまく共存しているんだがなあw
ユーザ少ないくせに、いやむしろ少ないからか、内ゲバに走って分裂すんだよなあ フェミ団体みたい
浅間山荘だけは襲撃しないで下さい
Guileもそろそろ戻ってこいよ。また楽しくやらないか?
Common Lisp と Scheme で分けるに一票 その上で処理系ごとのスレ建てるのは好きにやってくれって事で。
Common Lispは既に分かれている。 現状のままでいいと思う。
>>984 フェミ団体って分裂したの?
kwsk
>>985 連合赤軍が人質をとって、立てこもったのは知っているけど
襲撃って痺れを切らした警察側の話?
浅間山荘に籠城しないで下さい と言うべきだったかな。 単なる冗談です。
※スレタイの「Lisp Scheme」の「Lisp」はCommon Lispを除く と注釈すればいい
新参ですがこのスレにCommon Lispを含まないなんて今はじめて知りました
ああ、実はそうだったんだよ 詳しくは過去ログに
994 :
デフォルトの名無しさん :2009/04/26(日) 00:02:51
次のスレタイは [Lisp族のScheme Part26] でいかがかね?
馬鹿っぽいから却下
996 :
デフォルトの名無しさん :2009/04/26(日) 00:07:25
LisSche Part26
>>993 LISPはたくさんあるのに、
LISP=CommonLISPの略だとするのはおかしい
って意見があって、だったらCommonLISPは専用スレ立てましょう、
みたいな感じでまとまったんだっけ??
それでなぜか「入門」スレが立ってて俺はあるぇ〜?って感じで読んでた。
正直、
S式スレ、もしくはsexpスレってのは?
1000get
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。