Lisp Scheme Part40 [転載禁止]©2ch.net
■ このスレッドは過去ログ倉庫に格納されています
i と j じゃ整数の印象が強いんで、次の k を使ってるだけかと思った このあたりの例で使ってる i はたぶん identifier の i じゃないかと思う。
http://www.r6rs.org/final/html/r6rs-lib/r6rs-lib-Z-H-13.html#node_sec_12.7
t は疑問の余地なく temporary だな。 p は pattern で e は expression ってところか。 >>228
scheme限定のイディオムなんかね
clojureだと
(defn hoge [coll] (brabrabra))
coll(collection)をわたすんだぞーってイディオムになってるみたいな? パターン変数には全部頭に ? を付けるとかいう流儀もあるし、
そんなに確立したものではないと思うけどね。 >>232
constantな値にkFoo,kBarってつける習慣もあるからcontinuationにkプレフィックスはそんなに違和感持たないなぁ
class指向な処理系で classって名前使えないからClass klass = someObject.class って書くようなものかと思うのであるよ。
;;; 実は歌の続き?としばらく悩んだ 理解重視でオレオレlisp処理系をhaskellで書いててこれを改良しようとしてます
環境は[(名前,値)]というわかりやすい実装でラムダ式本体部を引用するとこんなのです
let env' = (zip param args) ++ closure ++ env in
last $ map (eval env') body
これって開発言語のスタックを使った実装になりますよね?
このコードはapplyの一部で、evalとapplyの相互再起の中の1コマなのですが
よく末尾再帰とかいいますがああいうのはどうやって判定するのですか? schemeはいい線行ってたと思う
不幸なのはほとんどの機能がjavascriptで足りてしまったこと
大多数の人は末尾再帰すらないjavascriptでいいと言う
繰り返し処理と言えばループしか脳から出てこないんだから
再帰はおろか末尾再帰なんか知らないだろう
再帰処理もスタック構造のコンテナとループで同じことができるんだから
実際知らなくても困らない JavaScriptの末尾再帰はもうすぐ実装されるし高階関数もずいぶん前からあるが WebAssembly が一般的になったら JavaScript の勢力は (クライアントサイドでは) 過去の資産を除いてフェードアウトしそう。
そのときこそ Scheme の復権が狙えるかもしれないぞ。 >>234
末尾コンテキストを判定する
末尾コンテキストの実行時はフレームで確保したスタックは使われない
よってその直前で削除してしまえるから関数呼び出し等でもループに置き換えられる
(define a (lambda (x y) (b x y) (a x y)))
の最後の(a x y)は末尾コンテキスト
最後のa呼び出し前のx yの引数の積み上げが完了した時点でaのフレームは削除できる
削除した後aを呼び出すとまた同じフレームレベルでaの処理が開始する 末尾コンテキストの伝播
tを末尾コンテキストとする
(lambda ()・・・t)
(if test t t)
(begin ・・・t)
(lambda()・・・・t))
組み合わせると次のように末尾コンテキストが伝播する
(lambda ()・・(begin ・・・×)・・・(begin ・・・(if test t t)))
×は親が末尾コンテキストでの実行でなければ子も末尾コンテキストにはならない事を示す 関数適用の末尾コンテキスト
上で(a x y)を末尾コンテキストと書いたが
より正確にはtの呼び出し時点が末尾コンテキストとなる
表記的には(t 引数)となるがt自身がいつ評価されるかはschemeでは規定されていない
よって処理系の都合順にt x yを評価した後、tの呼び出し前に末尾コンテキスト処理(フレーム削除等)が発生する 末尾コンテキストが移動する構文
(set! var exp)
(while test body)
set!はvarがフレーム内変数ならexpの評価、フレーム外変数ならvarをexpの結果で破壊した時点が末尾コンテキストになる
whileはtestで偽になった時点かbody内からbreak等で抜けた時点だが、
そもそもschemeでのループ構文は末尾再帰の構文糖衣として定義されることが多く、この限りではない
継続呼び出しの末尾コンテキスト
継続呼び出しは継続を保存した位置に移動すると共に環境も入れ替わるため
末尾コンテキストの対象外となる(考慮しなくて良い) >>241-244 素晴らしいIDですね
末尾コンテキストの伝播については理解できたと思います
ifは末尾コンテキストが2つに増えるので
もしif文が末尾に連なってたら末尾コンテキストがたくさんになるわけですね
これを使って末尾コンテキスト判定をするis-tailrecみたいなのを作れば
考え方として、関数fの定義でもしis-tailrecが真となる箇所以外でfが
呼ばれていれば末尾再帰でないと判定すればいいですよね
set!の部分がちょっとまだ理解できてませんが考えてみます >>237
紹介サンクス
かなり読みやすくなってる気がする Haskellのclassとinstanceに相当する型演算をSchemeで擬似的に作る方法ないのだろうか >>252
何だこれ。晒してるつもりなのか?
こんなことすべきじゃない。 >>252
これ読んでいるだけでも、すごく勉強になるよな なるよな?
同意を求めないで欲しい
気持ち悪いbot作ったなーとしか… SICP は専門書なわけで、どこの 140 文字を抜き出したって勉強になるってほどの情報量ないよ。 情報量うんぬん以前に
何言ってんのかわからない
日本語なのか
これは 変な翻訳を抜き出して笑うためのbotだと思うんですけど
SICPで翻訳と言えば例の翻訳炎上のはてブ勢の気持ち悪いこと気持ち悪いこと アスぺの人、和田訳を執拗に擁護するのはなんなんだろうな
専門知識で足りない英語力を補っているから、minghai訳よりはマシって程度なのに >>260
笑うためってのは言い過ぎだと思うけど、まあ、余興だよな。 和田訳こそ英文が読めなくて、日本語を適当にでっちあげた
真鍋のいうところの腐臭のする糞訳なのに、
どういうわけか擁護するんだよな 照り輝くbotはもともと糞訳をまとめたおもしろbotだろ
そもそも照り輝く自体相当前からネタにされてるし 糞約とはいえ他人の著作物云々の問題はクリアしてるのか? SICPを糞訳と言うと、おかしな連中が絡んできて面倒だったけど
これからはこれ貼るだけですむから楽でいいわ
https://twitter.com/illmnt_SICP_ja >>260
はてブ気持ち悪いのだけ一貫してて主張がコロコロ変わってて面白い
主張は変わってないのに同じ人が擁護したと思ったら次の記事には叩いてんのな 機械翻訳みたいな変な訳ばっかり
こういうのダメ出しするのも出版社の仕事だろ
アメリカの教科書はリーダブルじゃなきゃならないと聞くが
悪文で書いた教科書なんてのはそれこそ日本の悪文化だよ
ましてMITの教科書を改悪、悪文化するのはおかしいゾ プログラミングGauche尼で売り切れてオライリーが入荷待ちなんだけど
絶版?第2版? 本当はLisp使いたいのに急ぎだとpythonとかbashで使い捨てスクリプトを書いてしまう (定義 (長さ リスト)
(もし (空? リスト)
0
(加算 1 (長さ (残余 リスト))))) (定義 (右から畳み込み リスト 乗算 単位元)
(もし (空? リスト) 単位元
(乗算 (車 リスト) (右から畳み込み (残余 リスト) 乗算 単位元)))) Schemeを勉強しだす→「なんてシンプルかつエレガントなんだ!これさえあれば何でもできそうだ!」
Schemeで何か作ろうとしだす→「なんて面倒なんだ!CommonLispみたいに統一してくれよ!」
「R{5,6,7}RS準拠だぞ」
「けどここは各実装で好きにしていいぞ」
「皆自分でSchemeを作るんだぞ」 Scheme は「俺自身が Scheme になる事だ」が奥義だから (もしもし? もしもし? ただいま留守にしております お掛けになった電話番号は) 「俺の母語はschemeだぞい」とかいうなら分かるんだけど。
俺がschemeってどういうことよ?もっと具体的に。 > 俺自身がscheme
これは自分にはかなり納得がいく言い方だった。
自分はC++が主なんだけど、schemeを学んでから、その知見を取り入れて、
C++のスキルが顕著に上がったと思う。
自分の書くコードの質も、先輩の書いたコードに対する読解力も。
なんというか、schemeで考えてC++で書くようになったというか。 lispの入門書って何がおすすめなん?Land of Lisp?The little schemer(scheme手習い)? >>292
(質問スレに書くべきだったけど許して) Realm of Racketの翻訳って誰かやってんのかな?shiroさん? >>292
漠然とした本なんかより処理系のソースコード
かといってgcc級の糞でかいの読めっても無理だろうから規模がちっこいやつね
ついでにその処理系で動作確認もできるし >>292
前者は読んでておもしろい、後者はまじめに勉強にはなる
お金あるならどっちも読むと良いよ
あとは上の方に書かれてるけどソースコードはとっても勉強になるけどこれは結構しんどいと思うな(割と時間かかるから)。 基本的な考え方くらいはおさえとかないとソースから意図を読むのは難しいと思うよ。 >>298
>>299
ありがとうございます、やはりソースをそのまま読むのは辛いですよね… ttp://www.amazon.co.jp/dp/B018KXY55Y/
「LISPでわかる!プログラミング・自由に生きるための英語学習法」
何この…何これ?
kindleでサンプル見たんだけど、これで理解できる初学者いるの? 個人出版のデジタル本で1200円は高いな。
50円なら買ったかもしれないのに。 >>301
Kindle出版のオナニー書籍にしか見えないんだけど内容どうだった?(prime会員だからタダでよめるんだけどなんか触るのイヤな感じ) miniKanrenの日本語解説本
誰も書かないなら個人出版で出しちゃうぞ >>304
サンプルの範囲では
「○○が出来ます」+コードサンプル
で1n
それが延々続いてた
目次見るとそこそこ解説もコードも書かなきゃいけなさそうなことも取り扱っているはずなんだが 自分もサンプル版を読んでみたけど、言語の解説という雰囲気ではなく、自分の勉強した内容を箇条書きっぽく書いてあるように感じた。
サンプルは最初の方しか読めないから、LISPそのものの説明のところだけしか読めてないけど、後半の応用部分は面白くなる可能性はあるかもしれないな。
英語学習法の部分については、
http://primitive-lisp.blog.so-net.ne.jp
独学でこのくらい書けるようになるのであればスゴイと思うし、ブログを日本から発信するのには十分かと。
でもネイティブの人はカタコトのように感じるレベル。 英語学習法の部分はサンプルに入ってないので、自分テキトーなことを言ってるぜ!? Deep Learningの人達はpythonフレームワークを乱立させてるけどlispのマクロ下位互換マクロ作ってるだけなのにいつ気がつくんだろ。lisp使えばフレームワークとかそもそも必要ないのに フレームワークを乱立させやすい言語は流行る
Lispもそうだった Theanoとかlispで書き直したらかなりスッキリするのに
ごちゃごちゃしすぎ 他人の書いたpythonコードを解析しないといけなくなって
「めんどくさい
何でLispで書かないんだ
解析させられる俺の身にもなれ
Lispなら長さが半分以下の読みやすいコードになるのに」
という感情がとても高まってきている お前が書いたlispのコードの方がもっとひどいんだがw windows内蔵言語のvbscriptでschemeモドキを作ろうと目論んでる
つってもちゃんとやるのはマクロと末尾再帰だけでね
variant型使ったリスト処理がどんだけ遅くなるか見ものだ 100Gぐらいのメモリーに入りきらないデータを扱う時にpythonではジェネレター式というのを使うけどschemeやlispではどういうふうにするの? 典型的なのはストリーム (srfi-41)
http://srfi.schemers.org/srfi-41/srfi-41.html
ジェネレータの形にする場合もある。
http://practical-scheme.net/gauche/man/?l=jp&p=gauche.generator
Gauche だと遅延シーケンスがある。
でも、これは処理系自体に組み込みじゃないと後付けでは難しいので遅延リストに依存したコードは移植性に難があるかもしれない。
http://practical-scheme.net/gauche/man/?l=jp&p=%E9%81%85%E5%BB%B6%E3%82%B7%E3%83%BC%E3%82%B1%E3%83%B3%E3%82%B9
単なるバイト列やテキストであればカスタムポートも使いやすいと思う。 https://github.com/dherman/c.rkt
これでC言語のプログラムを自由に加工したりできるっぽいのだけど
ドキュメントらしきものがない
誰かexample usageみたいなものどこかにないか知りませんか?
使えればかなり便利そうなんだけど >>320
拡張子が scrbl のファイルはドキュメントだぞ。
Scribble で html などに変換できるはず。 >>324
いや違うと思う。CLって多分思考(若しくは試行)ツールなんだと思うよ
俺が使いこなせないのは普段から抽象を扱ったりしてないから schmeme 手習いを反復してやってます
(cond ((eq? a (car lat)) ....
で eq? が真を返すときの実行文の文法がわかりません
教科書では
(cond ((eq? a (car lat))(cdr lat))
となっていますが
(cond ((eq? a (car lat))(print "abc")(cdr lat))
と真の時の従属節に関数実行のS式を追加することはOKでしょうか?
目的はデバッグのため
処理系はgauche です,プログラミングgaucheを手元に置いていますがよく読めてません
よろしくお願いいたします ■ このスレッドは過去ログ倉庫に格納されています