前スレであった学会の話だけど 参加費高いのがネックだけど 知り合いか友達がつくれれば結構よい機会になると思うよ 例えば Emacs 好きな人だったら チュートリアルやる Didier Verna さんは XEmacs 開発者だし日本滞在経験があるって 英語が片言でもいざとなったら lisp で話せば通じる なので月曜日の excursion や火曜日の banquet への参加をおすすめする
予稿集だけほしい
目次がS式。
コンティニュエーションって Ctrl-Z食ってお休みしてるプロセスみたいなもの?
そういうこともできるが 要は次に行なうべき計算 何の「次」なのかの説明が必要になるが・・・
ウィキペディアが、なんかgdgdに加筆されてるな
何がどういう順番で実行されるかというのは Schemeに慣れていないと直観的に分かりにくい
引数の渡し方とかね
前スレの2進数と10進数の例え、LispはS式で表現するから16進数だろ。少々慣れればこれほど効率の良いものは無い。
12 :
デフォルトの名無しさん :2012/09/19(水) 23:50:18.15
(a (b (c) (d)) (e)) とかでbcdeに副作用があると副作用がどの順番に起こるか保証されない が、大抵は左から右、右から左のどっちか どっちか決めろよ
じゃあ左で
cdbeやebdcになった程度で混乱するとでも思って? 馬鹿にしないで欲しいわ
ebdcはないわー edcbだった 混乱するじゃないか!
左から右だと可変引数が取れないんだよな
>>15 最適化でdcbeやdcebになるかもしれんぞ
まあ仕様が決まってるならバグだが
継続を使ってむりやり順序を変える方法を模索するのが真のschemer
(format "~S ~S" (read) (read)) がどうなるかは処理系依存なの?
ご存知、ないのですか!?
>>19 その通り。
一旦 let* 等で変数に束縛するか、
よく使うものならそう展開されるようなマクロでくるむべし。
スタックに積む順と評価順が一致してなければならない、という法はない。
そういえば C も引数の評価順は決まってなかったんじゃね? C は最適化の可能性という錦の御旗があるけど、Scheme の場合は理論上の背景がありそう。 単に万人が納得する順序を決められないってことかもしれんけど。 私としては決まってない方が好みだな。 順序がどうでもいい場合はそのまま書けばいいし、 順序に意味がある場合は let* を使えばいい。 引数の評価順を決めてしまうと、その順序に意味があるのか無いのか見た目でわからなくなる。
r6rs では Rationale の 9.1. に評価順を決めない理由が書いてあるね。 1. たぶん読みやすい 2. もしかしたらコンパイラが良いコードを吐いてくれるかも だそうだ。
カリー化があるから、引数の並び順で評価順が決まるのはナンセンス
いくらなんでも違う、真逆だ。
もんだい1まぎゃくとまさかのちがいをSしきでかんけつにのべよ
一般的に λ x y z.M は λ x. λ y. λ z.M の略であるからだ。
ざっと調べたが、
>>25 以外に評価順序を定めなかった元々の理由としては
継続渡しによるプログラミングを前提にしていたからだそうだ。
ちゃんと一次資料調べろよ。
資料名もあげてないのに納得とはすごいな。31pだ。
Schemeにおけるエラー処理の作法みたいのが知りたいんですが 何か参考になるものはありますか?
R6RS には例外処理の仕組が用意されてる。 Java や C++ とよく似てるけど、 例外オブジェクト (R6RS用語ではコンディションオブジェクト) が継承関係だけでなく合成があるのが特徴的。 こういった形で用意されている以上、典型的なエラー処理方式のひとつなんだと思う。 SRFI にも例外処理関連のがいくつかあるからそれらも併せて参考にすればいいんじゃないかな。 でも、 Scheme は規格の序章に書かれている通り、機能を追加することより言語の弱点を取り除くことに主眼がある。 つまり、今回の例で言えば例外処理の機能を提供することよりも例外処理をしたいとプログラマが思ったときにそれを邪魔しないという意味。 プログラマがどういう方法でエラー処理したいと思っても Scheme 的には間違ってない。 多値で返すのだって、継続渡しで分岐するのだってそれらを使い分けるのだって自分でやりやすければいいと思う。
三行で頼む
とりあえず #f を返しとけ。
>>32 多値のないscheme処理系に多値は追加できないし
機能拡張つっても結局schemeの可能な範囲内でってことでしょ
5命令から構文糖作ったりできる程度
弱点取り除くのもいいけどさ、必要なものを持ってない、ってのは普通にダメだと思う 例外とかモジュールとか必須だろ?REPLはまだ仕様にないんだっけ? いまのRNRSは何か中途半端だよ
>>35 R5RS で多値が追加されたのは言語としてそれがないとプログラマが追加できないのがわかってるからだよ。
だから、多値のない処理系を前提として出すのはナンセンス。
>>36 例外は call/cc と dynamic-wind があればその上に構築可能なので、
言語のコアとして必須とは言えないと思う。
モジュールは必要と昔から言われてて、
R6RS でライブラリという名前で実現した。
R5RS から R6RS への改定で REPL が削除されたのは
フェイズというか評価環境をライブラリ単位で決定する R6RS の形式に対してそぐわないからだと思う。
言語全体の仕組との絡みがあるので必要かどうかの段階から議論しなきゃ駄目じゃね。
俺としては REPL は各処理系の裁量で柔軟にやってくれてる R6RS の現状でいいと思ってるけど。
中途半端なのは仕方ない。 Scheme は完成されてないんだ。
言語に完成なんて無いけど Scheme はまだ活発に発展してるんだから
必要だと思うことがあれば声を上げろよ。
R7RS はまだまだこれから。
そういう意見もあるから動作が変わるような構文は使わない方がいい。 FortranやCobolも時代に合わせて機能追加されているけれども、 全然使われてないらしいし、対外的にアピールするためだけの機能と 実際使う機能を区別していくべき。
scheme コミュニティは、決めることを恐れているように見える。例え80点の解でも決めないよりマシだと思うんだが。
違う違う。単に人材が偏っているだけだ。 そういう「個人が決意を新たにすればなんとかなる」なんて信じられないだろ。
>>41 プログラミング言語の機能はそれぞれの機能の連携で動くものだから、
80 点の機能同士を組み合わせたら64点だよ。
組み合わせるほどにぐだぐだになっていく。
CL はいい感じの妥協点を見出してはいるけど Scheme で同じようにやるのは芸がない。
っていうか CL に対する反発みたいな意識はあると思う。
>>41 决めることを怖れているのではない
决めたのに誰も従わず、その決まりの権威がなくなり、いろんな決まりが好き勝手に大量発生することを怖れているのだ
分かるけど、そのせいで、undefinedオブジェクトみたいなアホなモノが定義されるハメになってる。そして結局、独自エラー処理や独自オブジェクトで書かれた scheme プログラムが世に満ちる。 schemeのこだわりは分かってるつもりだし、実現したら格好いい。でも、決めるのがあまりに遅くないか?それも人手不足のしいかもしれないけど。
例外とかヒアドキュメントぐらい定義しとけって感じ 規格オプショナルで SRFIだと実装する気にならね
現実路線なのが欲しいなら CL 使えってことじゃないの。
>>46 例外は R6RS で定義してるだろ。
複数行に渡る文字列も使えるようになってるので
あらためてヒアドキュメントなんてものが必要とは思えないな。
テキストから読み込んで文字列リテラルに展開するマクロとかも書けるし。
>>45 返す値が未定義っていうのは使うなって意味だぞ。
これはまだ決まってないというよりは議論した上で未定義だと決めたものだ。
将来的に覆る可能性は低いと思う。
R○RSなんかに頼らないで 俺Lisp作ったほうがよさそうだな
>>39 > REPL が削除されたのは
> (中略)
> R6RS の形式に対してそぐわないからだと思う。
もっとくやしく。
CL使うとか俺LISP作るとか俺言語作るとか、道は色々あるな。 まずは俺仕様の俺Scheme作って公開してみるのはどうだろう?
schemeって並行プログラミングの類については どういう議論がされてるの?
>>51 R6RS ではプログラム全体が letrec* であるかのように扱われるんだけど、
REPL だと「全体」の入力が終わらない内に一行ごとに評価せねばならないことから
ファイルに記述したプログラムを与えるのと同じようには扱えない。
っていうかよく見たら R5RS でも REPL については無くてもいいことになってるな。
自作処理系がRxRS に沿ってるかどうかチェックするプログラムってあるのでしょうか 自作処理系があるけど、自身を持って公開できない
letrecとletrec*て、どう違うんだっけ???
>>57 束縛する変数の評価順序が保証されているのがstar付きletrec
でなかった?
>>35 >>37 多値のない処理系に多値を追加することは簡単にできるよ。
valuesは1引数以外のときに値をパックして、call-with-valuesがパックされた値を展開する。
受け取る値と返す値が一致してないとパックされたオブジェクトが見えちゃうけれど、
R5RSではわざとそういう場合を処理系依存にして、後付けの実装を許すようにしている。
R5RSで多値が追加されたのは、処理系による最適化を許すためと、コールとリターンの対称性のため。
>>59 追加できるっていってもそれは多値というより分配束縛だろ。
継続に複数の値を渡せるってこととセットで初めて概念的にも多値って言えると思う。
Sussmanが、多値って別に特別なデータ型である必要なくね? とかR7RSの投票の中で言ってた気がする。
>>60 ああ、call/ccも置き換えないとならなかったね。すまぬ。valuesがパックしてくれるとして
(define (call/cc f)
(call/cc-orig (lambda (c) (f (lambda args (c (apply values args)))))))
って感じで。
マクロっていうか、リーダマクロかな。 Schemerにはあまり馴染みのない機能だと思うけど。
リーダーマクロと普通のマクロの違いって何? evalに組み込まれてるマクロ機能か readに組み込まれてるマクロ機能かの違いって事?
>>63 実行時にできるほどんとのことはマクロでも出来るんだよ。
>>64 いや、私が考えてたのはこんな感じのマクロ
(define-syntax file->string-literal
(lambda(stx)
(syntax-case stx ()
((_ filename)
(string? (syntax->datum #'filename))
(call-with-input-file (syntax->datum #'filename) get-string-all)))))
言葉が足りなかったかも。
テキストっていうかテキストファイルってことね。
>>66 それいいな。
でも結局ファイルを読み込むならマクロ展開時でも実行フェイズでも効率に差なくね?
2pass の処理書くときにいいの、か?
バッチコンパイルする処理系ならマクロ展開はコンパイル時に済ませられるから実行時に 読み込みオーバヘッドは無いしファイルそのものさえ無くてもいい。 そのかわり実行時に切り替えることはできないんで、どっちを取るかだが。
Scheme はオワコンなの?
73 :
王大人 :2012/09/26(水) 15:03:40.52
ナウなヤングにバカウケだからな
>>70 大学生が実習で処理系を作れてしまうという枯れた仕様という意味で、オワコン
Schemeの仕様が枯れてるとか意味わからんな。 現在進行形で仕様改訂真っ最中じゃん。
>>70 に反応ないから自分でレスつけたんだろ
予定を繰り上げて
>>78 仕様が枯れている = 大学生でもバグ少なく処理系を実装できる
オワコンだからこそ普及した言語なのに、仕様を複雑にして衰退の道を歩もうとしているのがSchemer
仕様を複雑にというのはちょっと違うと思う。 曖昧になってた部分を埋めたという感じだろ。 R6RS はライブラリを過剰にしてしまったところはあるけど、 基本的な部分はそれほど複雑さが増してるわけじゃない。 R7RS が samll と large を分けたのは R6RS の反省もあってのことだろうし、 そう極端に複雑になることはないよ。
枯れてると大学生でも以下略ってことは、ANSI INCITS 226-1994 (R2004)もそうなのか。 大学生すげえなw
大学生なら実習でscheme処理系作ってユニフィケーションの高速化やってprologの実装までやってくれないと
valuesって型で実装するものだと思ってた
86 :
デフォルトの名無しさん :2012/09/28(金) 05:23:39.86
どんな実装であれvaluesを扱うにはそれ用のフラグがどっかにある つまり型であると見做せる では何故これがファーストクラスではないのかと疑問に思う
関数引数の個数が関数の型の一部であるのと同じ程度には型に関係してるけど。
>>86 フラグって? 多値の個数を判定する仕組みがどこかにあるのは確かだけれど、
その実装はいろいろあるよ。それとも
>>86 は「n引数の関数なんて無い。あれはn個の
要素をもつ1つのタプルを渡してるんだ」っていうタイプ?
91 :
ニート26 :2012/09/29(土) 15:57:17.40
lispのschemeを、やってみたい。 プログラミング初級ですが、できますかね?ニート26歳高卒。
>>91 とりあえず始めてみたら?
始める前に結果知りたがるからニートになるんだよ。
93 :
ニート26 :2012/09/29(土) 17:59:42.14
キーワード引数については作者のブログで「Gauche風の」と書いてあるから直接影響を受けているのは間違いない。 (更に大元は Common Lisp だけど。) Sagittarius は作者自身が業務に使ってるみたいだからね。 実用指向という意味では Gauche と方向性が近いかも。 日常的に使うとなると、筋の良さや整合性よりも、短かく書けたり覚え易かったり、 いざというときのワークアラウンドがある方が大事だったりする場合も有って、 そういう泥臭さを許容する感じが似てると私は思う。 もちろん、筋の悪さに目を瞑りすぎるとカオスになるのでそこらへんの匙加減の上手さが使い勝手を良くしているんだけど、 そういうバランス感覚はセンスというか現場の感覚なのかな。
はちみつ餃子とSCHEME餃子は同一人物? コテの由来も気になる。
全部俺の自演 俺とお前しかいない だとしたら?
昔のログを読み返してたらハンバーグ餃子のときもあった
行動した後に軌道修正するのが一番コストがかかる 行動はありとあらゆる手段で情報を収集した後にするべき
好きにしろ
ニートさんはC言語とかメジャー言語はできるんかな? LISPとかはその後だよ いきなりLISPなんかやり始めたら 基地外ニートに昇格するぞ
LISPが出来ないバカのご意見、たいへんありがとうございますwwwwwww
LISPはCよりも難しいが、継続とマクロを除けば、CよりもSchemeの方が簡単だと思う コンピュータのレジスタとかの構造とコンピュータ言語を知らないバカに何か言語を教えろと言われたら、迷わずSchemeを教える
コンピュータ言語を知らないのがバカというのはものすごくおかしな話だ
俺なら迷わず「面倒くさいから教えねえよ」って言ってしまうだろう。 見上げたものだ。
>>105 Lispしかできない馬鹿にありがちな発想ですな
Cとか経由せずにLISPしかマスターさせない教育課程って哲学科とかだろうか
ハードというのは人間に従わせるものであって、人間がハードに付き合わなければならない云われはない。
>>109 従わせたいのは現実なり問題なりであって、
ハードはそのための道具で味方だろう。
ハードを改良することを「従わせる」と言うならその通り。
でなけりゃ、いまのハードにできる範囲で最善を
尽くすよう「合わせる」もんだ。
たとえば、車やバイクの上手い人はそう言う。
LIPS は双方歩み寄り。 人間はコンピューターに。 コンピューターは人間に。
LISP は、まず理論があってそれに人もハードも歩み寄らせてる感じじゃないかい? で、その理論と現実問題との接点が見えづらい、っていう。
Cのポインタを理解することと現実問題との接点はどこにあるんだ? それを理解することはプログラマにとってのみ現実であって、 プログラムを使う人の現実ではないだろ。 初心者にとってそれをわかれというのも酷な話じゃないか。
> 従わせたいのは現実なり問題なりであって、 それは100%頭おかしい。
自動車バイクに精通していても、道は直せないからな。
お前らそういうLispに直接関係ない抽象的な議論にだけ喰い付くよな。
Lispは今時の言語と比べて非人間的すぎる
だがそれがいい。
()がある以外は他のLL言語と 大差ないと思うが… インデントさえきちんとしてれば ()とかもあんまり気にならん Schemeとかどこにでも実装されるから 覚えるとこれほど武器になりそうな言語ない気がする CommonLisp派だけど
>>117 LISP以上に非人間的な道具「ソロバン」
だが人がソロバンに合わせることで計算力があがってしまう。
非人間的だってのはいけない事かね。
いちいち相手にするとは人間味ありすぎ
にんげんだもの
人工知能研究での結論 ネットの向こうで応答しているのが、人間か機械かは原理的に判別できない
チューリングテストに結論が出たという話は初耳だが
CommonLispは50万だしてアレグロ買えないと 実用にはならないのでは?
それはこまりすぷ
ハッカーの必須言語だというから、どのマシンでも実用になると思ってたのに…
ACLって優れた処理系なのは間違いないけど、そんな神格化されるような存在じゃないだろ。 ネイティブスレッドひとつとっても、まともにサポートされたの、今年に出た9.0からだぞ。 他の処理系の方が得意な分野だってある。
Allegro はかなり丁寧なサポート込みでその値段だって話だからなぁ。 そう考えると業務用としてはそんなに高価ってわけでもないんじゃねーの。
ポール・グレアムのヤフーショップはCLISPじゃなかったっけ。
保守まで面倒みるとなると高い金もらわないとやってられない 柔軟性が高いのが裏目に出てる
業務でなんか使えないし
>>132 ・Webサーバ系ではけっこう使ってる
・大学で開発されたシステムを企業に移植するときに使わざるをえないときがある
・勘違いした会社がライセンス買った場合は当然使う
まともな技術者ひとり雇ったら50万なんてひと月で消える。
50万円が消えるか、会社からまともな技術者が消えるか
JavaScriptをそれなりに書いてるひとならLisp系はわりとすぐに理解できるとおもうんだけどなあ・・・
Lispなんて使う意味がわからん JavaScriptでいいじゃん
よくわからないトラウマを抱えた人にLispは無理
仕事でいざ限られた時間で使う事を考えると LISPは構造が単純なこと以外には特にメリットは見えないな 複雑にしてどうすんだと思う 例えば最低限の処理系が数百~数千行だから 数時間から数日あれば実装できる しかしそういう用途では選択肢の中にGC付き言語はなかったりするが
>>140 前提がよくわかんない。 組込み言語として使うみたいなことを考えてるのかな?
Lisp はピンキリなのでそのあたりがはっきりしないと話が噛み合わなかったりするよ。
racketをemacsに設定できないhelpme まず、ubuntu用の.shってのがよく分からなかったからunix用の.tgzを展開してsite??lisp下においたんだけど、mzscheme.exeが見当たらないしpathの通し方もイマイチわからない
まず環境を書こうか。LinuxなのかWindowsなのか。 あと、パス自体はどんなものか分かってる? 通し方が分からないだけ? ついでにEmacsの使い方は知ってると思っていいの?
お前にLispは無理 IDEの付いたJavaかC#でもやれ
いや、Racketって普通にIDE付いてるから。
>>143 仮に Windows で C:\Program Files\Racket にインストールしたと仮定するよ。
「コントロールパネル」から「システムの詳細設定」を選んで「詳細設定」タブをクリック。
そこに「環境設定」ってボタンがあるから環境変数 path の値に C:\Program Files\Racket を追加。
それから emacs の設定だけど、バージョンによって設定ファイルの場所が違ったりするので設定ファイルの場所は自分で探して。
大抵は .emacs とか dot.emacs とか init.el とかいうファイル名で探せば見付かると思う。
そんでその設定ファイルに↓を追加。
(setq scheme-program-name "racket.exe -i")
emacs に設定するときに絶対パスを指定すれば必ずしもパスを通さなくてもいいんだけど、
空白を含むパスをちゃんと解釈してくれなくておかしなことになるので環境変数をセットしといた方が簡単。
男ならメモ帳だろ…
Typed Racket初めて触ってみた。
http://docs.racket-lang.org/ts-guide/ DrRacket上で固有の情報も確認出来るんだね。すごい。
ClojureでTyped Racketを参考にして実装してみてるものがあるけど、ツール類まで用意するのは大変そうだ。
使い方をぱっと見た感じ、型の指定がQi IIみたいに簡潔に書ければ良さげなんだけど、使い方がちょっと手間かな。
150 :
143 :2012/10/11(木) 09:16:50.35
環境はUbuntu12.04 パス自体がどんなものか、正確にはわからないがその前に とりあえずRacket.exeが見つからない。Ubuntu用の.shファイルの扱いが分からなかったからUnix用の.tgzファイルを展開したのだが
151 :
143 :2012/10/11(木) 09:17:46.28
ちがったMzscheme.exeが見つからない
あらしなのか天然なのかわからないけど、 そのレベルならWindowsでracket使う方がいいと思うよ。
>>150 Unix source って書いてあるやつはソースコードが入ってるだけだから、
その中には実行バイナリは無いよ。 さすがにこれは
>>152 と同意見だわ。
sh が何か、ソースコードが何かくらいはググって調べてね。
>>150 まずその参考にしてるサイトだか本だか知らんが、最初にそれを投げ捨てる。
次に、そのUbuntu用の.shファイルは「Self-extracting shell script」と書いてある通り、
自己展開するシェルスクリプトだから、ターミナルなどからそのまま実行する。
そうすると、色々とメッセージが出てくるからそれを読みながら指示に従う。それだけ。
メッセージは英語なので英語を読む気がないなら諦める。意味が理解できなくても厳しい。
見てるとLinuxにもEmacsにも凄い不慣れな印象を受けるんだけど、
そんな状況で新しい処理系を使おうとしても、ありとあらゆることが意味分かんないと思うよ。
普段Windows使ってるなら最初のうちは素直にWindowsでRacket使えば良いじゃん。
最終的にLinuxでやりたいにしても、Linuxに慣れてから改めてLinuxでRacket使えば良いし、
Emacsもそう。Emacsに慣れたら改めてRacketをEmacsから使えば良いよ。
cKanrenが素晴らしすぎる これあったらcall/ccいらない
>>154 参考にしてるサイトはもうひとつのscheme入門、分からないことは逐一ググってる。scheme学ぶのにscheme手習い→SICPとやろうと思ってるのだけど、どうでしょう?
>>156 その手順で学ぶのは良いと思う。
Racket は統合環境が有って初心者に使い易い選択だと思うし。
158 :
143 :2012/10/11(木) 15:03:47.50
おかげさまで出来ました。thx
子供が小学生になったら豆腐配達システムの仕事を 手伝わせるんだ。言語はもちろんLisp。
自作パーツとかの在庫管理をLISP(scheme)でしたいんだけど 保存するファイル形式はやっぱりS式がいいんでしょうか (データベース (品名1 値段 購入日時 購入場所 在庫の数 使った数 何に使ったか) (品名2 値段 購入日時 購入場所 在庫の数 使った数 何に使ったか) (品名3 値段 購入日時 購入場所 在庫の数 使った数 何に使ったか) ) こうしてくと、値段が変動したりした時に混乱するのですが、 同じ品名でも値段が違ったら分けた方がいいんですかね
あ、何に使ったかが増えていくので (品名 使った日時 使った数 何に使ったか) を別にするとよさそうですね うん
(購入DB (品名1 値段 購入日時 購入場所 購入数) (品名2 値段 購入日時 購入場所 購入数) (品名3 値段 購入日時 購入場所 購入数) ) (消費DB (品名1 使った日時 使った数 用途) (品名2 使った日時 使った数 用途) (品名3 使った日時 使った数 用途) ) これで購入DBから品名で検索して消費DBの使った数から引くと 在庫がいくつあるか判りますね これでいいかな
登録日時とかでソートしたいから、自動で入ってくれるといいな 日付に型なんてないから、32bit値でいいかな? 文字列のがいいかな? 日付と時刻は項目として分ける意味がないから文字列だな "12/10/11 16:49:00" "121011 未明" "今日" "忘れた" とかありえるし あ、使ったのを在庫に戻した場合どうすればいいんだろう? 書き換えるのは論外だから、消費DBに (品名 戻した日時 -戻した数(負数) "戻した") を追加するしかないか
規模が小さいものならS式でいいと思う。 でも、規模が大きくなってデータベース的なことをするならそれに特化して進化してきたシステム (リレーショナルデータベースや key value store) を使う方が効率的。 柔軟性こそ Lisp の本領なので、 今の段階ではそんなこと気にせずとりあえず思い付いたように書いていけばいいんじゃないの。 問題があればそのときに修正できるだけの柔軟性があるのが Lisp ってもんだろ。
>>164 会社で使うならともかく、
個人でデータベースなんか使うと、
存在自体忘れたり、面倒になって使わなくなるので、
なるべく小規模で、どこでも見れるようにテキストベースにしたく、
そうなるとLISPかなーと思いました
取り敢えずデータのスキーマについてのアドバイスが欲しいなら、
ム板よりデータベース関係の板の方が本職が居て良いと思うぞ。
>>160-163 とか思いっきりそういう話だし。
何も考えずにメモ帳に追加していって、後で全文検索 これ最強
Google Drive でスプレッドシート使えばスマホでも見れるよ。
グーグルに個人情報は検索ワード以外もう与えたくないな こわい
SCHEMEのTOY処理系(マクロとか無し)を作ろうとしてるので名前募集。
マクロ・末尾呼び出し最適化・継続を実装してないやつはschemeとは認めない
マクロは IEEE にはなくて R4RS でも付録で示唆してるだけ。 末尾再帰最適化や継続が不完全な実装も多 (特に C や Java とのやり取りが主のもの)。 だから、静的スコープで単一名前空間なら Scheme、でいいんじゃない?
しゅ…しゅみず
>>172 マクロはともかく (まだ議論がぶれているので) として、
末尾再帰最適化や継続は Scheme の顔なので、
それなしで Scheme を名乗るのはちょっと微妙だと思うなぁ。
あえて Scheme を名乗らなくても、
(部分的に Scheme 風の) 新しい Lisp 方言のひとつってことでいいんじゃね。
スクール水着っていうと女子のスクール水着だけを 指しているよね。不思議だ。
男のは海パンとか言ったりするな。 これも不思議だな
そういう名前はpythonだけで十分だろw
180 :
デフォルトの名無しさん :2012/10/19(金) 23:52:10.83
イメージカラーは紺色で決まりだなw
>>170 デキがショボければShameと呼ばれるのは間違いない。
schemale
SCHE
schebe
名前だけの話だけど、scheme 処理系はかっこいい名前多いね。イカロスとかゴーシュとかガンビツトとか。 CLはsbclとかなんか味気ない。
shample
+チック姉さんの親戚で (チック姉さん というのを思いついたので誰か薄い本をはよ
しかし今日は暑いな
女の子のポケットに入るscheme端末(ネット機能は 問わない)を具現化した・具現化しやすい環境って なんだろう。生活の中でケータイの電卓以上のこと がしたいし、計算履歴を残せるとうれしい。入力支 援があるとなお良い。 数年後、タッチパネルにUbuntuを入れられる世の中 になるなら開発せずに待つんだけど。
JVMがワンチップに入るんだから、Scheme処理系も入ると思います
FPGAにlispマシンを実装するのは、どっかで見たな。
末尾最適化がネックなのかな clojure もJVMの都合で末尾最適化を仕様に入れなかったという話だし
λ...
Scheme で書かれたものを github で検索したら何かの演習課題のこたえみたいなのばっかりなんだが、 こういうのを github に上げる奴は見てもらう価値があると思ってやってんの? それとも単なるバックアップ先として使ってるだけ?
何かを公開するとき、「見てもらう」なんて卑屈になる必要はないんだよ。
200 :
191 :2012/11/05(月) 18:14:56.02
gentooのracketパッケージがドキュメントを入れないのは嫌がらせかなにかなのか racketが一番いいのはドキュメントなのに
>>202 そういうことは gentoo スレで言った方がいいんじゃね?
おまいらなら部屋を掃除することを「ガーベージコレクション」って言うよな!
gaucheで(time)の出力結果を文字列として取得したいのですがやり方がわかりません 標準出力にこう出力されるものです ; real 0.000 ; user 0.000 ; sys 0.000 (with-output-to-string (lambda () (time (list 1 2))))のように with-output-to-stringを使うと空文字が返ってきます
>>205 time の結果は標準出力ではなく標準エラー出力に表示することになっているので、
標準エラー出力を捕えないといけない。
こんな感じかな。
(call-with-output-string
(cut with-error-to-port <>
(cut time (list 1 2))))
一貫性を考えると with-error-to-string として括り出した方がいいかも。 (define (with-error-to-string thunk) (call-with-output-string (cut with-error-to-port <> thunk))) (with-error-to-string (lambda()(time (list 1 2))))
文字列じゃなくてかかった時間を数値として取り出したいなら、time-thisというのもある。 マニュアルのgauche.timeのところ見てみ。
>>206-209 ありがとうございます。
標準エラー出力が出力先だということを見落としていたのはまずかったです。
勉強になりました。数値を取得できるのは意外でした。いじってみます。
211 :
デフォルトの名無しさん :2012/12/03(月) 06:56:39.61
gosh> (iota 3 1 0.1) (0.9999999999999999 1.0999999999999999 1.2) これ理解できないのですが 誰かご説明お願いいたします。
結果から憶測すると、最初に1.2を計算しておいてそれから引いてみたいだね。 逆順で作る理由はリスト作るの簡単だからかな。
(define (iota count :optional (start 0) (step 1)) ;srfi-1 (unless (and (integer? count) (>= count 0)) (error "count must be nonnegative integer: " count)) (if (and (exact? start) (exact? step)) ;; we allow inexact integer as 'count', for the consistency of ;; giota and liota in which we can also accept +inf.0 as count. (let1 count (exact count) (do ([c count (- c 1)] [v (+ start (* (- count 1) step)) (- v step)] [r '() (cons v r)]) [(<= c 0) r])) ;; for inexact numbers, we use multiplication to avoid error accumulation. (do ([c count (- c 1)] [r '() (cons (+ start (* (- c 1) step)) r)]) [(<= c 0) r]))) なるほど、確かに。
214 :
デフォルトの名無しさん :2012/12/03(月) 14:31:12.96
2ch$ racket
Welcome to Racket v5.2.1.
> (require srfi/1)
> (iota 3 1 0.1)
'(1 1.1 1.2)
CL-USER> (loop :for i :from 1 :to 1.2 by 0.1 collect i) ;; cl
(1 1.1 1.2)
ベタなネタだけどLISPのメイン処理系(複数可)、サブ処理系、ほとんど使わないけど
入れている処理系のアンケートを年2回(コミット数を維持できるなら数回やっても可)
やらない?
IPバレたくない人もいるだろうからプロキシ機能ありで項目ごとにコメントできて、
CUIで動くプログラムを誰か書いて。忙しい人もいるだろうから以前の投稿内容は維持
されて、投稿期間に実行すればいいだけ。プログラム作成者が恣意的にデータをいじれ
ないように厳密なスキームを作ってプログラミングを書いて欲しい。プロキシ変更
などによる連続投稿はありを前提として規制できるならメールアドレス提供、ID、
パスワード発行等の労力負担程度まで許容して投稿側の便利さを追求して欲しいと思う。
プログラム作成者とサーバ提供者を分離した方がプログラム作成者の敷居は下がるのかな。
参考
ttps://www.archlinux.de/?page=PackageStatistics スルーされそうなので、超亀レスでもいいのでレスください。私はサクッと具現化する
能力はないのでプログラム作成者が現れずにレスの状況によっては私が作ることを検討
しないといけないのかもしれない。
何で処理系のアンケート取る程度で、「ぼくのかんがえるさいきょうのしすてむ」作んなきゃいけないの……。 しかも他人に作らせるつもり満々とかなにそれこわい。
意味がわからない こわい
報酬支払うなら作ってやるよ。
はやってる しょりけい はやってない しょりけい そんなの LISP じたいの マイナーさ かんがえたら ごさ
221 :
デフォルトの名無しさん :2012/12/07(金) 00:30:31.09
syntax/macro/functionみたいな、適用可能な要素一般の呼び方ってなにかあります? applicableとかですかね
map/operator
224 :
デフォルトの名無しさん :2012/12/09(日) 15:21:45.00
gaucheだとApplicable objects(適用可能なオブジェクト)と呼んでるね。
>>222 Lisp 全般はわからないけど Scheme の用語の中には相当する言葉はないと思う。
apply という言葉もマクロには使わないし。 (マクロ展開の実体を use という)
operator もマクロに使う言葉じゃないなぁ。
見た目に同じでもプログラム的な作用としては違うから、どうしてそういう一般化した用語が欲しいのか気になる。
強いて妥当な言葉をひねり出すなら「式の先頭」くらいじゃね?
command/instruction
>>222 CL的にはoperatorでOK。
www.lispworks.com/documentation/lw50/CLHS/Body/26_glo_o.htm
>>226 gaucheならオブジェクトだしCLでもオブジェクトだし。
学習始めたばっかりの初心者の感想だけどSchemeのリストってすごく難しいね '(1 2 3) == '(1 . (2 . (3 . ()))) == (cons 1 (cons 2 (cons 3 '()))) どれがどれのシンタックスシュガーなのかサッパリ分からん
230 :
229 :2012/12/22(土) 14:06:09.07
あと、だいたいのScheme入門には()がリストの終端を表すって書いてあるのに、実際には '(1 . ((). (2 . ()))) これが (1 () 2) こんな感じで通っちゃうし (length '(1 . ((). (2 . ())))) これは 3 になるし、終端判定に()は利用されてないんじゃね? だったら終端に()付ける必要なくね?って思っちゃう
>>230 コンスセルはテキストに載ってないか?
コンスセルを書いて、よく考えて見ろ。理解が早まる。
>>230 そのリストの最後は () で終わってるよ。
235 :
229 :2012/12/22(土) 15:17:11.00
>>230-233 ありがとう。lengthの実装見てなんとなく理解できた。
()が要素にあったらそこを終端と判断する、ってわけじゃなく、cdrの戻り値が()であれば終端と判断する、ってことか
と、理解してからコンスセルの形を見れば一目瞭然だったw
んー、ドット対の利用価値がイマイチ分からんけど(consで説明すりゃいいじゃん……)もう少し読み進めてみます
漏れてた。
>>234 もありがとうございます
名無しに戻ります
>>235 ドット対はコンスセルの外部表現で、cons はコンスセルを生成する手続という違いがある。
文字列で言えば "ab" と (string #\a #\b) の違いと説明すればわかるかな?
consは無視して、car, cdrが使えればいいんじゃないの。 リストで実用的なプログラムをいっぱい書いてから戻って考えた方が 理解が速いんじゃないの。 cons回りにかけた10時間が意味があったのかよくわからん。 SICPはいつ読めばいいのかね?
ドット表記なしに連想リスト書くと、罰ゲームワロタって思って偉大さが分かるよ!
'((key1 . val1) (key2 . val2) ...)
リテラルで書く場合は定数として扱え、それが嫌ならcons使え、ってこと?
確かにリストが分かっていればあんまり困らない、ように思えるかもしれない。でも、ちゃんとコンスセルを理解してないと、マクロを沢山書くようになってから地味にハマる。というかオレはハマった。コンスセルはリストより基本的な構造だよ。だから大事。
>>245 わかっててツケにしているんだからマクロを沢山書くようになってハマってから
ツケが回ったと思ってその時に考えればいいんじゃないの?
その頃にはSchemeの語彙も増えているだろうし、開発環境も整っていて解析も
しやすいでしょ。中学校の連立方程式を振り回して難しい問題を解いている
イメージだ。微分積分で楽な解法があるんじゃないの。
それは一理あるな。 言語の機能は相互に関連して成り立っているので、 簡単な方から難しい方へ学んでいけばいいというわけじゃない。 どうせ行きつ戻りつするのだから、 意義をわからずに学ぶよりは実際につっかえるところまで一旦先に進むのも有りだと思う。
マクロは楽で生産性が高いけど、5年前に自分で作ったマクロ見たらワケわかんねぇ
マクロなんざ展開したら余裕で把握できると思うんだけど、どんな複雑なマクロ書いてんだよ。 え? Series? 僕もさっぱり理解できません。
>>249 読みやすくするために展開するってことは、はじめからマクロにしなけりゃいいんじゃ…
>>250 マジレスすると、macroexpandとそれに類する機能の話。
マクロのデバッグには必須だと思う。知らなかったら便利だから使ってみて。
読みやすくするためではなく、独自に発見したフレームやイデオムをマクロにするから、時間が経つと忘れる 結果、似た構造を持つマクロが大量生産される 定期的にマクロだけあつめてリファクタリングしたい
ハッカーがLISPを使うと聞いてLISPの勉強をはじめました そもそもハッカーはどこでどういうふうにLISPを使っているのでしょうか
あなたが過去にした質問とその答を読み返してみてはどうでしょう
悟りを開くために修行するなら、SchemeとかHaskellとかがいいんでね? Common Lispは実用向けの泥玉だしな。
ロボット同士で壊しあいをした場合、生き残った最強のマシーンの頭脳にはLISPが使われている
>>259 空想みたいな話にしているけど、少ない予算で殺し合いってできるでしょ。
コンピュータ囲碁の世界はまだまだプロに足元も及ばない実力と言われている
からそれで言語競争するのも良いかもね。言語の機能にもよるけど対局中プロ
グラミングの内容を書き換えても良い。プロの世界は通常1日かけてやるから、
プログラマのゲーム参加で精神余裕を持たせるためにもそのくらいの時間の
物差しでやらせられる環境になると良いかも。
チェス、将棋、囲碁の世界は計算スピードが物言う世界でC一択なのか。
あとはルールがシンプルな新しいボードゲームを考えて、n日後に大会開催。
ゲーム中のプログラミングの内容の書き換えはありで戦わせるとか。
将棋等のボードゲームだと各局面での意思決定の賢さよりも読みをとにかく深く広くしたほうが勝利に繋がるみたい。
(現時点では実際にそうなっているというだけでしっかりとした理論的な裏付けがあるわけではない。)
何をどうすりゃいいのかわからない状況での試行錯誤がし易いのが LISP の強みなので
>>260 の条件なら LISP は強いかもね。
大会中にエラーでゲーム中断は1回だけはありでm分後に再開しないといけないと条件を付け 加えるとして。 Cプログラマの人口が一番多いのにCプログラマのエントリーがゼロでしたというのは自分の 主観が入り過ぎているのかな。 人間同士のトーナメント方式だと強くても敗退することが多いから甲子園の1試合で敗退が 決まる方式は実際の強さの優劣を表すわけではないみたいだね。人間だから精神面や体調の 問題が起因していると考えられる。時間的な制約もあるからいくつかの改良トーナメント方 式で敗者復活を取り入れてるみたい。 あと2人ゲームなら先手・後手、複数人ゲームなら回ってくる順番で有利不利があるならそれも 工夫しないといけない。 それを踏まえて、言語同士だとシンプルなトーナメント方式の結果で文句が上がってこない のか、改良トーナメント方式で大会ゲーム数をある程度抑えても文句が言えないのか。 2人ゲームだと先手・後手と2回やる必要があるケースもありそうだし、そのケースだと勝敗が 決まらなければもう1ゲームやることになってどっちが有利な先手後手を持つかって話になって、 疑義が取れない。色々と考慮すると大会ゲーム数が肥大化していく。 新しいゲームのルールの方で大会ゲーム数を抑える仕組みにすればいいんだろうけど、それが 描けるのか、自身では想像つかないなあ。ゲーム選定者は大変だな。 それこそゲームの有利不利を解析するのはプロトタイプの進化をさせやすいLISPが有利だね。 新しいゲームで殺し合うという話になっても、ゲームのプラットフォームを考える人も骨を 折らないといけないんだよなあ。 はは。こういう締めになるとは思わなかった。
言いたいことまとめてから書けよ。
同意。長すぎて読みづらい。整理して。
>>264 「試合自体が難しいんじゃね? 色々あるし。」
>>260 > チェス、将棋、囲碁の世界は計算スピードが物言う世界でC一択なのか。
言語は何でもいい, 強力な盤面評価技法を持った奴が勝ち
盤面評価技法次第で刈り取れる枝の数が大幅に増減する
それでも, 計算量は必要だけど
ニューラルネットで人間の脳細胞を完全再現すれば言語いらないと思う
つ、釣られんぞ・・・
ファミコン程度でいいから、50万年の間は絶対に壊れない演算システムがあれば人間には勝てる 人間はあと10万年で絶滅するから
>>266 >強力な盤面評価技法
それほしいですねえ。いや、自分のために。
二桁級からなかなか腕があがらないんだ、今日もウッテガエシを食らってしまったorz
そりゃダメ詰まりへの注意が甘いだけでは……
検索ではない必勝法アルゴリズムが開発されたりして
数百万台のpcをインターネットで繋いで分割演算、は有りだろうか?
計算量の指数的増加の前に、容易く敗北する。
276 :
デフォルトの名無しさん :2013/01/03(木) 09:41:42.04
twitter.com/mnzktw/status/286401275103428609 「どの言語つかってるの?」「Haskellです」「わー!すごーい!」「OCamlです」「わー!すごーい!」 「Agdaです」「わー!すごーい!」 「Lispしてます」「あ…そっち系…」 _人人人人人人人_ > あ…そっち系…<  ̄Y^Y^Y^Y^Y^Y^Y
レベル1 Lispわかんない レベル2 レベル1を馬鹿にする レベル3 レベル2を馬鹿にする :
再帰ですか。
ICOTがPrologに浮気したせいで…
暫くD言語を使ってたけど、CLに復帰しました。 replサイコー。replのない言語は滅ぶべし。
そのへんが滅ぶと連鎖的にこっちも滅ぶんでやめてください
どっかでみたschemeはリスト処理言語であって関数型言語ではないってツイートが ずっと自分の中にあったもやもやを解消した気がする 当たり前かもしれないことをわすれてただけなんだけどさ
リスト(データ)と関数の区別がないのがScheme
sceme は関数型言語じゃないのは当然だと思ってた。 でも、リスト処理言語にしては () の扱いがダサいよ。
scheme ってどうして () と #f を区別するようになったんだっけ? nil や t というシンボルがダサいから変えたかった、というのはわかるけど…。 (car ()) や (cdr ()) が () 返してくれてもいいのになぁ。
そりゃ型が違うからでしょ
#fは分かる ()も分かる しかし、nil や null は本当に必要だったのだろうか?
関数型があって関数を変数に代入(束縛)できれば関数型言語だと聞いた つまりコールバックがあるCも関数型言語
理論的な整合性より利便性を重視するならCommon Lispの世界に来れば良いよ。
ややこしい構文を確認することが少ない分だけschemeの方が使い易くて便利です lispはライブラリとexeファイルが欲しいときしか使わなくなってしまった
実用性を求めてCommon Lisp使ってるけど、処理系依存の部分をいちいち確認したり、 ライブラリを求めてClikiを漁っていると、Gauche使ったほうが楽な気がしてしょうがにあ。
実用性を求めるならLispなんて使うなよ
>>292 そりゃGaucheはその分のコストを開発者が払ってるわけだし。
R7RS以降はSchemeもCommon Lispと同じ道に突き進むことになると思う。
Common Lispでの#+や#-の代わりにcond-expand使うだけで。
CLikiやQuicklispに相当する物もそのうち誰かが作るんだろう。
>>289 C がプリミティブに扱えるのは関数じゃなくて関数ポインタ。
C++ ならなんとか関数型に数えられるかもしれない。
Common Lispは激しく実用重視だとおもうけどなー。 あれこれ突っ込みすぎでとっ散らかっている部分もあるけど。
コンパイル時レイトレーシングとか C++やってる連中は頭がおかしい
コンパイル時の処理でCommon Lispに勝てる言語って地球上に存在するの?
>>296 そのとっ散らかってるのがかなりマイナスだと思うなぁ。
Common Lisp ってモジュール化の仕組みはある (規格が曖昧っぽいけど)
のに標準ライブラリがさっぱり整理されてないし命名規則も一貫してないしでわけわかんね。
>>299 まぁ、歴史的経緯ってやつだしね。
Common Lisp自体が先行するメジャーだった処理系で堆積した地層を
インタリーブして再度重ね直したようなもんだしな。
そもそも言語と環境がごった煮状態当たり前な、古代文明の遺跡なわけで、
プログラミングもライブラリを組み合わせてどうこうというよりも、Lisp環境自体を
対象に特化した問題解決器に仕立て上げていくという感じだしねぇ。
モジュールについては、あの死んでくれ状態な生のpackageからASDF -> ASDF2 -> QuickLispと
層が厚くなるにしたがって便利度はUPしてるし、生暖かく見守るべし。
まぁ、4~5人くらいの少人数でゴリゴリと問題をやっつける道具としては、
かなり便利に使ってるけど、もっと大規模な開発とかで使う気にはなかなかなれないかな。
そういや、ちゃんと規格化しようって頑張ったISLISPって影薄いね。
ANSI Common Lispにモジュール化の仕組みがあるという風潮。 requireとprovideはdeprecatedです。本当にありがとうございました。 推奨しない機能を使って整理できるわけねー。 命名規則については、assqとかassvとかそのまま採用しちゃってる上、 結局carとcdrで過去を引きずってるSchemeが人の事言えるんですかね。
>>301 確かに意味的には first と rest の方がいいと思う。
でも、 caadar みたいなのはどうするのって話になって一貫性も同時に議論する必要がでてしまうんじゃない?
別名を用意するのは Scheme 的じゃない気がするし。
Schemer が本気で議論しはじめたらかなり面倒臭いことになりそう。
そういや、 call-with-current-continuation だけは call/cc って別名があるね。
この場合は単に短縮した名前なので忌避感は感じないな。
R5RS では「call/cc という名前を使う人もいる」という微妙な書き方になってて R6RS で明確に規定されたんだけど、
どういう議論があったんだろう。
モダーンなCLをもう一回作り直すべきだよ。scheme は何か変な方向に行ってるからあまり期待できない。
そうして歴史は繰り返される。おもしろいからいいけど。
>>302 最小主義的な思想を持ってるんだから、caadarとか規格に要らんと思うけど。
caadarとかを利用するのはあまり良くないとも言われてるし、そんな使う?
Andrew Wrightのmatchとか使って構造化代入すれば良いじゃない。
別名としてのcall/ccもそうだけど、入れるにしてもR7RS largeちゃうんかと。
R5RS以降はユーザが自分で実装すればいいと思う もうscheme処理系くらい1人ずつ持つ時代だと思う
つまり……Gaucheってことだな
>>306 廃止なら廃止で、ライブラリの移動なら移動で議論が起こるよ。
どうするにしたってどこかで議論が起きてどうせまとまんないんだって。
いつものこと。
R5RSでR7RS処理系を実装すれば全部解決するんじゃね?
>>309 つまり、そういうしがらみに縛られてるのはSchemeも似たようなもんなわけで、
あんま堂々とCommon Lispについて言える立場じゃないんじゃないの、ってこと。
その上で敢えて口にするならそれこそ
>>304 でしょ。
個人的には多少古い設計だとは思うけど、そんなdisられる程とも思えんよ。
一部のSchemerって印象とかで適当にCommon Lisp批判し過ぎじゃない?
「データとプログラムに区別がない」という視点から見れば、schemeこそが真のlispである
r6rsで、納得できる仕様をまとめられないからREPLは仕様から外しました、ってのはびっくりした。 妥協でも不完全でも、とにかく決めなきゃ駄目だよ。
>>312 schemeってプログラムを読み込むのがREADじゃないからダメだとか言われてなかったっけ
schemeマクロは*仕様的だけ見たら*LISPフォームの操作じゃねーじゃねーかってやつ
あれ変わったのか
>>313 Common Lisp は処理系ごと起動しっぱなしで対話的に開発するのが基本スタイルだけど、
R6RS の場合は C みたいなスタイルを前提にしていると思う。
仮に C に REPL を入れるとしたら無理筋だってのはわかるだろ。
そのスタイルが良いか悪いかというのは置くとして、
大元になる想定が違うものに無理矢理ねじこんでも歪になるだけだよ。
REPL のある R6RS 処理系はフェイズの方を有耶無耶にしてるけど、仕様として決めるなら、
R6RS 風のフェイズの概念か REPL のどちらかを捨てる、あるいは2種類のモードに分けるかってことになる。
モードを分けるのは巨大化の前兆でよろしくない。
REPL を外すのは仕方ない面もあるんじゃないかな。
個人的には Haskell (ghci) 風にすれば辻褄の合うように出来そうな気がしてるけど。
>>314 R5RS ではプログラムがS式であるとは明記されてなかったけど、 R6RS では変わったよ。
>>315 >R6RS の場合は C みたいなスタイルを前提にしていると思う。
え、対話的な開発スタイルの長所は全部捨てちゃうの?それはそれで道だとは思うけど、ホントにそれでいいのかなぁ。
>>317 仕様で決めないっていうのは有ってはいけないってわけじゃない。
つーか大抵の R6RS 処理系に REPL 有るし。
厳密に決めようとしたらまとまんないから処理系の裁量で柔軟に対処しとけってことだよ。
R6RSなんて始まってもいない規格どうでもいい
>>299 > そのとっ散らかってるのがかなりマイナスだと思うなぁ。
> Common Lisp ってモジュール化の仕組みはある (規格が曖昧っぽいけど)
> のに標準ライブラリがさっぱり整理されてないし命名規則も一貫してないしでわけわかんね。
実際の所、C系とか、Python系とかと比べてとっ散らかり度はどうなの?
CLはLISPのとっ散らかりはずっと言われてきただろうから、多少他の言語よりマシなのかと
推測しているんだけど。言語で腕試しのためにその言語の処理系を作る文化なんて他の言語に
ないでしょ。
モダンな言語しか知らない若者は、CLのあの関数群を標準ライブラリだと思っちゃってもしょうがないかな。 あれらは言語の一部であって、決してライブラリじゃないんだが。 ああ懐かしき(行番号必須だったころの)BASIC。あれもコマンドも関数もいっぱいあったねー。
>>320 ANSIで定義されている関数やマクロのすべてが組み込みってだけ。
common-lispっていう名前空間にフラットに収録されてる。
R5RS Schemeと似たような事情だと思えば間違ってないと思う。
処理系独自のライブラリとかはちゃんと別の名前空間に入ってる。
323 :
191 :2013/01/11(金) 17:14:03.54
>>321 > モダンな言語しか知らない若者は、CLのあの関数群を標準ライブラリだと思っちゃってもしょうがないかな。
標準ライブラリ、実質標準ライブラリって具体的に何?
>>323 だからさ「標準ライブラリ」とか「実質標準ライブラリ」なんてもんは無いんだよ。
CLtL2とかANSIで定義されている関数、特殊フォームとかは、すべからず「言語の一部」
として定義されてる。つまりCとかで言えば予約語に割り当てられてる機能とか、
型とか演算子とかと同じあつかいなわけ。
例えば printf はCでは言語外にある標準ライブラリが提供する機能だが、formatは
CLの言語の一部として定義されてるという具合。だからCLは「巨大な言語」って言われる。
Unix/C的な、小さな仕様+標準ライブラリとか、単機能のお互いに独立した道具を組み合わせて
あれこれやるという考え方とか文化が主流になる前は、こういう何でもかんでも「全体の一部」
として組み込んじゃうキッチンシンク的なやり方は不思議でもなんでもなかった。
今となっては、単に歴史の話だ。だが、CLにおいてはライブラリだモジュールだと
言ったところで、ひとたびloadすると、それは言語の一部として取り込まれちまうという
感覚を持っておくのは決して無意味なことじゃないと思うがな。
"We are the CL, You will be assimilated, Resistance is futile." ってとこだ。
Lispマシンでプログラミングしてた時代の考えをまだ引きずっているのか…
まぁ、そういうこった。
予約語や演算子は文法要素だから違うだろ CLの関数は文法に関与しないのでライブラリに近い
>>318 >仕様で決めないっていうのは有ってはいけないってわけじゃない。
じゃあscheme仕様は何のために作ってるの?
仕様が定まらなきゃユーザは実用的にはREPL使えないじゃん。処理系毎のREPLの動作調べてね、じゃ、おれにはschemeのREPLは使うべきではない、と言われてるようにしか思えないよ。
話を豚来ってすまんがeqv?で真偽値や文字が特別扱いされてるのはなんで?
>>331 それは実装の事情と関係がある。
一般的な Scheme の実装ではオブジェクトはヒープに割当てて変数にはオブジェクトへのポインタを入れるようになってる。
eqv? は変数同士、つまりはポインタ同士の比較をするんだけど、
真偽値や文字にといった小さいオブジェクトに限ってはヒープに割当てずに変数に直接入れることが出来るので、
そのまま比較すると同値性が比較できてしまうってことになる。
一方の equal? は変数が指す先にあるオブジェクトも見て判定するわけだね。
実装面から説明しなけりゃならない仕様って格好悪い気もする。
>>332 ちょっと違うな。ポインタ同士の比較はeq?だ。仕様には明記してないけど。
eqv?は数値の比較にも使えるが、数値は直接値であるとは限らない(非整数な有理数や
非実数な複素数はだいたいの処理系でヒープに置くだろう)。
仕様のココロとしてはeqv?はimmutableなオブジェクトの同値性、equal?はmutableな
オブジェクトの同一性ってのに近いんだけど、Schemeは伝統的にmutabilityについて
ちゃんと考えてこなかったせいでそう仕様に書けない。
やはり時代はRacket
仕様を叩き台にして実験するっていう思想に一番合致してるのは Racket かもしれない。
eqv?の使い所謎過ぎ
337 :
デフォルトの名無しさん :2013/01/12(土) 19:46:08.36
SCHEME餃子とはちみつ餃子は同じ人なの?
他スレで見たけど、和田本にschemeでscheme処理系の作る方法が書いてあるってさ 学部演習レベルで作れるらしいから、仕様が気にいらなかったら、自分で作ればいいと思う
>>338 ここでの不満は仕様への不満であって処理系への不満じゃないと思うぞ。
「この機能が標準 (仕様) 化されればいいのに」であって「この機能が使える処理系がない」ってことでは無い。
>>332 なるほど。 タグビットってそういう意味だったのか。
前にソース見て意味不明だったんだけどそう思ってあらためて読んだら理解できた。
日本語でおk
>>342 配布処理系は標準仕様に準拠させてるんだから、「仕様に不満がある=この機能が使える処理系がない」
(まさか、どの標準仕様もカバーしてない処理系を推薦したり、どの処理系もカバーしてない仕様を議論してるなんて馬鹿はいないよね)
>>346 ここでの Scheme に対する不満は REPL が外されたことを始めとして「足りない」とか「曖昧」とかいったものが多いように見受けられたので、
処理系の拡張まで含めてであれば満足できるものだと思うという回答をしたつもり。
>>297 500行ぐらいのプログラムの型推論を真面目にやると2分ぐらい計算にかかる。
ついでに静的に計算できるの全部やってしまっても計算時間あまりかわらない
最速のscheme処理系ってどれ?
stalin
stalin は高速だが整数が int のサイズだし、桁溢れの検出もしてくれないので、数値計算向けという割には使い勝手が良くはない。 余計なことをしないというのも速度に寄与しているから、それが悪いとも言えないんだけどさ。 必要なチェックを入れたり自分でチューニングする前提でなら stalin は良い選択かもしれない。 chicken も似たようなものではあるけど、ライブラリ次第で手抜きもチューニングも出来るので、 速度にこだわってそこそこ楽に使える妥当な落とし所だと思う。 mosh は gmp を使っているので巨大整数の計算は速い。 node.js 風の非同期 I/O の導入で I/O の効率化を図ってるのも興味深い。 Ypsilon はマルチコアの性能を引き出せるように並列化のための仕組みを取入れて高速化してたりもする。 動作速度と一言で言っても色んな意味の速度があるので「これが最速」とひとつを挙げるのは無理だよ。
352 :
デフォルトの名無しさん :2013/01/15(火) 10:21:29.57
速度が必要ならSchemeなんて使うなよ
353 :
デフォルトの名無しさん :2013/01/15(火) 12:32:19.66
www.larcenists.org/benchmarksGenuineR6Linux.html mosh速いね
>>351 巨人が作ったArcでも旧racketを使われているし、racketの論評はどんな感じですか?
>>353 いくつか数値なしのところがあると思ったら、エラーで動かないんだね。
速度を調べるなら、schemeマシンでやってくれないと…
同じ言語の別実装で性能が異なるのって、何が原因なんだろ
>>358 ひとつの仕様を実装するのにいくつも方法があって、それぞれ長所と短所があって、
何をしたいかによって選択が変わってくるんだから、性能が違う方が自然じゃない?
>>358 処理系の開発に投入された手間、それとトレードオフの割り切り。
先述の stalin を例にとってみよう。
グローバルなフロー解析で高度な最適化を
するのは手間をかけてその機能を作ったから出来たのであって、
それをしていない処理系よりはそりゃ速くなる。
高度な最適化のためにコンパイル時間がやたらと長くなってるけど、
双方を秤にかけて最適化の方に針を振ると割り切っている。
前者については開発にかかわる人 (才能) が多くなれば解決するけど、
後者については犠牲にせざるを得ない部分が出てくるので、
それぞれの処理系の設計思想でどこに焦点をあててるかってことになる。
速度のために対話的な開発は無視するっていうのもひとつの設計思想だし、
逆に速度を犠牲にしてでも親切なエラーチェックしまくるのもひとつの考え方で、
どちらがいいというものじゃない。
他の条件が同じなら処理速度は速いに越したことはないがそううまい話もないわけで。
>>352 速度が必要な処理の大部分は数値計算
数値計算プログラムは数式処理から生成できる
数式処理に一番向いてるのはLisp
>>361 Lispで基本動作確認して、LispソースをCソースに変換・コンパイルというのを
続けたお蔭で、Cのバッドノウハウを忘れてしまった(^^;
そういえばshiroさんのC In S-Expressionってどうなったの?
自分で処理系を作ろうとしてるところなのですが コンパイラの一般論が勉強できる教科書でお勧めをお教えいただけないでしょうか λリフティングとかの用語を理解したいのです
ラムダリフティングとかについてならThe Implementation of Functional Programming Languages
>>365 scheme処理系なら和田本マジオススメ
遅延ストリームや非決定性ambの実装まで載ってる
質問です common lispのテキストPAIPのscheme実装(22章)を読んでいたら 「schemeの大半のミューテータは、set!のように末尾が「!」である」(日本語版p.711)と書いてあるのですが このミューテータとはどういう意味なのでしょうか?
変化させる演算子 代入など
イミュータブルなもの JavaのStringなど 初期化したら変更できない ミュータブルなもの 普通の変数とかC++のstringとか
よく話題に出る和田本というのはSICPの翻訳本のことでしょうか?
>>353 にあるlarcenistsってベンチマークみると高速だけど
誰か使ってみた人いますか?
Larceny速いけどGaucheやRacketみたいな至れり尽くせりだと思ってるとがっかりするよ。 ついでに言えばここ一年くらい絶賛開発停滞中だ。
主要な R6RS 処理系が implicit phasing を採用しているけど、larceny はちゃんと run と expand を区別してくれるので
複雑なマクロを書いたときに確認のために larceny で動かしたりしてる。
ただ、メタレベル2以上やマイナスの場合を expand として指定しても動いちゃったりするのでそれほど厳密なわけでもない。
まぁ、そういう細かなところは置くとしても、
>>374 の言うように、普段使いにするには使い勝手が悪いかなと思えるのは確か。
define-struct define-class は処理系で挙動が異なるけど define-record-type は大部分の処理系で挙動が同じってことでいいの?
>>377 いいえ。
srfi-9 と srfi-57 と srfi-99 と R6RS でそれぞれ異なる定義がされています。
R6RS 処理系を使う分には R6RS の define-record-type を安心して使えますが、
そうでない場合はどれを採用しているかわかりません。
SRFI を無視しても規格準拠を名乗れるの?
SICPの発音ってSICK PEEなんだってな。 血尿かなんかか(笑)
>>379 約50ページのschemeの仕様書R5RSの中ではSRFIは必須ではない
はちみつさんはブログとか書いてないの?
>>380 そのネタは Part31 で既出だぁー。
>>332 だとすると、R5RSにある型で即値に出来るのは
「真偽値」「文字」「空リスト」「小さい数値」
の4つってことか。
>>384 即値って元々はアセンブリ言語で「オペコードのすぐ後にくる値 (定数)」という意味だから、
「ポインタを経由する必要がない値」という意味で使うのに違和感があるんだけど、
Scheme (LISP) 的には一般的なの? 単に
>>384 が勘違いしてるだけ?
Javaの、プリミティブ型の値、という意味で使う奴がいたり、 あとRubyでも使われてたりするんだが、あまり普通じゃないと思う。
そうなの?
>>384 じゃないけど、
良くimmediate valueみたいな表現されてるから、
日本語だと即値って訳されるもんだと俺も勝手に思ってた。
The Scheme Programming Language, 4th Edition
> Simple atomic values, such as small integers, characters, booleans, and the
> empty list, are typically represented as immediate values
こんなノリで。
非参照値?
値型/参照型?
TaPL の邦訳にワクテカしすぎて間違えた。 「The Scheme Programming Language で」 に読み替えて下ちい。
一応他の例も挙げとくと、Lisp Advent Calendar 2012の7日目とか、 SBCLのdoc/internals/objects-in-memory.texinfoとかでも登場する。 ある程度認知されてる表現ではあるんじゃないか。
394 :
デフォルトの名無しさん :2013/01/19(土) 22:53:45.01
リテラル?
即値って、1ワードに収まるかどうかじゃないの? アセンブラでもlispでも同じ意味だと思うけど。
違う。即値はイミディエイトの訳。 アセンブラ(というか機械語)で、命令語中に埋め込まれたデータのこと。
Immediate value なんて、直接(~でき、~され)る値って意味で、 具体的な意味は文脈に依存するだろ LISPならcarもしくはcdrに直接格納できる値って意味で使われるだろうし、 機械語ならマシンコード中に直接格納される値って意味
>>397 だから専門用語は文脈に依存しちゃ駄目なんだって。
クロージャーみたいに依存しちゃった専門用語もあるけどなw
>>398 だからImmediate valueは専門用語じゃないだろうと言ってる
そうか。
そうだったのか。
Android 端末を持ってないから知らん。 (Virtual Box とかでも動くかもしれないけど、動作環境を用意するのは面倒。) 誰かレポートよろ。
LispマシンみたいなLisp携帯作ってください
自分で作れよ
>>409 んなわけない www
あんな超人と比べないで欲しいッス。
全然芸風が違うと思う
まずは見当違いの方向でと反応させてから、次第に絞り込んでいくのは特定厨の常套手段。
はちみつ氏にそんなに興味ないけど 話変わるけど、渋谷lispどうなったかな
今日が月一開催予定のミートアップ初回だったか。 cl,scheme,clojure順々にやるってみたいだけど
Racketなんだけど (vector-member '(5 6) #(1 '(5 6) 4)) ;=>#f (vector-member '(5 6) #(1 (5 6) 4)) ;=>1 なんか納得いかない
gosh> (eq? '(5 6) '(5 6)) #f gosh> (eqv? '(5 6) '(5 6)) #f gosh> (equal? '(5 6) '(5 6)) #t
>>415 #((quote hoge)) => #('hoge)
Scheme48 が久々のバージョンアップ。
Common Lispのloopマクロに相当するものが Racketではforなんだね しかしSUBSEQに相当するものが見当たらない forで作れるからないのだろうか
俺俺LISPは大量にあるけど俺俺SCHEMEはあまり無い気がする。
lispとschemeの違いってなんですか?
オレオレlispの間を埋めるのがscheme。
黒板で殴り合うのがScheme 泥団子を投げ合うのがCommon Lisp 両方つかってキャットファイトがLisp
>>420 Lisp には明確な定義がないから Lisp っぽければそれは Lisp で、「俺俺」な Lisp が存在できるけど、
Scheme は規格で決まってるものだからその実装は (拡張等で個性はあるにせよ) Scheme 処理系のひとつなわけで、
「俺俺」を付ける余地がない。
それは置くとしても Lisp ⊃ Scheme ということになってるので、
Lisp より Scheme の方が少ないのは当然っちゃ当然な話。
オレオレLisp は平和でいいじゃないか。オレオレCommon Lisp が沢山ある世界はヤバい。
> クォートとエバル クォートとは置いとくとして、最近エバったことはないな 関数読んできてコンパイルすることは結構あるが
>>426 Cltl満たしてればいいんじゃね?
満たしてないとCommonじゃないわー
scheme48って何が48?
製作に要した時間。
R7RSってまだファイナルにならないの?
OSが30日で出来るらしいから48日もあればSCHEME処理系くらい出来るのか
R7RSが出たらR6RSは死ぬの?
そんなこと言ってるとr6rs擁護派のはちみつさんに叩かれるぞ。
R7RSはすこぶる評判が悪い気がする。
R5RSは小さい、R6RSは実用/大きい、みたいなイメージあったけどR7RSはどんな感じ?
不必要というイメージ
一つにまとまらない時点で 標準なんて言えたもんじゃないよね
R12cRS でクラウド対応するはず
>>441 Schemeの仕様はもう十分、お腹いっぱい
Schemeの仕様を議論する暇があったら、SRFI実装のバグをなくして統一APIを拡充すべき
何度も書いているような気がするけど、 ライブラリ (モジュール化) の仕組みを変えるのは無いわー。 ライブラリの中身はいくらでも議論すればいいと思うけど、 土台を変えるのはいかん。
>>343 さっぱりわからん。
どうしてポインタと即値の区別が付けられるのか。
だからポインタとか整数の前(あるいは後)にビットが付くんだって。 32ビットマシンなら、メモリやレジスタが36ビットだったりするわけ。
ちょっと訂正。 R6RS の fixnum は 24 ビット「以上」ってことになってる。
>>447 > Gauche の場合はヒープオブジェクトは常に4バイト境界に配置することになっている
それだとオブジェクトの間にスキマが空いてメモリがもったいなくね
タグを使うためだけにそれだけ無駄にしてんの?
>>447 てことは、下位2bitが0の数値はポインタorただの数値かわからないってことでOK?
>>450 即値を格納するときは2bit左シフトして、タグのビットを立てるんだろ
>>450 その場合はポインタで確定。
数値として使う場合は2ビット分を右シフトして使うの。
だから fixnum としては30ビットの幅しかない。
ところで30ビットって少ないようだけど、
実際の利用の95%程度はカバーできるという実験結果がある。
http://people.csail.mit.edu/jaffer/CNS/DIMPA > 95% of the integers are less than 30.bits
このグラフの数値は利用状況によって大きく変わり得るにしても、
大きい値より小さい値の方が頻出する傾向はまず変わらないと思う。
>>449 いまどき、特殊な用途とかでも無い限り、4バイト境界配置の隙間を気にする奴なんていない
こういうのってmatchマクロで実装するのでしょうか (f '(a (b c)) '(1 (2 3))) => '( (a . 1) (b . 2) (c . 3))
>>449 別途タグ用の領域を設けるとしたらその分だけメモリを消費しちゃうわけだし、どっちもどっちだろう。
値の大きさを32ビットに抑えればレジスタに乗るから速度的にも有利な可能性が高いし。
それと、オブジェクトの配置が境界に合ってた方がメモリアクセス速度も速い。
半端なところへのアクセスはCPUの内部的に二回に分けてアクセスすることになると聞いたことがある。
ただ、キャッシュに乗ってしまえば速度的なペナルティはなくなるとか、
色々と複雑な構造になってるらしいんで、性能的な面でどれが有利かは実際にやってみないとわからん。
既存の処理系がだいたい似たようなものってことは少なくとも実用上問題にならない程度なんだろ。
>>454 Scheme で?
match も使えるのかもしれんが、結局は場合分けしながらリストを辿るだけなのでこんな感じかな。
(define (f lst1 lst2)
(let ((result '()))
(let loop ((lst1 lst1)
(lst2 lst2))
(cond ((null? lst1) (if (null? lst2) result (error "unmatch.")))
((pair? lst1)
(if (pair? (car lst1))
(loop (car lst1) (car lst2))
(begin
(set! result (cons (cons (car lst1) (car lst2)) result))
(loop (cdr lst1) (cdr lst2)))))
(else
(set! result (cons (cons lst1 lst2) result)))))
(reverse result)))
>>447 逆に上位ビットがゼロの場合に fixnum ってことにして、ポインタの場合に左シフトするって方針は有り?
>>458 それでも構わないけど、プロセッサによっては上位タグ数bitをマスクする方がインストラクションが
増えることがあるんじゃない? 即値で#x7を持つのと#xe000000000000000を持つのじゃ前者の方が
短いことが多いでしょう。
fixnumとポインタしか無ければ、最上位の1ビットだけで区別できるから、レジスタ自身とandとって
サインフラグを見て分岐するって手があるけど。でもfixnumと分かった時に符号拡張するのめんどいな。
いや、上位ビットが0であることをOSは保証してないんだから、ダメでしょ。 (MSBなら0というOSもあるかもしれないけど。) 64ビットならともかく32ビットはアドレス空間一杯なので上位ビットつぶすのは不利。 古文書によると大昔の68000とかCPUは上位8ビットがデコードされてなくて、 自由につかえたそこをタグに使った実装が多かったらしいけど。
>>458 直接インデックス, アドレスできなくなるので却下.
インデックスアドレスは 12bit相対までとか, 16bit相対までといった制限
のある CPU がほとんどなので, tag を上位に持って行くと, ポインタに
アクセスするたびにシフトが発生するため効率が悪くなる.
sbcl なんかだと, 以下のようになっててだな
http://sbcl-internals.cliki.net/tag%20bit cons cellをアクセスするときは list-pointer が使われて (Rx -3) で
car, (Rx +1) で cdr をアクセスする仕組みだったと思う(32bit機.)
SPARC にいたっては, 下位 2bit を無視して演算する, TAG 演算命令を
持ってるしね.
そろそろビット関係の話は抽象化して仕様から隠してほしいです
tagged-pointer 理解するときは、 consp とか numberp とかのプリミティブを 実装することを考えるといいよ。 1ワードのデータを受けとって、cons か number か判断できなくちゃいけない。 で、既に出てるけど、メモリ上には常にalignされていることを利用して、 下位2ビットを別の目的に利用する訳だ。 個人的にはこんなこと思いつく人は賢くて尊敬する。
Lispマシンと互換できないような仕様は表に出さないでほしかったり
>>458 fixnum の速度に特化するならそういう方針も駄目とは言えないけど、常識的には遅くなると思う。
GC ライブラリを使う場合はその都合に合わせなきゃ駄目だしなぁ。
このスレは年寄ばっかだな
処理系にそういう工夫があるのはわかった。 処理系のユーザー側として性能のよいプログラムを書く重点ポイントとかある?
>>467 典型的で素直な再帰、末尾再帰を中心にしてプログラムを書くとコンパイラが最適化
しやすいと思う。
末尾呼出の最適化は規格で決まってることだから要するに積極的に活用しろってことだよね。 処理系を実装する側も出現頻度の高い (典型的である) パターンから重点的に最適化する。 処理系のユーザーがよかれと思って小細工してもそのパターンから外れて逆効果ってのはよくあることなので、 細かいところは気にせず普通な書き方で書いた方がいい。 あとは GC の発生頻度を低くするのが定石かな。 一端確保したオブジェクトを使い回すとかして。 GC は割と重い処理なんだよ。 但し、「GC の発生頻度を低く」ばかりを意識していると「典型的なパターン」からずれてしまうこともあるので、 そのあたりのバランスは様子を見ながら。
ナイーブな GC はメモリが足りなくなったときに発動して、 それでも足りなければ領域を伸ばすという方法を取る。 (どの程度伸ばすのが良いかは諸説ある。) 最初にガッっとメモリを使ってあとはそれほどでもない というプログラムは効率が悪いかもしれない。 それも GC の設計によるので一概には言えないけど。 いずれにせよ、まずは処理系のクセを把握することが必要。
そこまで気にして作る物って何があるの? 大抵の物は末尾再帰じゃなくても十分だと思うけど
miniKanrenとOn Lispのbindなんとかマクロ群が同じなことに気がついてしまった 車輪の再発明だったのか
>>471 他言語だけど、携帯のプログラムの受注でGCとメモリ管理の職人芸が必要になった
schemeでスマホか携帯のアプリを作ってる人がいるのだろうか
>>471 「大抵の物」がどういう範囲を見てるのか気になる。まっすぐ並んでるデータをナイーブに
再帰すると深さはO(n)だろ。非末尾再帰だとn=10^5~10^6くらいで大抵の処理系は何らかの
壁に当たらないか? (クラッシュしないまでも、スタックGCが頻発して性能ががくんと落ちるとか)。
Clojureみたいに遅延シーケンスでの再帰なら別だが。
>>469 話題をぶった切ってすまんが、最適化するのは末尾再帰じゃなくて末尾呼出なのか?
「呼び出し」は「再帰」を含むよ
>>477 いや、それはわかるんだが、規格でそこまで求めてるのかってこと。
「適切に末尾再帰せよ」と要求していて、その後の「アクティブな末尾呼出の回数に制限がないなら適切に末尾再帰している」で適切な末尾再帰とは何かを定義している。 よって末尾呼出の回数を無制限にせよというのが実質的な要求だと俺は理解してるけど、それでいいよな? っていうか、実装者の気持になって考えると、末尾再帰の場合だけ最適化っつー方が難しいだろ。 変数は破壊的に更新 (set!) されることもあるんだからある呼び出しが再帰かどうかなんてコンパイル時に判断できない。 末尾文脈での呼出しのときにリターンアドレスをプッシュしないっていうだけの簡単なことを無駄に複雑にする必要はない。
>>479 俺もそう理解している。
名称を "properly tail-recursive" としながら
その実 "tail call" についての要求しかしてないのが混乱の元だと思う。
> っていうか、実装者の気持になって考えると、末尾再帰の場合だけ最適化っつー方が難しいだろ。
r6rs では大分マシになったよね。
export された識別子の束縛は変更不能だし、
export されてない識別子ならコンパイル時に判定可能だし、
REPL もなくなったし。
色々文句はあるだろうけど。
末尾コンテキストにあるものは必ずジャンプになる、という実装を必ずしも要求してないんじゃないか、ってことね。
CONS Should Not CONS Its Arguments, Part II: Cheney on the MTA
http://www.pipeline.com/~hbaker1/CheneyMTA.html にも We thus achieve the spirit, if not the letter, of ANSI Scheme's tail-recursion law. なんて一節がある。
define-structやdefine-classをdefine-record-typeに統一するなら C++みたいにスタックやキュー等のコンテナを標準ライブラリにいれて欲しい
>>480 だよなぁ。
R6RS のライブラリの分量が多くなってるのはともかくとして、
方針としては処理系を作り易い方向に振ってるよな。
レコードも筋が悪いと言われつつも実装が楽な方に流れちゃったし。
仕様を書き換えるなら、そのままの形で論文に引用しても文句言われないような書き方にしてほしいです
>>190 だいぶ古い話かもしれんがVAIO Pは女の子のジーパンのポケットに
入ることが売りだったよ。
お前は何を言っておるのだ
100% scheme on scheme の処理系ってあるでしょうか scheme -> C のトランスレータを作ってるので、上手くいけば smalltalk みたいな自己完結する環境できるかもしれないので
>>484 だよなぁ。
R6RS のライブラリの分量が多くなってるのはともかくとして、
方針としては処理系を作り易い方向に振ってるよな。
レコードも筋が悪いと言われつつも実装が楽な方に流れちゃったし! (# ゚Д゚) ムッキー
( `Д´)フォオオオオオオオオオ!
>>489 ちがうちがう。
もっとくやしくおながいします。
だよなぁ。 R6RS のライブラリの分量が多くなってるのはともかくとして、 方針としては処理系を作り易い方向に振ってるよな。 レコードも筋が悪いと言われつつも実装が楽な方に流れちゃったし!!! (ノ#`Д´)ノ⌒┻━┻ ヽ(`(`(`(`ヽ(`Д´)ノ ファ・フォァ・フワォオオオオオオオオオオオン!!
処理系を作りやすい方に振ったにしては既存の処理系開発者にはR6RS反対派も多いと聞く。
末尾再帰はともかく、それを満たしつつ多値って、 スタック1本で実装しようとすると難しいと思うんだけど schemeだと多値(というか戻り値)専用のスタックを別に用意するしかない?
R6RS は処理系を作り易いというよりも、静的解析しやすいと言った方が良かったかな。
結果的にコンパイラが最適化の工夫をする余地が大きくなっている。 (コンパイル時にわかる情報が多い。)
例えば
>>480 でも指摘されているように、破壊されない変数が多くて、しかも破壊されない変数がどれか判定できるならば、
実行時の関数呼出しの際に変数をいちいち見なくてもコンパイル時に定数を埋込むようにできる。
メモリアクセスがひとつ省略されるわけだから当然速度は上がる。
R6RS の仕様ならば実行途中でしょーもない unbound variable なんてエラーで止まるなんてこともない。
(そういうエラーは理屈の上ではコンパイル時に発見できるので。 とは言え処理系によっては実行時まで発見されないようなものもあるけど。)
一方で、 Lisp は「動的」「柔軟」なところが利点だと考えている人もいて、静的な方向に力を入れるのは Lisp 的じゃないという反発はある。
この記事でそういう事情に触れている。
http://blog.practical-scheme.net/shiro/20121227b-lisp-hare-tortoise > Schemeの最近の仕様は静的側に寄っていて、
> 往年のなんでもいじれるLispが好きな 人々には不評なんだけど、
> コンパイラ作者にとってはそれなりに納得のゆく選択であることが多い。
evalとの確執
仕様がそちらへ向かうというのは、schemeに対しては効率面の需要が多いということなのかな?
速いにこしたことないじゃん だったら動的型なんてやめろって思うけど
みんなは継続理解できて使えてる? 俺は理解できてるつもりだけどcall/ccがいまいち分からん contが沸いて出てきてなにがなんだか
call/cc で常に1引数の関数を渡すだけでOKというのが理解できるかどうかが鍵かと…
R6RSはJVMの上で動く言語としては実装できないという衝撃的な現実
>>501 なぜ? 効率考えなければできるんじゃない?
効率について指定されてんじゃないの? しらんけど
tail callがどうしても不可だからって話じゃないの<<clojureとか
ホスト環境のスタックを使うと末尾呼出最適化できないという問題はあるけど、 スタックを扱うクラスを自前で作れば大丈夫だよ。 効率は悪いけど不可能というわけじゃない。
>>496-497 速度の需要はあるよ。 Scheme に限らず他の Lisp でもね。
ただ、 Scheme のアプローチの仕方が伝統的な Lisp とは違うという話。
CL では、逆アセンブラやプロファイラや型宣言といった
「道具」を用意してプログラマに頑張ってもらうという方向で
速度の需要を満たしてるわけだが、
Scheme の場合はそんなダサいことやってないで
コンパイラで最適化を頑張ろうぜっていう方向という違い。
頑張っているのか分からない程度の最適化だよね
Stalin並の最適化をするモダンなScheme実装が求められる
ゴルバチョフって名前は、まだ勝手に使ったら怒られそうだなw
いつプー様の名前のSchemeが出るか楽しみだなw
>>495 eval もよくわかんないんだよな。 eval に渡せるのは datum value ってことになってるけど、
いっそ返却値も datum value に制限してしまえばもう少し作り易くて使い易いものになったと思うんだよ。
実行中のプログラムと eval の中の環境が混ざらないように出来るから。
Google Chrome の JavaScript で別プロセスとパイプで通信するときはシリアライズ可能な値しか送れないことになってるじゃん?
あんな感じ。
それと environment もゼロ引数を許すのは何の意味があるのかわからん。
>>511 なってるじゃん? とか言われても。
知らんがな。
>>511 大学の演習で scheme on scheme を作るのに必要な仕様だから我慢してもらわないと…
lispのコードをそのままコピペできない言語をlisp系と呼ぶのはやめてほしいです
lispのコードをそのままコピペできるなら、それはlisp系でなくlispだろう。
shenはカリー化とパターンマッチがちょっと面白かったけどそれだけだった
lispのコードをそのままコピペできない言語をlisp系と称してわざわざ開発するということは、lispのどこかに失敗点があるということだろうか…
論文にあるやつ
lisp系は関数定義がdefunだったりdefuncだったり、コピーしただけじゃ動かない程度の 非互換は日常茶飯事。
Ypsilonで(car'(1 2))がエラーになるのですがバグでしょうか。
Haskellでも末尾がクォートの名前はよく使うな。 schemeの最近の習慣じゃ頭に%を付けるみたいだが。
>>519 大学の演習でつくったlispプログラムのソースコードの断片
>>524 どちらもユーザに直接触ってほしくないという点では同じかもしれないけど、Haskellなんかのクオートが補助的な関数であることを表してるのに対して、Lisp系の%は内部的な定義であることを表してて意味が違うと思う。
528 :
349 :2013/02/03(日) 11:04:04.24
で、最速の処理系がどれか結論出た?
>>470 再配置しないタイプのGCはそういう状況で効率悪そうだ
餃子の一番のお勧め処理系はどれ?
用途によるんだっての。 処理系のトレードオフと用途のトレードオフがマッチするやつを選べよ。 俺が最も使ってる処理系ってことなら Gauche だな。 R6RS が好きな俺だけど、 R5RS 処理系である Gauche をメインで使っている理由は日本語のドキュメントが有るという一点。 (もちろん他にも Gauche の素晴しいところはあるが。) だって英語あんまりわからんし。 好きな処理系ってことなら最近は Sagittarius かなぁ。 なんとなくバグが多いような気がしてたんだけど、 修正の経過を積極的にブログに書いてあるからそう錯覚してただけなんじゃないかと思って、ちゃんと見たら結構良かった。 日常的に使いそうなライブラリがひと通り入ってて、これまで Gauche で書いてたものも簡単に移植できそう。 リリースサイクルが定期的、しかも一月ごとという短いサイクルなのも、どんどん改良されている感じがして良い。
携帯用の処理系作れ
> だって英語あんまりわからんし。 RnRSも日本語訳されなきゃ読めないの? 全然だめじゃん
クオートは個人的にはすごくヤです、null並に。
BiwaSchemeでCodecademyのようなプログラミング学習サイトを作れるかな
define-record-typeが任意の新しい型を生成できるせいで 型推論作ろうとすると、かなりめんどくさくないか?
本質的にはベクターの各要素を名前で扱えるようにしただけだよ ただのコンテナ
syntax-case はクソ。 意味不明すぎ。
iPod touchでも動くかな?
Lispが嫌いって人って食わず嫌いだと思うのだけど、Lispスレ住人の意見ってどんな感じ? ;;;過去ログで同じ問答あったらポインタ希望
>>544 食わず嫌いは多分にあると思う。 でも、それを助長するような事情
もあると思うんだよな。 例えば、入門の題材がすぐに日常で使える
ものでない場合が多いような気がするし、実際に Lisp で書かれて
いる物の総量も (相対的に) 少ない。 つまり、食わず嫌いってのは
食う機会、触れる機会が少ないという背景が有って起こるってこと。
ただ、 Python やら Perl やらの状況を見るとクロージャや高階関
数といった程度の概念は当たり前のものとして普及してるみたいな
んで、 Lisp に入門するハードルは下がってるかもしれない。 逆に
Lisp から去っていく機会も増えているかもしれないけどね。
それはそれとして、 Lisp をよく知った上で嫌いになる理由も無く
はない。 shiro さんが Lisp についてまとめたこれを見て欲しい。
http://practical-scheme.net/wiliki/wiliki.cgi?Lisp%3a%E3%82%88%E3%81%8F%E3%81%82%E3%82%8B%E6%AD%A3%E8%A7%A3 Lisp の利点を挙げていて、それらの利点によって Lisp は「自由」
であるというのが結論なんだけど、自由であるってのは欠点でもあ
るんだよね。 統制が取りにくいのでチーム開発に向いてないとかいっ
た問題はよく指摘されている。
餃子は長文好きだな
CourseraとかUdacityとかEdX見てると もうみんなPythonなんだよな Lispなんて誰も使ってない
Commmon Lispのdefmethod に相当するものってschemeにはないの?
schemeを先に習うと、lispが汚く見える
Scheme手洗い
GaucheのCLOSはもどきだったのか…
そもそもCLじゃない。
schemeってせっかく仕様があるのに、 見てると主義主張が別れすぎてて選び辛くない? しかも標準じゃ物足りない分処理系ごとの拡張が多くて CommonLisp以上に汚れて見える
それがむしろLisp的というか。 Common LispはLispのそういうところをなくしましょうということで、 巨大な仕様を作ったわけだから。
LISPは仕様があるからポータブルです! というのは一種の冗談だよな
CommonLispはCL-USERの名前空間に関数がんがん突っ込んであるから巨大って言われるけど 他言語のモジュールも含めて比較してやれば小さいほうなんじゃないの?
実際に数えて比較してから言ってくれ
>>556 拡張部分はschemeではない
schemeとはあくまでもRxRSだけだ
ゆえにschemeの拡張部分が汚いという主張は、バカ学生が作ったコードが汚い、と同レベルの主張でしかない
>>556 同意。巨大で不格好なCLより、
美しいハズの scheme の方が独自機能で汚くみえるときがある。皮肉だ。
>>561 煽りじゃなく素朴な疑問なんだが、rnrs だけで現実的なプログラム書けるのか?
>>563 既存ライブラリを再発明せずに、という意味なら現実的ではない。
Schemeに限らないけどな。
Scheme には色々と足りてない。 Scheme の仕様は議論の土台となるべく、ある程度の合意が取れた部分だけを固めたもの。 つまり、 Scheme の仕様は言語のあるべき姿の一部に過ぎなくて、 しかもその一部は「ある程度の合意がとれるくらいには充分に出来の良い部分」なわけ。 綺麗に出来たところだけを抜きだして綺麗だって主張も馬鹿馬鹿しいと思うよ。 結局、 Scheme の綺麗さっていうのは汚い部分を未定義にしてるだけなので、実用のためには汚い部分を補う必要がある。 (将来的にはそれも綺麗な形に整理されることは有り得るけれど。) Scheme の仕様は拡張を前提としているところがあるので、主要な拡張を議論の題材にするのは有りだと思う。
>>560 python とか ruby とか java とか haskell とかだと,
言語をインストールした時点で含まれているライブラリの API 数は
「なにこれ? へそが茶沸かすじゃん > CLの仕様」
ってくらい数あるよな?
Ruby の規格ってことなら JIS のはかなり小さいけどな。 最新仕様と言えるのは RubySpec なのかなぁ? 「仕様」って何よってところから思想の違いがあるような気がするので、 公平な比較ってかなり難しくない?
仕様を最小限満たすインタプリタなどを作っているときのデバッグでは、仕様に無いオペレーターが欲しくなる。
「言語の使用」と「実装の仕様」があって、「言語の仕様」は美しいけどさほど実用的でははなく、 「実装の仕様」は実用的かもしれないけど別に美しくないし互換性も時々ない、とかいうのは、 論理的にはいいんだろうけど、なんだ、その、めんどくさい どの言語でも大なり小なりそういうのあるけどさぁ……
面倒臭いなら実装=仕様な言語を使えばいいじゃない 俺はごめんだけどな
gaucheのdefine-method racketのdefine/public 統一してほしいなあ
言語仕様そのものの部分と拡張部分やAPIは完璧に分離すべき 理由は、コーディングの際に明確に両者を分離できないと、論文で「schemeで…」と書くと嘘になってしまうから
Common Lispの仕様が大きいってのは制定当時の話。
RnRSの範囲だけでSRFIが実装できるならSRFIは完全分離できるのに 実際は処理系毎にSRFIの実装を強いられてるのはなぜか
>>575 そもそもRnRSの範囲だけでSRFIは実装できない
RxRSで実装できない部分はいったい何と呼べばいいのだろうか
処理系で拡張する時のガイドラインのようなもの?
>>573 EuLispは真面目にやろうとていたのにね。
>>573 だからモジュール化の仕組みが重要視されていた。
R6RS でようやくライブラリという名前で制定されて、import を除く全ての語彙は何らかのライブラリに属すようになった。
ライブラリシステムはライブラリ同士が干渉や衝突を起こさないように (避けられるように) 慎重にが設計されている。
これを土台にして様々な拡張をくっつけられるようになってるわけ。
なのに R7RS ではライブラリの仕組を変更しようとしてるから、
ライブラリの中身はともかく土台の部分を変えるのはなんだかなーという感じがしてる。
>>576 え、これマジなの?
マジだとしたらいくらなんでもヒドすぎないか?仕様がおかしいか、SRFIがおかしいか、どっちかだろ
>>581 srfi-49をrnrsの範囲で実装してみろよオラ
>>582 >srfi-49をrnrsの範囲で実装してみろよオラ
いや実装してみろよ、と言われても困るんだが…
もしRNRSでそれが実装できないのなら、そんなものがSRFIに入ってるのは何かおかしくないか?、と言うのがおれの主張だよ。
>>583 srfi-49は特に顕著だから挙げたけど、srfiの中にはリーダーの拡張とか仕様を越えた変更を加えるものも少なくないよ
そもそもsrfiは単なるライブラリじゃなくて、その名の通り実装に対する拡張なんだし、それの何がおかしいのか全くわからん
srfiには仕様の実験場みたいな意義もあるよ。srfiで新しい仕様を試してみて、 うまくいったらrnrsに取り込もう、っていうような。単なるライブラリとは違う。 どっちかというと、RFCが出る→みんなで実装→生き残ったやつがSTD、っていう流れに 近いんじゃないか。
ただその仕様への取り込みは基本的に行われない。 コミュニティ的にもそれで特に困ってないし。 Javascript並みに開発者増えたら、裾野が広がったら、今のままでは困るだろうけど。 コミュニティが小さく人的リソースが少ないのだからこんなもんだ。 やるべきだと思う人はMLで議論始めればいいじゃね? 俺は今のままでいいや。 そんな感じの小さいコミュニティ。
そのまま取込まれたわけじゃないけど、 R6RS の文字列ポートや syntax-case は SRFI を元にしてるかなぁ。 r6rs-rationale に SRFI との関係が書いてあるよ。
そもそも言語仕様の役割は処理系ごとの独自仕様の差異を減らすことだと思うんだがな
>>588 仕様の役割については色々な考え方がある。Schemeの場合は、プログラムそのものの交換よりも、
新しい計算の抽象化を考えたけどどうよ、みたいな議論の共通言語として使いたい、って色が
強いんじゃないかな。最近はどうかわからんけど。
だから仕様を大きくするよりは、意味論をフォーマルにしとこうぜ、みたいな話の方がみんな喰い付く。
食いつくほど人がいれば→R6RS→R7RSみたいな事にはなってないでしょ。 人がいるJavascriptは拙速気味のECMAScript4をちゃんと食い止めてる。 騒ぐのは気力、体力がいるからね。
機能には相互関係がある。 フェイズの概念とライブラリとマクロって個別に決められない。 ポートや入出力まわりだって文字列やバイトベクタと関係がある。 例外とコンディションは不可分だし、例外を発生し得る全ての機能と関係する。 きっちり決めようとすると関連する部分の規定も必要になって、 結果的にある程度の大きさになるのは仕方ないんじゃないかと思う。 Scheme が議論の土台だというのはわかっているけど、 その土台は案外大きいかもしれないというのが私の考えで、 R6RS に好意的な理由でもある。
gaucheが1.0になったら始めようと思って5年が過ぎた
うんこ仕様のR6RS使うくらいなら一生R5RS使うわ
>>593 問題点があると思っているならそれを言ってくれないと発展性がないぞ。
CommonLispやろうず
ヤダ。
>>582 SxRS公理系は原始帰納関数より刑さん能力が低いのか、SRFI49は原始帰納関数では計算不可能なのか
>>598 仕様読んだこともないんだから口はさむな。
srfi が何か難しいものってのはわかった。じゃあ、rnrs で使えるライブラリ集みたいなのは他にないの?
つか、ネットワークとかのハード依存の部分はおいておいて、そもそもR6RSで書けない範囲って何なの
schemeで巨大なプログラム組んだ事あるけど name spaceで分けれなかったり define-methodつかって型で分けれなかったり するのつらかった
>>602 SRFI-49 や SRFI-10 や SRFI-88 のようなリーダの拡張を要するものとかかな。
プリプロセッサ的なものでどうにかできなくもないけど、それはちょっと違うしなぁ。
SRFI-37 や SRFI-98 も無理っしょ。
先程
>>601 で紹介したライブラリでは場合分けして処理系が提供する機能を使って
実装しているけど、ポータブルな方法は無いはず。
R7RS の ドラフト 9 が出たよー
で、最速の処理系はどれか結論でたか?
R5RS仕様書勉強会とか誰か開いてくれー。
絶望的に意味不明だぜ!!
大人がジャイロゼッターを見るんじゃありません。
澪「タハハ 意味不明ゾ」
処理系立ちまくりだし どれも伸びてないな R6RSだけじゃなくてR7RSも Clojureも チェックしきれないゾ
処理系作りやすいのが売りですから もちろん完成度は別にして
Land of Lisp って Schemer が読んでも役に立つような内容?
キターーーーーーーーーーー!
R6RS は静的解析しやすい仕様っていう話を
>>494 に書いたけど、
Sagittarius も未束縛変数の検出を厳密にするように変更したみたいだ。
いいネ!!
HaskellのすごいHに対抗して出したのだろうか…
これがオライリー書架の中にあったらひときわ浮くなwww
オライリーはリリカルLispのパロディ本を蛸壺屋に書かせるべき
>>619 オライリーの定型と組合わせるからネタとして面白いんじゃないか。
俺が中学生だったら絶対に興味持つね。
読者層ってやっぱプログラミング経験者なんだろうか。
>>623 そういう評価もわかるけど
原著の表紙は毒々しい紫と緑の配色にしっとりした手触りの艶消しビニール
裏地は表紙のスライムに合わせた緑色の紙が貼ってあって
なんともこだわりを感じさせる装丁に仕上がっていたんだよ
それをオライリーの定型的なフォーマットに押しこめたら残念感のほうが強い
でもネタ切れ感の強い動物ではなくリスプエイリアンを持ってきたことは評価すべきか
オーム社で出したすごいHaskellは違和感なかったけど、 この表紙はオライリーという動物園に入れられたのかw
>>607 > R5RS仕様書勉強会とか誰か開いてくれー。
どういう勉強会がお望みなの?
>>626 なるほど。でもおれは今のでも好きだ。「lispなんかヤバイ」感がでてる。
clojure本の第二版も出るようだし、lisp 始まったな!
阿澄佳奈は何故にLand of Lispの宣伝をしないのか
もっとも古い言語だからもっとも進化してしまった
Amazon.comでなか見すると英語が平易っぽいので原著で読もうかな。 しかし、史朗さんの翻訳も読んでみたい。
入門しようと思って来てみたんだけどGCに抵抗ある。 C++を使ってたから開けたら閉めるの感覚が染み付いてるし、 勝手に動いて動作速度の足を引っ張る気がして。
GC使いは速度が必要なところでのみ開けたら閉めるをやるか、もしくは開け閉めが要らないように作ります
>>634 GC の種類や、それで何をするかにもよる。
GC 有りの方がスループットは下がる可能性が高いが、ターンアラウンドタイム
は上がる場合がある。 それというのも、一般的なアプリケーションソフトは待
機時間の方が長いから、 GC 発動のタイミングをそこに持ってくることが出来
るので本質的な処理時間からメモリ管理の時間が消えるというわけ。 それと
C++ の場合はデストラクタが動けばそれに連なるオブジェクトのデストラクタ
が連鎖的に動く場合が多いんだけど、インクリメンタル GC だとメモリ回収の
タイミングを分散できるので小さな空き時間でちょこちょこ回収することも出
来る。
要は GC の特性を理解して書けばむしろ性能が上がる場合もあるってこと。
メモリ管理みたいな低水準なことをプログラマに考えさせるな!!!!
低水準なこともかんがえたいなら CL がいいんじゃないかな。 dynamic-extent 便利だよ。エクステントを明示することで、 指定したオブジェクトをスタック上アロケートされてGCいらず。
>>634 速度が重要な部分では、
>>635 が言うようにアロケーションが入らないようにしたり、
>>638 が言うようにスタックにオブジェクトを配置したりする。
自分はやったことないけど、その部分でだけGCを停止したりもする。
処理系によってはGCの挙動をコントロールしたりもできる。起動条件とか。
ホットスポットでアロケーション入れたりすると、想像の通り酷い事になるけど。
ループの中でappendしたりとか、部分文字列を生成したりみたいな。
そういうコードを書く人も結構いる。
>>634 みたいな奴の思考って
GC→Java→C++使ってる俺すげー
じゃないのか
時代遅れな俺のC++の知識によると、C++でもスマートポインタとか実用化されて、 メモリ管理を自動化する流れになってた気がするんだけど、実態は違うの?
>>641 いや、それどころか、
GCのライブラリを構築できるように、規格のメモリモデルが改善されたよ。
sequence pointの後継のsequenced beforeを使って。
その辺をまとめたのはBoehmさん。Boehm GCの。
ゲーム作っているけど、インクリメンタルGCなんて大して役にたたんけどな
~では役に立たない それがどうしたの?
今どき自前で開け閉めしている男の人って・・・って感じある
自前でメモリ管理するには人生は短かすぎる
何その名言
C++のデストラクタの仕掛けが特殊なだけであって Javaでも閉じる方は明示するか手動でやるわけじゃん
いいかげんに、プログラマをメモリ管理から解放してください
650 :
544 :2013/02/10(日) 12:23:27.37
オススメの本って何がありますか? SICPとかプログラミング言語SCHEMEとか定番のところは読んだ(全部理解できたわけじゃないですけど)と思うので、 変わり種とか、直接にはSCHEMEと関係ないものでもこれは読んどけっていうのとかを教えて下さい。
>>651 Concepts, Techniques, and Models of Computer Programming
>>651 「とらドラ」
これは絶対に読む価値あり。 大河たん萌え。
ジュンク堂にいったらいろんな本が大量にあるので、目を通してみるといいかも。 let over lambda, land of lisp, 素数夜曲 達人プログラマー、Release it!、ハッカーと画家、情熱プログラマー
>>651 実用的な, そこそこのサイズのプログラムを書いて, 自分なりに
リファクタリング(仕様のリファクタリングも含む)するのが一番
プログラム作る上では, 各言語の規格書なり SICP 系の本とかで
OK なんだろうけど, 与えられた問題をエレガントに解きたい場合は,
対象領域の専門書とかを読むしか無いんじゃないか?
計算幾科学的にはエレガントな手法でも, 具体的なシステム相手の
場合は役に立たないことも結構あるし
>>651 オライリーのGauche本→R5RS→和田本 でschemeが分かった気になれる
とらドラは普通に面白いから突っ込めないなー
便乗。手習いの後書きにある本は全部読んだ方が良いのかな?
技術系の読物で特に面白いと思ったのは「C++ の設計と進化」だな。 肥大化した仕様を DIS られる ことも多い C++ だけど、ひとつひとつの機能についてそれが必要だった理由を順を追って読んでいく と無駄なものなどひとつも無いことが理解できる。 発展の歴史には既存の開発ツールとの連携を壊さないようにだとか、 C と足並みを揃えていくことだ とか、書籍の揃い具合、仕様に精通した人材の育成、ライブラリの成熟、上位互換性、その他諸々の 要素が絡み合っている。 理論上の正当性に拘泥せず現実との折り合いを付けてきた「実際に使われる 言語」の重みというのはただの仕様ではなく仕様に連なるそれらの要素が含まれているわけだ。 Lisp が C++ を見習うべきだとか、どちらが良い選択などと言うつもりはないんだけど、 Lisp が選 んだ歴史と選ばなかった歴史を比較するのは有意義だと思う。 例えば、「関数型言語」という概念が生まれた背景には当然だけど関数型でない言語があるわけで (全ての言語が関数型なら関数型という言葉は必要ない) 、関数型が関数型たる根源は何かというと関 数型でない言語との差異によって関数型なんだということになる。 同様に Lisp とは何かを理解する ためには Lisp ではない言語との差異を理解することは必要だと思う。 違う性質の言語のひとつか ふたつくらいは習熟とまではいわずとも読物を読むくらいはしておいて損はない。
確かにalgol系に偏在した言語界にあって関数型は一種の福音なのだろうと、長年、格闘し続けてきたのだけれども、もう疲れてしまった‥‥
「C++ の設計と進化」はC++の仕様や機能ができるまでの背景が丁寧に語られていて良い LispにC++を真似ろとは言わんがLispが選ばなかった歴史を学んでみるのもまた有意義であろう Lispが何者であるかをよく知るためにはLisp以外のことも知っておいたほうが良い
CやJavaを一切経由しないLispの学習カリキュラムがあってもいいはずだ
相変わらず餃子はグダグダな長文好きだな
こじつけっぽくないか?
>>665 Scheme手習い/修行、素数夜曲、SICPでは不足?
>>669 不足って言うか、ちょっと寄り道したいなーっていう感じ
HtDPもあるし
>>531 トレードオフがあるのはわかるけど、それでもあえてこの要素はおさえときたいっていう要素ってあるかな。
速度とかエラーチェックの親切さとか、ローカライズとか、どれ?
schemeで処理系の性能のトレードオフを気にしなきゃいけないって、いったい何のアプリを作っているのだろうか…
画像処理
音響処理
>>672 信頼性。
フルメタルパニックってライトノベルがあるのを知ってるかな? その話の中で意思の力を物理力に変換するラム
ダドライバ (←どうでもいいけどこの名前が良い) という兵器が登場する。 主人公は意思なんて曖昧なものを使
うのは兵器として不適格だと主張する。 引き金を引いたら確実に弾が出ることこそ兵器として必要なのだと。
威力より信頼性が大事なのだと。
ゴルゴ13は主人公が超人的なスナイパーってことは誰でも知っているよね。 この主人公がメインで使っているラ
イフルがスナイパーライフルではなくアサルトライフルである「アーマライト M-16」ってのは知ってたかな?
スナイパーライフルは連射が出来ないので咄嗟の事態に対応できない (無防備な瞬間が出来てしまう) というこ
とと、充分なメンテナンスが出来る準備がないと使い物にならないということ等が理由として上げられている。
自分の命運を託すにはいつでも使えることが大事ってことだね。
そんなわけで、信頼性が大事。 で、言語処理系に必要な信頼性っていうのは書いた通りに動くっていうことが最
低限のラインだと思う。 十分に規格を満たすか、それが出来ないのならドキュメントに記載するくらいはされて
ないと。 変に動くぐらいならいっそエラーで停止してくれた方がいい。
引き合いに出すのが漫画とラノベかよ~
>>676 処理系に信頼性が必要ってのには大賛成。
>>677 ラムダドライバって言いたかっただけ
>>678 信頼性とは何かということになると人によって言うことは違いそうだけどな。
>>679 俺がLISP処理系作ったらラムダドライバって名前にするわwww
>>676 信頼性重要ってところははげしく同意。
gccでさえたまにバグ踏むことがあるけどバグトラッキングがしっかりしててワークアラウンドもすぐ出るからそういう体制も含めるとかなり信頼性は高かったりする。
俺的には信頼性を評価する重要ポイントは物の出来だけでなくて支援(互助)体制だと思う。
やりすぎるとRUBYみたいにクソな質問ばっかりのコミュニティになるけどな。
>>676 自分で信頼に足る処理系を作ればいいんじゃねーの。そのぐらいできるんだろ?
仮に規格に厳密でなくても自分で作ったものなら把握できるし、 いざというとき手を入れやすいというのは強みだよな。 モドキ程度のものなら作ったことはあるから発展させてみるわー。
はちみつラムダドライバーくるー
ラムダドライバはArmScheme略してASを作ってバージョンをM9まで上げてからだな
schemeでscheme処理系モドキ作るなら半日でできる 規格厳守なら1週間あればできる
寄り道書籍といえばスマリヤンの新しい本が翻訳されて出たよ。 記号論理学、数理論理学がテーマらしいので今更読む必要ない人が殆どだろうけど。
>>686 そういうのは作ったうちに入らんだろう。
はちみつ餃子SchemeはC++で書かなきゃダメだ。
へんに期待しないように言っとくけど、 今のところ公開するつもりはないし、 公開するとしても別名で出すよ。
いままで必要なかったんだし 無駄なことする必要ないと思うけど
Rubyが広まったのはやはりRuby on Railsのおかげ。 新しい処理系とかよりもキラーアプリの存在が重要。 継続ベースのWebアプリフレームワークとか・・・
>>691 Gaucheって継続ベースのWebアプリかけなかったっけ?
だから kahua について言及したいんだろうと思われるが
KahuaのHPの更新がしばらく止まってるみたいだけど。
>>695 きっとそのときはアニオタさんがらむだっちゃドライブ作ってくれる
じゃあ、俺はオメガドライブ作るわ。カルロスな。
初心者です
>>676 信頼性を測るベンチマークみたいのはないのでしょうか
め ん つ ゆ
そうか。
せ ん べ い 。
最近、GaucheでSchemeを勉強し初めのですが、エラーメッセージが gosh: "error": unbound variable: ls1 みたいに行番号もバックトレースも出してくれず苦労するんですが、なんとかなりませんか? それとも、皆さんこんな環境でプログラミングをしているのですか?
variable ls1 だけで十分だ
昔のRacketでは動いた記憶あるのだけど、今動かしたら動かなかった (define-macro (mcflag expr flag) (let ([x 1]) (when (eq? flag 'a) (set! x 2)) `(+ ,x ,expr))) (mcflag (+ 10 1) 'a);=>12 should be 13 (mcflag (+ 10 1) 'b);=>12
>>709 こうかけばいい。
(define-macro (mcflag expr flag)
(let ([x 1])
(when (equal? flag ''a)
(set! x 2))
`(+ ,x ,expr)))
デバッグプリントはともかく、確かにgauche のエラーメッセージはちょっと不足だとは思う。 他の言語より短い関数を書くことが多いことを差し引いても、もう少し支援機能が欲しい。
お前それ前に俺が「デバッグ機能が云々」って言ってた奴に WiLiKiに書き込んでみたらって言ったら凄いこと書き始めて うわなにをするやめろ的な以下略。
今はどこでハッスルされておられるのだろう。
むしろ、自分で scheme on scheme を作って、そこでデバッグをやればいいと思う デバッグが終われば 高速のscheme処理系で実行すればいいと思う
>>706 unbound variableみたいなエラーなら、書いたコードをモジュールにして
ユニットテストでtest-module流せば見つけてくれるよ。
実行時に高価なエラーチェックはテストでやるって方針らしいし。
Schemeは末尾呼び出し最適化があるので、もともとスタックトレースはあまり当てにできない。
初心者って書いているのにscheme on scheme とか glintとか何か方向性違うくないか?
>>713 oshiete-shiro-san
にわらた
無駄にARToolKitとかすげー
>>720 今見たら四年も前だぜ。仲間が欲しいので、
餃子の中の人も同じ目にあえば良いと思います!
>>719 初心者だから、ツールの情報を貰って自分で進めばいいじゃん。
学校じゃないんだし。
>>719 初心者は和田本読んで scheme on scheme を作ろう
関数型言語全体の中で一番高速なのはStalinじゃなくてMLtomなんじゃないのかな
Stalinが「関数型言語全体の中で最速」って主張してる人いるの?
速度が欲しけりゃ schemeマシン持ってこい
そっちの方が遅いというのが歴史の結論
他の言語使ってた期間が長いからなのか 1つの関数が長くなりすぎる (define (f x) (define (member-f1 ... (define (member-f2 ... (define member-ver 2) ... まるでC++ のclassみたいになる。もっとLispらしいスタイルはないものか
関数の中に関数作らないで外に出したら。
(define (f x) (define counter 1) (define (inc-counter) (set! counter (add1 counter)) ... ) みたいなの多様してしまう。なかなか外に関数だせない
>>729 > (define (member-f1 ...
> (define (member-f2 ...
これって, 個別に定義すべき関数?
let を使えばいいのではなかろうか
Win32APIのハンドル的な扱いができればとりあえず不便はないと思う それで慣れてるからというのがあるけど *nix系のAPIはいきなりexitとかアホなライブラリがあるから参考にならん
いみふ
>>736 おそらく
>>735 が言うハンドル的というのは、
具体的な意味をもつ値ではなくオブジェクトを表現するユニークなラベルとしての値という意味で言ってるんだと思う。
R6RS で「不透明 (opaque) 」と表現してるのが近いんじゃないかな。
Racketのlset-union! はmutable listのこと忘れて これに入れ替えてくれないものか これならmutableでないlistでも動く (define-macro (lset-union! l1 lst) `(set! ,lst (lset-union ,l1 ,lst))) 他の!がついてる関数も同じ感じで入れ替えてほしい
>>738 lset-unionに対してlset-union!が用意されてる唯一の理由は「セルを節約できる*可能性がある*」
ってことだけで、lstが指すリストが更新されることはもともと保証されてないよ。
何か違うものを欲しているように見えるが。
R5RS だと ! 付きのは割当て済みのストレージに値を格納する手続きで、返却値は未規定。 R6RS だと返却値は未規定という表記は無くなった。 こういうのと、セルの再利用の可能性があるってだけのものを一緒にしちゃってるのはあまり良くない気がする。
lispやってみて、階乗から始まってフィボナッチ、ハノイの塔、クイックソート 正規表現抹茶あたり組んでみたけど、なんか飽きちゃったなあ。 なんか面白いテーマないかな。 プログラマとして勉強になるのかな、と思ってたけど、CでもRubyでもできるよ ねこんなのは。
マクロ
第一級継続でさえRubyにもあるからなぁ。 Lispにしかないものってやっぱマクロだよね。 Perlとかにも有るっちゃ有るがS式を前提としないものはなんか違うなーという感じ。
perl のマクロなんてほとんど使われてないんじゃないの? 実用的なマクロがあるのが唯一、 lispだと思う
c++にもある
自分でテーマが見つからないんならやめれば?
>>741 Lispコンパイラの作成(最適化を含む)
> プログラマとして勉強になるのかな、と思って 略 > lispやってみて、階乗から始まってフィボナッチ、ハノイの塔、クイックソート >
この程度の奴は何やっても浅くかじってすぐに飽きるだろ。
OCamlやScalaにもあるけど、サンプルコードを見る限りコレジャナイ感が凄い。 そう考えると伝統的なマクロは本当に手頃で実用的。 hygienic macro? syntax-caseにするのかsyntactic closuresにするのかexplicit renamingにするのか、 一定のコンセンサス得てから出直して来てください。
その 3 つは御互いをエミュレートできる。 そんでもって伝統的マクロも模倣できる。 言語のユーザーにしてみればどれでもいいんだよ。 使い難いなら適当な皮をかぶせればいいんだから。 どれかひとつに決まらないのは、使い勝手なんかよりも、どれがプリミティブにふさわしいかという点で合意できないからだと思う。 (R6RS で syntax-case を採用したのは失敗という意見が多いけど。) Scheme の仕様を議論するときに手頃感や実用性は後付けでいいの。 プログラマが手頃にしたい、実用的にしたいと思ったときにそれが出来る仕組があるってことが必要なんだよ。
753 :
デフォルトの名無しさん :2013/02/23(土) 14:41:37.43
はぁ?
>>752 そういう合意を早く得てプリミティブを決めないの? って話だよ。決めにくいのはわかるけど。
APIが三種あるけどエミュレートは簡単にできるから、好きなの選べって初学者に言うの?
マクロが三種類あるAPIで書かれて、ふたつは消えると分かってて読む側は三種類覚えるわけ?
これって傍から見るとかなり微妙な話だよ。
ちなみに、
>>751 は実用性以前の問題なのでまずは仕様を決めてくださいね、って話だから。
そういう意味でsyntax-rulesについて言及してない。
最初はリスト操作が判れば使えるdefine-macroでいいよ 実用上ほぼ問題ないし 他はなんでhygienicじゃないとダメなのか理解した上で手を出したらいい
>>755 俺が
>>752 で言いたかったのは、
Scheme の仕様は使い勝手の良さで決めるべきじゃないってことと、
伝統的マクロはプリミティブになりえないってことであって
決めなくていいってことじゃないよ。
759 :
デフォルトの名無しさん :2013/02/23(土) 19:31:33.64
>>754 酷い書評だな
スーパーハッカーじゃなくスーパーバカの間違いだろ
まあ書評にはなってないなw 敷居が低そうだし、これまでのどの本よりも入りやすそうではある。 数学数学しすぎてないし。
>>758 ようやく意図を理解できたわ。hygienic macroのアプローチを扱き下ろしてる訳じゃない。
そういう風に勘違いさせたなら悪かった。皮肉ってるのはコミュニティの動きの鈍さの方。
五年前と状況が一緒に見えるんだけど、いつ議論は収束すんの? 来世?
>>761 5年や10年でSchemeが変わると思ったら大間違いだぞ。
実際に使われてる言語の中じゃ、Fortran と Lisp の次くらいに古い言語だっけ?
r5rsのマクロはマクロの中と外の変数は共有出来ない define-macro使えばいいよ
766 :
デフォルトの名無しさん :2013/02/24(日) 02:07:02.42
>>754 今日早速購入
やっぱ日本語だとすらすら読めていいですね
これなら1週間ぐらいで読破できる
>>765 そうだったんですね
define-macroを使ってできました
ありがとうございます
・・・そういえば貼ったコードのカッコがめちゃくちゃでした
さっきの続きで (define-macro (test ls) (map (^x `(define ,(string->symbol (string-append "a" (symbol->string x))) 0)) ls)) (test (hoge fuga)) こんな感じにしたら ((define ahoge 0) (define afuga 0)) と展開されてしまってダメだったんですけど何か解決方法はありませんか?
>>768 (define-macro (test ls)
(cons 'begin
(map (^x `(define ,(string->symbol (string-append "a" (symbol->string x))) 0))
ls)))
その発想はありませんでした・・・
>>761 理論的に明確な差がないならしばらく放置しといてデファクトスタンダードがどれになるか待つしかないんじゃねーの。
今のところは explicit renaming が優勢っぽいから R7RS large で一区切りつくと思う。
それでも R8RS ではまた覆る可能性もあるから安心できないのが Scheme だけどな。
>>766 もの凄く読みたいのに
書籍で床が抜けそうで新規書籍購入禁止令中につきebook版待ってる状態で涙目(床がゆがんできてかなりやばい)
自炊用に裁断機とスキャナ買うかマジ悩み中
R4RS に低レベルマクロのこと書いてあるんだな。 仕様の一部というわけではなくて syntax-rules の土台になりうる方式の一例として紹介してるだけだけど。 syntax-case 方式からパターンマッチを無くしたような感じ。
> 床がゆがんできてかなりやばい うちの構造は? どんなとこにどのくらい住んでんの? うちも長期間を考えるとやばいのかな? うちは書籍だけで 1t くらいあるんで反面教師として知っておきたい 一昨年引越した時、引越し業者がトラック変えに行った覚えがある
gaucheもgmp使えばかなり高速化できるんじゃないのかな
そもそも古典的マクロって何が駄目なんだっけ?シンプルでいいとおもうんだけど。
>>775 ライセンスの問題があって駄目って話だったような。
床がたわむほど本持ってても読み返さないだろ。 調べる為に持ってるなら自炊した方が良い。 尤もLisperならその全てを卵焼き作る間に実装してしまうはずだがw
>>779 俺はそんなに大量の本を持ってるわけじゃないが、
コレクション欲は理解できる。
合理的に考えればデータ化すればいいんだけどなー
俺は本棚用に部屋借りてるよ
>>777 リンク先読んだけど、要はif とかを束縛しなきゃ問題にならないんじゃないの?
そんな回避策のあるレアなケースのために、シンプルさを犠牲にするのって割に合わなくない?
オレの読み方が違ってるのかなぁ。
確かにLisp本は長い間希少だったから、読む予定なくても出れば買っちゃうけど。 それだけじゃ部屋いっぱいにはならない。 みなさんどんな本を集めておられるのか教えてくだされ。
現在入手可能なlisp関連本でおすすめ10冊を聞きたい
伝統的マクロだと展開するときにクロージャ使うじゃん letとかでそのクロージャにifとかの実体を束縛してやることで、健全性を保つことはできないのかな (define-macro hoge (let1 _if if (lambda args body ...))) こんな感じで マクロを展開するタイミングでは特殊形式の実態を値として扱うのもアリだと思うし
Land of Lisp買うぐらいならまず素数夜曲をかっちりやった方がいいと思う。
>>782 if とかの構文に限らないよ。
Gauche でこんなのを書いたとして、
三つめの式が #t を返す (グローバルな foo を呼ぶ) ように bar を定義できる?
(define (foo) #t)
(define-macro (bar) '(foo))
(let ((foo (lambda() #f))) (bar))
Gauche の場合はモジュールを使えばできなくはないけど、
Scheme として足らないことにはかわりないと思う。
もういちど記事を見て欲しいんだけど、
CL と違って Scheme は Lisp-1 であるせいで、
より衝突の危険があるってことが書いてあるよ。
> もっともSchemeの場合、Lisp-1であるせいで、
> CLにはない、 ローカル変数が標準関数をシャドウしちゃう危険がある。
> マクロが関数listへの 呼び出しを埋め込んでて、
> 使われる環境でlistなんていうローカル束縛があると まずいわけだ。
>>785 いや、やっぱそれは無理だわ。
if の内側を第一級にするんだと意味論の大幅な変更が要る。
識別子としての if を扱えるようにするのなら、
既出のハイジニックマクロと同じだし。
>>789 マクロが展開されるのとifみたいな特殊形式が認識されるのはタイミングとしては同じだし、マクロが定義される環境をはっきりしてやれば特に矛盾はないと思うんだけど
そりゃ(define if2 if)みたいのを許可しようとしたら大変だろうけど、それとはまた別の問題なのでは?
evalの中で#<syntax>が使いたいみたいな話がgaucheで出たときに、似たような話になった気がするけど正直よくわかんない
(define-macro (bar) `(,foo))
gaucheなら785の方法で787は実装できる 最悪特殊構文については諦めるにしても、一貫性があって悪くない手段じゃないかと愚考する と思ったけど、コンパイル時と実行時の環境が同じだからできる芸当だねこれ インタプリタだけならいいけど静的にコンパイルする可能性を考えるとダメっぽい
>>782 そういう考え方ももちろんあって、Paul GrahamのArcがそれ。
ただ、hygienic macroの方も実装がややこしいだけで、
使う側からすると伝統的マクロと同じくらい簡単。
>>792 ああそうか、 CL で伝統的マクロがうまくいってるのは Lisp-2 もそうだがフェイズの違いもあるんだな。
>>794 値段あたりの文字数では素数夜曲の方が上。 お得。
そりゃSchemerならそう言うだろうさ。 でもLand of Lispの方が楽しそうじゃん。(←反論になってない)
テーマがゆるい感じなのが Land of Lisp の良さなんだろうね。 まぁ比較するようなものではないな。 両方読んどけばいいよ。
スタバで読むにはどっちかといえばLand ofだろうな。 「表紙のエイリアンがかわいい!きっとあの人Lisperなのね!」 周りの女の子もそう思うはず。※ 黒いふくろう表紙では、、 「あの人、夜のぞきやってるんじゃないの?キモヲタ通報するわよ!」 ってなるでしょ。 まあスタバで人の持ち物ヲチしてる女の知的水準なんてそんなもんだ。 ただ、個人的には素数夜曲は鞄に入らない。 それだけの理由でLand ofを先に読み終わると思う。
>>787 そのbarの位置はfooがローカルに束縛されてるのだから、グローバルなfooを参照する普通の式は書けないよね?
つまり、「健全な」マクロは式変形以外のことをやっている訳で、個人的にはそれが気持ち悪い。
考え方が違うのだろうけど。
>>793 健全なマクロってlispと違う言語に見える。でも試してみるよ。
arc も触ってみたい。(最近arcの名前聞かないね)
「すごいScheme楽しく学ぼう」 「Head first Scheme」 「Steel & Sussman Programing Langage Scheme」
>>800 なるほど。 マクロが単に短く書くだけのものとして見るなら、
本来書けないものを書けるようにするのは余計っていうことか。
そういう発想はなかったな。
Scheme の特徴に第一級継続があるわけだけど、
継続の概念そのものは言語にかかわらずあるのであって、
陽に扱えるようにしたところに特徴がある。
それと同じように「文脈情報」も常に背後には有るものと考えていたので、
伝統的マクロは情報を捨てているというイメージだった。
Land of Lispはお奨めなの? バグ出しが終わる2刷りを待つか
>>801 syntax-rules や syntax-case がパターンマッチを軸に据えてるせいで
異質に見えるんだと思うけど、それが健全なマクロの全てではないよ。
なんだか皆が言う「健全なマクロ」ってそれぞれイメージしてるものが違うくない?
explicit renaming なら使い勝手としては伝統的マクロとそんなにかわんないよ。
健全性の話と具体的な API の話がごっちゃになってる気がする。
syntax-rules が嫌いっていうだけの人も健全性に懐疑的になってないか?
コアな人以外にとっては、Schemeのマクロはsyntax-rulesとsyntax-caseなんだから、 そりゃそう思われることもあるだろ。Gaucheでもまだ使えんし、explicit renamingなんて普通知らねーよ。
>>763 Cの方が若干古いです。
かなり少なくなってきているけどBASIC、COBOLってのもあるしね。
文脈情報ってのがよく分からない…
コンテキストの事じゃないかと想像。 俺的には日本語で言うなら、環境の方がしっくりくる。 違ってたらゴメン。
文脈自由文法 CDG
>>807 gauche で land of lisp、やろうと思ってあのに先にやられてしまったw
>>803 他の人も書いてるけど文脈情報って何?S式に書けること?
>>810-811 >>814 文脈情報は R6RS 原文では contextual information と書いてある。
何かって聞かれると説明に困るな。
環境 (environment) に近いとは思うけど、環境の方が意味が広いと思う。
こういう定義があったとき、 (define foo (lambda(x) (lambda(y) (+ x y)))) (define bar (foo 1)) (define baz (foo 2)) x が 1 であるような環境に覆われたクロージャが bar で、 x が 2 であるような環境に覆われたクロージャが baz ってことになるじゃん? つまり、環境ってのは動的な性質を含んでると思うんだよ。 文脈ってのはもっとシンプルに lambda(x) の x と (+ x y) の x が同じって いう判断をくだせるような静的な情報っていうイメージ。 というのが私の理解なんだけど、どう思う? あと、 R6RS では環境 (environment) をちょっと違う意味で使っているような気がする。
>>816 >>811 だけど、contextとenvironmentの明確な違いとか意識した事なかったわ。
なんとなく、グローバルな束縛とか式の評価に必要な情報をまとめて「環境」って理解してただけ。
自分で実装してみたりすると、やっぱり違うものなんだろうか?
個人的には以下で捉えてるんだが, 間違ってるんだろうか? context: レキシカルに参照できるもののスナップショット environment: 実行時に参照できるもののスナップショット
R5RSではcontextは式が配置されたコード上の場所という意味でしかない。
>>818 そんな感じでいいと思うけど、
環境を作るには字句上の対応付け (文脈) が解決されているのは大前提なので、
環境の情報には文脈も含まれていると思う。
マクロ (健全なマクロ) がない言語だったら、少なくとも言語のユーザーが
文脈の概念だけ切り取って考えることなんてなさそうだよなぁ。
マクロ展開は実行に含まれますか?
まず、実行という言葉をきちんと定義して説明してくれ
contextを拡大解釈しすぎw
実行とは評価なり
マクロ展開は実行に含まれないと思うけど、 トランスレータが走るのは実行だと思う。
もうやめてあなたのライフは0よ~
Cなんかだとマクロ展開フェーズでプログラムの構文構造が確定して それを実行するという2フェーズだけど、 schemeやLispの場合は、マクロ展開と式評価が行き来しながら進む過程 が実行なんだと理解している。 なので静的な「文脈」と動的な実行「環境」の区別は曖昧かも。
CL の defmacro では &environment で「(CL用語で言うところの) 環境」 を受け取れることになってるから、確かに区別は微妙なのかもしれないなぁ。
ということはコンパイルしてできる実行コードでも マクロは残っているのか
リードマクロの中で展開される時と, トップレベル以下で 展開されるときは全く別の環境なんで, 渡せないと色々 不具合出るんじゃないかなぁ
OpenCL とか NaCl とか、 最後に CL って付く単語が目に入ると Common Lisp かと思って「おっ?」ってなる。
そらそうだけど、CLという文字列にたいする一般的な認知のされかたが変わるのは困るね。 逆ステマみたいなもんで。
Lispこそ日本的文化に最適な言語 1万行のC言語等のコードをいかにも「がんばって」書いた様に 自動生成できるし、バグ(ミス)もない
CLよりもまぎらわしいのがクロージャ 関数閉包なのかClojureなのかClozure CLなのかGoogle Closure Libraryなのか・・・
キーボード買おうと思うんだけどLispやるなら英語配列っ
英語配列を基本にしつつ、 キーバインディングで括弧やセミコロンを入力しやすいように俺配列を定義している。
セミコロンを?
無変換、変換をctrlにしたらlispマシンの配列に近くなるから日本語の配列の方がいい
()の打ち易さじゃないのか。
>>839 本来のセミコロンの位置はShiftにしてる。
スラッシュの位置をMode_Switchに割り当てて、mod+Sでカッコ、mod+Dでコッカとかにしてる。
Lisp書くときホームポジションに括弧ないのはキツい・・・
オライリーは毎回後ろの方のページに表紙の動物や昆虫の解説が載ってるけど、さすがに今回の動物の解説はなかったな…
情けないなオライリー
次の渋谷Lispで
>>835 みたいなこと言ってひんしゅく買ってみたいな
CPS って何の意味があるの
>>849 普通の言語ユーザにとってはそれほど役に立たないかもね。
CPS 変換された世界では手続き呼出しは戻ってこないわけだけど、
それは第一級継続と同じ。 というわけで第一級継続の実装が簡単になる。
っていうか、 Scheme の形式的意味論では CPS で書かれてるらしい。
そのへんの意味論は読んでもあまり意味わからんけど。
それと前にも書いたことある気がするけど、
Chicken scheme だと CPS 変換処理直後のコードをファイルに吐き出させることが
出来るので眺めてみると面白い。
>>849 コントールフローを直接扱いたい時。
高階関数含んだコードをコンパイラが最適化する時など。
common lispの入門に実践common lispかrand of lispどっちを買おうか迷ってるんだけど 実践common lispの方が入門向きなのかな 両方買うのは金銭的にあれだし英語は読めない
英語が読めないことは良く分かったw で、とっつき易いのはland of lispじゃないかな。形式的にガリゴリ学びたい向きにはもう片方。
ステッカー欲しいしland of lisp買うことにした ありがとう
Land Of Lispは読み物としても面白かったよ
>>852 land of lispはloopの説明が面白い
実践common lispはformatの説明がある程度丁寧
応用部分はどちらも特徴的で、land of lispはゲームの改良を、
実践common lispはツールの改良をしていく
pratical common lispはネットで無料で見れるんじゃなかったかな
Loopマクロ周期表はワラタよw
>>856 詳しい解説ありがとう
さっきland of lispを注文して楽しみ
英語のpractical common lispをこの前読もうとしたけど断念した
新宿紀伊国屋で勝ったら、ステッカー付いてた。 宇宙人じゃなくて、床下にストラウストラップ~のイラストの方。 宇宙人あるんだったらよく見て選べばよかった。
自分も紀伊国屋で買ったらステッカー付いてたばかりかオライリーのメモ帳もくれた
>>849 ・自動プログラミング
・論文を書くときに(理論で表現するときの)書式を統一できる
>メモ帳 俺貰えなかったけど。どういうことなんだぜ。(当惑
land of lisp注文したときに備考にステッカー希望と書くの忘れてた・・・
864 :
デフォルトの名無しさん :2013/03/03(日) 02:43:31.33
冷静になって考えろ いらんだろそんなもの
床下にストラウストラップ、って元ネタどこなの?
シンボリックスのキーボードって何だか凄いな。
シロアリに例えてるんでしょ? 翻訳ではどうなってるの? you have a colony of stroustrups under your floor-boards.で、 お前の床下はストラウストラップsに巣食われてる、って感じだと思うけど。(複数形ね)
「奥さん、残念ですがお宅の床下にはストラウストラップの大きな素があるようです。 何回かに分けて駆除が必要ですね」 左の服に書いてある文字は「害虫駆除」 ニューバランスさんが訴状を携えてアップを始めました
巣のまちがい 原著でアバウトだなあってとこに脚注(多め)が入ってるのはいいね
つまらんジョークだな。
ジョークというより喜劇の一幕だな。
ここだけ取り上げてアレコレ言ってもな。
>>870 挿絵からセリフだけ抜きだしたから面白くはないね
「暗くてお靴がわからないわ」「どうだい明るくなったろう」みたいなもの
にしても文法に手を入れられるLispのユーザにとっては
他言語のユーザはあの家の住人のように見えてるんだろうか
両方やりますが…
正誤表を見るのが面倒だから3刷あたりまで待ってから買うわ。 とか言ってたら絶版になるのが専門書なんだけど、そうなったら中古でもいいしな。 俺は C++ 好きだし。
考えてみりゃ非プログラマにとってはLispだけじゃなくて ほとんどのプログラミング言語は宇宙語みたいなもんだよな。
schemeちょっとかじってcommonlispも興味があるんだけど、funcall気持ち悪い 関数呼ぶのに一手間かかるってに抵抗ある でも、実用的なソフトの開発には後者が向いてるとか schemeとcommonlispどっち勉強したらいい?
Lisp-1とLisp-2についてならどっちもどっち。 実用的なソフトを作ることに興味があるなら、参考書(実践CommonLisp)のある CLにしておけば?
Javaも呼べて便利らしいKAWAを使うという選択肢
Clojure「…」
Clojure は Java の資産を利用することを前提とした設計だから、 そりゃ Java を呼びやすいけど、 そのかわりに言語としての筋の良さをいくらか犠牲にしてるから、 そこらはトレードオフの問題だな。 ちなみに Java との連携なら Schluessel もあるでよ。
Movitz周辺て最近どうなの?
lisp系で実用的なソフトの開発って言ったら、今ならclojureだと思うけどな。
ライブラリの蓄積が多いと有利だよねぇ。 結局、現実の問題ってのほとんどの場合に誰かが解決した問題なわけで、 解決した結果がライブラリになっていくわけで。 少々の筋の悪さなどなんのそのって感じはわかる。
>>882 ちょっとググったが何にも出てこない。残念ながら。
movitzみたいなハードよりの話は憧れるんだがなぁ。
>880 は、 lisp-1がいいならclojureもあるよということじゃないかな?
Movitz、Schemixの開発者はきっと昆虫族に幽閉されてるに違いない。
>>887 助けに行きたいが我が師団はストラウストラップの軍団の前にすでに瀕死だ
Clojureってlisp-1だったのか でも、マクロ書くにはcommonlispがいいんでしょ?
いつかmovitzやりたいんだよなぁ。lisp星人、力を貸してくれーー
Stop! 他力本願
本願寺は浄土真宗の寺なのかー
マジどうでもいい
>>889 Clojureもマクロあるよ
他にもいろいろと面白い今時の機能が満載
Clojure はlisp1なのにパッケージもあるんだっけ?イマイチ、パッケージ、モジュールとlisp1,2の違いがよく分からん。名前空間一個だけ、がlisp-1?
Lisp-1/2は関数と変数の名前空間を分けるかどうか、という話。 モジュールやパッケージによる名前空間の分離は別。
>>896 ありがとう、そういうことなのね。個人的にはlisp2がいいな。
原論文でも、他にもいくつも名前空間はあるから、1とか2という名前は 厳密には名前空間の数とはいえない、とかそんなことが書いてある。
"Technical Issues of Separation in Function Cells and Value Cells"ってタイトルだけど、 fletとかあるからcellの話だけでは収まらないしなあ。
>>897 funcallなしで記述できるのでclojureの方が好きになってしまった。
名前の衝突もパッケージで回避できるし。
みんなSchemeをどういう用途に使ってるの?
スケルトンからjavaのコードを出力してる
sicpって面白い? 読みたいけど高い
おもしろいよ
日曜のパチンコですったと思って3冊買えばいいと思う
買いに行こうかな 本格的にlisp勉強したくなってきた Closureも触ってみるか
SICPの原書は名教科書なんだけど、訳書は解読困難な迷訳なんだよね。 MITのサイトで原文無料公開してるから、そっちを読むのがいいと思う。 あと、SICPはプログラミング全般の基礎を解説してる本で、Lisp/Schemeについての解説はほとんどない。 Lispについて学ぶには別の本が要ると思う。
そうはいっても英語はよくわからないからなあアメリカンジョークとかとばされたらおしまいだ
>>907 何が学べる?
関数型言語を使った抽象化の訓練とか?
式や変数とかの基本概念から始まって、並行処理や遅延評価、論理型プログラミングなんかの基本とか、処理系制作の基本とか。 プログラミングのいろんな側面に触れさせてくれる、ってのがメインだったと思った。
>>907 というか、scheme処理系の作成方法が載ってなかったっけ?
912 :
デフォルトの名無しさん :2013/03/06(水) 07:50:17.96
訳書はいい加減絶版にするべき
日本語になってない酷い文なのは前書きだけで、 本編は訳はヘタクソでもゆっくりなら読めないレベルではないよね。
普通に読めるわヴォケ あれを読めない奴は「できる! ○×」みたいなハウツーしか読めない病の奴だよ
読めはするよ。 技術書は、自分の知らなかった概念などの取得の為に読むんだから、そっちに思考を集中させたい。 不適切な訳は、思考の足を引っ張るから嫌われる、というだけの事。
ということにしたくて必死、ということはわかった
自分も見たけど訳はダメですね
英語わからんし。
読めると主張する人は内容がすでに分かっている人 ということになると思う
なんだそりゃ
922 :
デフォルトの名無しさん :2013/03/06(水) 18:48:43.46
普通に読めるとか言っている奴は頭がおかしい 内容が間違っているってのに
>>922 読める≒理解だからなあ。
本格的にやる気があるなら、英語ぐらい読めるようになっておいたほうが良いとは思うが。
SICPの翻訳の話はもうおなかいっぱいだろ
「The Schematics of computation」は平易な英語でいい感じ Guy.Steeleの昔の論文も平易な英語を使ってるね 内容は高度だけど
ハイハイ。 英語読めて偉いでちゅねー。 なんでそんなに原文を勧めるのかわかんね。 多少まずい訳でも母語の方がわかりやすいのは当然だろ。
本気で言ってんの?
わかりやすいかどうかは個人差がある 当然と断ずるあたり釣り
TaPL って何て読むの?
タぷぅ
>>927 >多少まずい訳でも母語の方がわかりやすいのは当然だろ。
日本語は漢字・平仮名・片仮名あるからまだいいが、ハングルだと600万もの組み合わせがあるのに同音異義語・同文字異義語が
多すぎるので(防水と放水が同じとか)、技術書読むときは英語表記の本も必須だそうな。
lispみたいなマイナー言語を使うのに、英語は読めなくていいって態度はそぐわないと思う だったらJavaかRubyでも使ってろよ
>>932 ひらがなだけで書いてあるようなもんか。
それならさすがの俺も英語の方がマシと思うわ。
まあ訳がひどくなるのは英語がひどいからだけどね
訳はひどくないと思うのは俺だけだろうか…
>>933 ”読めなくていい”範囲で出来る事は限られてるが、趣味レベルなんだろうから人に押し付けさえしなければいい。
938 :
デフォルトの名無しさん :2013/03/08(金) 03:50:36.06
英語はひどくないけど、訳はひどい
「人工無能に訳させました」って言われれば納得するレベル。
お前は人工無能を何だと思ってるんだ
おかしな奴が必死で「訳がひどい」ことにしようとしている。
前書きは確かに酷い。 読む気が失せる超絶悪訳。 しかし本編はそこまで酷くない。 ちょっと悪ふざけがすべってる程度。
前書きは原書も読みづらいよ。そこだけ妙に教授レベルで過剰に文学的な英語。
Lispを思い起こさせる比喩に満ち満ちてるから、 英語分かる人はprefaceは英語で読みましょう。
946 :
デフォルトの名無しさん :2013/03/08(金) 14:07:25.98
SICPの訳の話になると和田さんが必死になるからやめてあげて
おまえが必死に騒いでるだけだろが
前書き以外で具体的にどこがおかしいって話聞いたことない
指摘出来ないんだよ。
950 :
デフォルトの名無しさん :2013/03/08(金) 15:09:29.05
おかしいだけでなく間違っているらしいよ
訳がひどいかどうかは知らんが、和田訳が好きなのは俺だけか…
堅いけどちゃんと一意に解釈できるし嫌いじゃない 大学の教科書みたいな文 ってか俺の大学の教科書だった
953 :
デフォルトの名無しさん :2013/03/09(土) 05:17:30.81
和田さん人気あるのね
どんな訳か見てみたいけど日本語版はサンプルPDFとか流れてないのかい? 本屋行かないとダメか
訳の話はもういいよ
かわいそかわいそなのでもう止めるか
引数の型をstringで返してくれる関数ってあります? (type->string `foo) ; => "symbol" みたいな。
prin1-to-string
(format #f "~a" x)
>>958 Scheme の話だったらそういう関数は無い。
なんだか意味論上のややっこしい理由があるみたいなことをどこかで見たことはあるんだけど、
どこで読んだのだったか忘れた。
実装みるとデータに型ごとにタグつけてるからやろうと思えばできそうな気が…
Gauche なら describe 関数で見れるね。 この関数は標準出力に表示するようになってるからちょっとラップすれば文字列で返す関数を定義できなくはない。
>>963 環境はGaucheだったので describe で期待の情報が得られました。ありがとうございます。
scheme汎用としては難しいんでしょうかね? symbol? とか string? があるので
存在しててもおかしくないと思っていました。
typed racketも型情報をユーザーにいじらせてくれればいいのに
コンパイラ志向の環境でunboxingした時に型情報取るのが難しい、というかコストかかる。 まあC++でさえ、typeid使うと隠れフィールド増えるけど型情報取れるから、なんとかしたいところ。
>>964 それらを使ってひとつずつ検査すれば自分で書けるよ。
コストとか難しい理由とか気にしなければ。
(define type->string
(lambda (arg)
(if (integer? arg) "integer"
(if (symbol? arg) "symbol"
(if (string? arg) "string"
(if (pair? arg) "pair?"
(else "unknown")))))))
(type->string 10) --> "integer"
(type->string "foo") --> "string"
(type->string 'bar) --> "symbol"
もっと種類が欲しけりゃ調べる種類を増やせばok。
>>967 ごめん。"unknown"のところ間違えた。修正版。
(define type->string
(lambda (arg)
(if (integer? arg) "integer"
(if (symbol? arg) "symbol"
(if (string? arg) "string"
(if (pair? arg) "pair?"
"unknown"))))))
>>968 またまたごめん。6行め "pair?" は "pair" が正しい。
>>967 cond使いなYo!
Schemeでは「型」というのは「どの型判定述語に#tと答えるかによって決まるもの」なので
type-of みたいな関数で取り出せる「何か」がある必要はない。
Gaucheではclass-ofでオブジェクトのクラスが取れるけどね。
こんどにする
こんどにした (define type->string (lambda (arg) (cond ((integer? arg) "integer") ((symbol? arg) "symbol") ((string? arg) "string") ((pair? arg) "pair") (else "unknown"))))
Clozure CL 1.9 リリースされていたね。 オメ
type->stringって引数に型(type)がくる関数に見える
今度はcond、こんどぶし じゃないよん
>>972 数値の型は階層化されているので、そこらへんの扱いをどうするかも考えないとな。
例えば数値の 1 は integer? で真になるけど、rational? でも real? でも真だ。
最も特殊な型を返すのが筋だろうから 1 は integer でいいのかな。
それと正確性や変更可能性は階層と独立した属性なので型の一部と見做すべきかどうか。
(例えば正確な有理数と非正確な有理数は違う型だろうか? )
>>976 前半は集合論的な包含関係を考慮して内側の集合から調べる順番にすればok
後半は質問者がどこまで要求しているかにもよるが条件分岐を深くしてたとえば
((integer? arg) (if (exact? arg) "exact-integer" "inexact-integer"))
などとすればok
集合論的→集合的
979 :
デフォルトの名無しさん :2013/03/12(火) 02:41:00.66
Lispって今となってはCOBOLより世の中の役に立ってないよね なのに糞Lisperの態度のでかさはなんなんだろうね
(define a (cons 1 '())) (define b a) (set-car! b 10) ってやってaが(10)になるかどうかって規定されてるんですか?それとも処理系依存? もしconsセルを値として持ってたらaは変化しないと思うんですけど
>>980 処理系には依存せず、a を評価すると必ず (10) が返される。 Lisp 系言語では
シンボル a や b はオブジェクトに束縛される(C言語でいうポインタ参照をもつ)だけ。
(define b a) により、シンボル b は「シンボル a が束縛されているオブジェクト」に
束縛される [つまり a も b も同じオブジェクトであるリスト (1) へのポインタ参照をもつ]。
(set-car! b 10) で[ひとつしかない共通の]リスト (1) の car 部が 10 に書き換え
られて (10) となっても当然 a b ともその同じ (10) を参照し[に束縛され]ているまま。
この点が「変数は値の入れもの」であるとする他の言語と Lisp とが大きく異なる点だねキリッ
オブジェクト参照しかない言語はいくらでもあると思うが。
というよりリストを値として変数に入れる言語なんてあったっけ
(set-car! b 10) は b->car = 10; ってことかいな。
Lisp処理系作ろうと思った時、cons型が二つのポインタを持つのかconsへの参照を持つのかで悩んだ
二つのポインタを持つだけだったら
>>980 の言うところの「値として持っていたら変化しない」になりそう
こんな扱いしてる処理系少しはありそう
consセルを値として持つっていうのが意味わからんよw
関数呼ぶときセルをコピーして渡す仕様だったら set-cdr! は実装できない
set-car! だった 同じだけど
それ特殊形式じゃん
>>985 struct cons
{
X1 *pointer_x1;
X2 *pointer_x2 ;
}
ということ?
メモリ構造の話と 引数の扱いの話と 破壊的代入の有無の話が、 ごっちゃになってる。 あとconsセルのcar,cdrは共用体です。 即値も入れないといけないので。
SAN値が下がる
>>994 一回Amazonの締め切り落として(なの?)予約注文キャンセルされてさらに三年とかいうことかいね?
次スレ立てるよ
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。