LISP Scheme Part5
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
NGNGPart1: http://piza2.2ch.net/tech/kako/987/987169286.html
Part2: http://pc.2ch.net/test/read.cgi/tech/1002584344/
Part3: http://pc.2ch.net/test/read.cgi/tech/1008220265/
Part4: http://pc.2ch.net/test/read.cgi/tech/1016211619/
関連リンクは>>2-10あたり
0002デフォルトの名無しさん
NGNG日本Lispユーザ会(日本語)
http://jp.franz.com/jlug/index.html
ここにかなりの情報があります。
http://jp.franz.com/
削るとAllegro Common Lispのページへ
プログラミング言語Scheme(日本語)
ttp://www.sci.toyama-u.ac.jp/~iwao/Scheme/scheme.html
Schemeの人はまずここを見ましょう。
Lisper への道(日本語)
ttp://www.geocities.co.jp/SiliconValley-Oakland/1680/rakup.html
判りやすいLISP入門サイト。
Schemeへの道(日本語)
ttp://www.stdio.h.kyoto-u.ac.jp/~hioki/gairon-enshuu/SchemeNotes/scheme.html
ここはschemeの入門サイト。
慶応の授業のページ・記号処理プログラミング 2001
http://buri.sfc.keio.ac.jp/lisp/menu.html
Practical Scheme(日本語)
ttp://www.shiro.dreamhost.com/scheme/index-j.html
「普通のやつらの上を行け」など、興味深い文書を沢山翻訳されてます。
(Gaucheという完成度の高いscheme処理系作者さんのページでもあります。)
Scheme Hash(英語)
http://okmij.org/ftp/Scheme/index.html
S式でXMLを使える様にするSXMLなど
John McCarthy's Home Page
http://www-formal.stanford.edu/jmc/
LISPの生みの親、J・マッカーシーのページだそうです。
お隣りのプログラマ板のLISPスレのログです。
http://mentai.2ch.net/prog/kako/963/963134110.html
0003デフォルトの名無しさん
NGNGCommon Lisp the Language, 2nd Edition(英語)
http://www.cs.cmu.edu/afs/cs.cmu.edu/project/ai-repository/ai/html/cltl/cltl2.html
CommonLispの仕様書です。
アルゴリズム言語Schemeに関する第五改訂報告書 R5RS(日本語)
http://www.sci.toyama-u.ac.jp/~iwao/Scheme/r5rsj/html/r5rsj_toc.html
http://www.biwa.ne.jp/~mmura/scheme/tspl.html#r5rs
日本語訳はここ以外にもあるそうです。
Scheme Requests for Implementation SRFI (英語)
http://srfi.schemers.org/
Scheme Frequently Asked Questions (英語)
http://www.schemers.org/Documents/FAQ/
0004デフォルトの名無しさん
NGNGSICP(英語)
http://mitpress.mit.edu/sicp/full-text/book/book.html
「計算機プログラムの構造と解釈」の原書です。
全てオンラインで読めます。
計算機プログラムの構造と解釈 第二版 (snip) に関連するホームページ
http://www.ipl.t.u-tokyo.ac.jp/sicp/
SICPの回答集
http://www.melt.kyutech.ac.jp/~gogogo/sicp_ex/
http://pluto.aurorasd.co.jp/~mkama/sicp/
http://www.ipl.t.u-tokyo.ac.jp/sicp/solution.root.html
http://www.sampou.org/scheme/sicp/answer/
0005デフォルトの名無しさん
NGNGSchemeで書かれた正規表現ライブラリ
ttp://www.cs.rice.edu/~dorai/pregexp/pregexp.html
幻の「入門Scheme」
ttp://www4.ocn.ne.jp/~inukai/scheme_primer_j.html
オンラインで読める
各種scheme処理系をcygwin上からビルドする方法など。
ttp://www.geocities.co.jp/SiliconValley-PaloAlto/7043/
Bit - Implantation compacte de Scheme
http://www.iro.umontreal.ca/~dube/
mini-schemeよりも小さい(?)bytecode変換系
Lisp 言語処理系: CAMPUS LIsP, Lemon version
http://aten.aial.hiroshima-u.ac.jp/~kakugawa/clisp/index-ja.shtml
Cコードによるわずか1000行の実装
0006デフォルトの名無しさん
NGNGの使い方教えてください。
0007デフォルトの名無しさん
NGNGMinischeme: 1 ファイルに凝縮された Scheme 処理系
http://tinyscheme.sourceforge.net/minischeme.tar.gz
TinyScheme: Minischeme の発展版
http://tinyscheme.sourceforge.net/
KI-Scheme, AM-Scheme, etc...
http://www.nifty.com/download/dos/prog/lisp/
LispMe: Palm 上で動く Scheme 処理系
http://www.lispme.de/lispme/
前スレ 364 参照。
0008Lisp使いの名無しさん
NGNG0009デフォルトの名無しさん
NGNGお疲れ〜〜
00101
NGNGいつのまにか5スレ目突入です。
0011デフォルトの名無しさん
NGNG誰かしら喜ぶかなぁ?
0012デフォルトの名無しさん
NGNGつーか、kawaで検索かも。
0013Lisp使いの名無しさん
NGNG使い方キボンヌ。
001411
NGNG自分で開発するのも楽しそうだと思ったのだが,
まぁ利用させてもらおうっと.
0015デフォルトの名無しさん
NGNG(ガイ・スティールが)「何か記憶に残るプログラムを
書いたかというと、どうもピンと来ない。」
って言ってるけど、そうなの?
0016デフォルトの名無しさん
NGNGなんか感じた事があれば教えてプリーズ。
0017デフォルトの名無しさん
NGNGcar, cdr を使うか first, rest を使うかでもめたことがあります
0019デフォルトの名無しさん
NGNG>first, rest
これ使ってる人いるの?
0020デフォルトの名無しさん
NGNGごめん、ちゃちゃだね。
とりあえず、複数人での開発とういう観点では、
ダイナミックスコープであることを意識しておかないとひどい目に
会うことがある、というかひどい目にあったことがあります。
それと、属性リストは使わないほうがよいと思います。パッケージ
を分けていない場合、複数の人が使ったときに破綻してしまうし、
ソースコード上わかりにくいので。
0021デフォルトの名無しさん
NGNG002216
NGNG参考になります。ひどい目にあったというのは free variable を参照
する時でしょうか? マクロとの兼ね合いもありそうですが。
>>21
SICP と R5RS で十分だと思いますよ。
0023デフォルトの名無しさん
NGNG2〜4人で開発したこと(CommonLisp, Scheme) は何度かあります。
Lispハッカーの人は、コメントをほとんど書かないか詳細に書くかの2極に分かれる
ように感じました。コメントを書かない人は、きっと頭の中にロジックが収まって
いるのでしょう。ただコメント無しで高階関数を使いまくられると、ぱっと見た時
関数がどんな関数を受け取ることを仮定してるのかわからないんでつらいです。
分かりやすさという点ではなるべくオブジェクト渡しにしておく方が良いですね。
0024デフォルトの名無しさん
NGNGRABBITってScheme compilerは、Steeleの作。
最低限のprimitiveにprogram変換しといてからってやつ。
http://citeseer.nj.nec.com/context/1162426/0
こういう評価。古典だな。
0025デフォルトの名無しさん
NGNG0026デフォルトの名無しさん
NGNG0027デフォルトの名無しさん
NGNGpotatoだとない。woody/sidには入ってる。
0029デフォルトの名無しさん
NGNGLISPだと名前空間は問題にならないんでは?
CommonLispならpackageがあるし、各作業者が定義したファイルを
巨大な1関数として読みこむ(packageの前身?)こともできるでしょう。
packageみたいなのはschemeにも処理系毎に大抵ある。
packageが無くても環境を操作できる処理系があるとすれば、
(define PG-A
(let ((env (load-environment "PG-A.scm")))
(lambda(procedure-name . argument)
(if (eq? 'import procedure-name)
(apply find-environment (cons env argument))
(apply (find-environment env procedure-name) argument)))))
(PG-A 'function1 arg) ;CommonLispのpackage名参照もどき
(define PG-A-function1 (PG-A 'import 'function1))
(PG-A-function1 arg) ;CommonLispのimportもどき
0030デフォルトの名無しさん
NGNG0031デフォルトの名無しさん
NGNGこちらでは ACL を使っているので、命名規則は ACL に習って、
public な変数: *foo*
public な関数: foo (そのまま)
private な変数: .foo.
private な関数: .foo
にしています。
>>29
Common-Lisp の package って、
(mypackage::private-function)
のように :: を使えば private な領域にアクセスできてしまうのが
困ると言えば困りませんか?微妙な問題だと思いますが。
0032デフォルトの名無しさん
NGNG全部リストにしていたけど,今更ながら違和感を覚えた.
0033デフォルトの名無しさん
NGNGクロージャでもベクターでも作れますが何か?
0034デフォルトの名無しさん
NGNGリストで何か問題でも?
つっても、まあ気持ちはわかる。
schemeは参照ベースだから全部ポインタだし、
「見なす」ことが多いからね。
よく見かけるのは、vectorでもlistでもいいけど
(*構造体識別タグ* 構造体名 member1 member2 ...)
というデータ構成を「構造体」ということにして、
(define-structure point x y)
とすれば
(define (make-point member1 member2)
(list '*構造体識別タグ* 'point member1 member2))
(define point.get-member1 caddr)
(define point.get-member2 cadddr)
(define point.set-member1! (lambda(s)(set-car! (cddr s))s))
(define point.set-member2! (lambda(s)(set-car! (cdddr s))s))
(define point? (lambda(s)
(and (pair? s)
(eq? (car s) '*構造体識別タグ*)
(eq? (cadr s) 'point)))
辺りを自動生成する様なマクロを組むとかね。
(define-structure point x y)
(define pt (make-point 0 0))
(point.get-member1 pt)
==>0
003534
NGNG0036デフォルトの名無しさん
NGNG(define (test-rec n)
(let loop1 ((x 0))
(if(< x n)(begin(display x)(loop1 (+ x 1)))))
(let loop2 ((x 0))
(if(< x n)(begin(display x)(loop2 (+ x 1))))))
これ、loop1,loop2両方とも末尾再帰してますか?
0037デフォルトの名無しさん
NGNGhttp://theory.lcs.mit.edu/~rivest/sexp.txt
Expire してるけど、S式好きとしてはなるほどと思う。
世の中ぜんぶS式になっちゃえ!アヒャ
0038デフォルトの名無しさん
NGNGちょっと大きなシステムを組む時は、構造体っぽいwrapperがあったほうが
圧倒的に便利と思われ。
ポータビリティ重視ならSRFI-9か。
http://srfi.schemers.org/srfi-9/srfi-9.html
0039デフォルトの名無しさん
NGNG> :: を使えば private な領域にアクセスできてしまうのが
> 困ると言えば困りませんか?
非常時以外はそういうことをしない、というルールを
徹底できれば…
モジュール間のインタフェースを摺り合わせつつ開発してて、
別モジュールのあれは非公開だけど使ったらインタフェースが
すっきりするんじゃないか、と思い付いた時に、わざわざその
モジュールに公開してもらう前に試せる、というのが便利なんですよね。
建前では「そんなことはケシカラン」のですが、「本当にそのように
インタフェースを変更することが有効か」を検証するためには
一度組んでみなければならない場合もあるわけで。
iterativeに開発してて、明日デモらなくちゃならんとかいう
追い込みの時は特に…
そういう意味では実にハック向けの言語ですね。
デモが終ったらそういうハックを忘れてそのままにしてしまう
危険はありますが。
0040デフォルトの名無しさん
NGNGリンク見れないんですが。
0041デフォルトの名無しさん
NGNGnamed-letはinternal-defineやletrecと同じ扱いなので、
その例では末尾再帰です。
0042デフォルトの名無しさん
NGNGガーベジコレクションを意識する必要ないだけで、かなり。
0043デフォルトの名無しさん
NGNGもちょっと詳しい解説きぼん
0044デフォルトの名無しさん
NGNGCommon Lisp の仕様書としては、いわゆる HyperSpec
http://www.xanalys.com/software_tools/reference/HyperSpec/Front/index.htm
のほうが正規のものだとおもいます。
0045デフォルトの名無しさん
NGNG0046デフォルトの名無しさん
NGNG意識する必要のあるGC萌え
0047デフォルトの名無しさん
NGNGCommon Lisp より人気があるような気がするのですが、
これはどういうわけなんでしょう?
「(ぷっ) Common Lisp だって! あれって(言語仕様がAdaなみに)
ばかみたいにでかいよね!」
みたいな反応をWeb上や雑誌などで何回かみたことあるんですが、
おまえら、どうですか? (2ch ではこういう物言いが正しいのですよね)
Common Lisp がでかいというなら C++はどうなんだろうとおもう今日この頃
です。(Adaのことは詳しくないけど、あなどれないらしいという噂はききました。) ちなみに漏れは、Emacs lisp -> Common Lisp という順に進みました。
P.S. あと、Schemeは確かISOの国際規格になっていて、Common LispはANSIどまりでアメリカの規格でしかないということも知っています。あと、ISLisp
(だったかな)とかいうLispの国際規格があるらしいけど、実質的に放置プレイ
されていることも知っています。
0048デフォルトの名無しさん
NGNG規格はあまり気にしてないかな。Common Lisp も嫌いではありませんが、
よくわからんので中途半端にしか使えません。Emacs Lisp は書けます。
0049デフォルトの名無しさん
NGNGはっきりいって、Schemeの各処理系もR5RSだけでは耐え切れなくて
Common Lisp にあるような機能を独自に拡張したり、
ど忘れしてしまったけど、ユーザーレベルの規格みたいなものを決めていこうと
いう動きがあるよね?
それだったら、とりあえず Common Lisp を使ってしまって、いいんじゃないの? と思うんだけど。 Kyoto Common Lisp を書いた偉い先生もたしか、
エッセイで「アメリカは嘘っぽいことをもっともらしく言うけど、
結果オーライで、Lispプログラムの互換性がとれればまぁ、我慢できるかな」
みたいなことを言っていたのを読みました。
Common Lisp の制定時に、金がからんだり、政治的な思惑があったらしい
ということは、当時者ではないので、詳しくは知らないけど、噂レベルでは
知っています。(漏れはcomp.lang.lispをたまに読んでいるので、Common Lisp 制定時のEditor だった KMP さんがいろいろ昔話をするのを読んだりして、その当時の雰囲気を察しています。当然一方的になるのは承知ですので、カンウンター情報希望。)
005048
NGNG他人の定義した関数を調べるよりも、自分でササッと書いてしまった方が
楽な場合が多いので、あえて Common Lisp を使う気になれないんです。
もし多くの処理系で動作する事が最重要課題のひとつであるならば、
Common Lisp を使いますよ。
あとは、Scheme の proper tail recursion の存在が非常に大きいです。
全ての Common Lisp 処理系でこれが使えたら、Common Lisp を選んで
いたと思います。
0051デフォルトの名無しさん
NGNG「正規」どういう意味?
こっちがX3J13で採用されたんだっけ?
>>49
CLtL読んだ?
Common Lisp誕生については、共立のbitのバックナンバーも読んでね。
竹内さんがCommon Lispのヤな所を書いた記事もあったはず。
俺はCommon LispはCLOS以外忘れた。
0052デフォルトの名無しさん
NGNG亀レスだが、biglooもどうぞ。
0053デフォルトの名無しさん
NGNG> あとは、Scheme の proper tail recursion の存在が非常に大きいです。
これはたしかに、Common Lisp の規格には含まれていません。
しかし、これってそんなに必要っていうか、重要でしょうか?
proper tail recursionが保証されているっていうのは、
プログラムのその部分の実行速度が高速になるという思惑があるんですよね?
現在、すでにかなり酒を飲んでいるので、厳密な書き方が不可能なんですが(すいませんはっきり言って変なこと言っても見逃してくれモードに入っています)、
proper tail recursionとか言っても、なんか、foo-BANGみたいな
むりやり別の関数を定義して、accumulator変数、(つまり結果を累積するための変数)なんかを引数としてとる関数を別に定義したりする必要が出て来たり
しませんか?
漏れはそんなことするくらい実行速度を速くしたいなら、そこだけ、Cなり、
アセンブラなりで記述すえばいいと思います。
あぁぁ、今これを書いていて、なんだか知らないけど、Mozillaのメールウィンドウが馬鹿みたいに立ち上がって、今まで書いたことが無駄になりそうに
なったので、とりあえずこれだけを送信します。(はっきりいって2ch初心者です。)
0054デフォルトの名無しさん
NGNGArc
005548
NGNG僕が proper tail recursion に期待しているのは、実行速度ではなく
可読性と記述性です。他の言語を使用していていると、proper tail
recursion ならスッキリ書けるものをわざわざ汚いループ構文や
制御変数を使ってバグの元を作らなければならない事態にストレスが
たまるんですよ。
0056デフォルトの名無しさん
NGNG> >>44
> 「正規」どういう意味?
> こっちがX3J13で採用されたんだっけ?
というか、X3J13規格(って言うんだっけ?)そのものに、規格制定時に
もめた事項、つまりだれかが文句を言って、それが採択されたりした経緯
もあわせて収録されていると思います。
comp.lang.lispの雰囲気では、 CLtL1もしくは2を元になにか言おうとすると、「1は規格を制定した団体が認めたものだけど、2はちがうよ、
規格そのものを見てね」みたいな雰囲気です。でもこれは一日本人が
つたない英語理解能力で解釈したものです。
> Common Lisp誕生については、共立のbitのバックナンバーも読んでね。
> 竹内さんがCommon Lispのヤな所を書いた記事もあったはず。
ここは確か、書店でCommon Lispという書名で分厚い本を見た記憶があるのですが実際には読んでいません。(翻訳を誰がやったのかとか、他のコンピュータ
関連の日本語訳でいたい目にあって段々翻訳を信用しなくなっていた時期なので読んでいません。残念です。でも竹内先生の「はじめての人のためのLisp」は
最初に読んだLisp啓蒙書なのでなんだか良い気持。{でも最初は何内輪受けしてんだこの学者野郎ーという感想})
0057デフォルトの名無しさん
NGNG> 僕が proper tail recursion に期待しているのは、実行速度ではなく
> 可読性と記述性です。他の言語を使用していていると、proper tail
> recursion ならスッキリ書けるものをわざわざ汚いループ構文や
> 制御変数を使ってバグの元を作らなければならない事態にストレスが
> たまるんですよ。
求めるものが可読性とかなら、勝手にそういうふううに書いとけば、最低限,
結果は正しくなるとおもいます。というか、だって、proper tail recursion
って、(速度はどうだっていいっていうのなら)、その関数内で、実行するのがその関数への呼び出しだってことだけだよね? そしてそれは実装上じつは、
ループで済んでしまうのでしたぁ!!!!!ってことだけだよね?
0058デフォルトの名無しさん
NGNG日本語が何かいい壊れ具合。加えて2chデビューしたのも良い気分。
酒飲んで酔っ払って井幾分。今日、Common lispに校夷狄な書き込みしたのは
同一人物だ。みん適当な書き方でなですまん。そのうち埋め合わせするつもりだ。
0059デフォルトの名無しさん
NGNGCommonLispはほとんど使ったことがないのだが,話によると
関数と変数の名前空間が違うとのことだそうで.
それって関数もデータとして扱う関数型言語として非常によろしくないような気が….
商用Schemeが少ないのは少々困りものだが,まぁローカルでごにょごにょ書くときは
slibもあるしsrfiもあるし,まぁ無駄に多くプログラムを書く必要性は少なそうね.
0060デフォルトの名無しさん
NGNG> 求めるものが可読性とかなら、勝手にそういうふううに書いとけば、最低限,
> 結果は正しくなるとおもいます。
そういえばそうだなあ。性能もやっぱり気になるんだよなあ。
100Mくらいあるログファイルをがーっとなめる処理なんかを
よくtail callでがしがし書くんだけど、それがproper tail recursion
で実行されてないとなると、やっぱり気がひけるんだなあ。
0061デフォルトの名無しさん
NGNGsymbol-functionとsymbol-valueが別にある、
ってのはSteeleも「やめておけば良かった」点として上げてるね。
けど、互換性考えると"Common" Lispとしては、
そういうわけにいかなかったと思うけど。
0062デフォルトの名無しさん
NGNG実行速度よりもスタック消費無しというのが重要なんじゃないのか?
スタック喰い潰して途中終了という事がなくなる。
ちなみにcommon lispでもコンパイラは大抵そのように扱ってくれるので
問題があればコンパイルすれば大抵大丈夫。
0063デフォルトの名無しさん
NGNG> というか、X3J13規格(って言うんだっけ?)そのものに、規格制定時に
> もめた事項、つまりだれかが文句を言って、それが採択されたりした経緯
> もあわせて収録されていると思います。
それがCLtLで、>>44のHyperSpecとは違うんじゃない?
これnoteやrationaleが全くないよね。
0064デフォルトの名無しさん
NGNG> symbol-functionとsymbol-valueが別にある、
> ってのはSteeleも「やめておけば良かった」点として上げてるね。
いまさらながら Emacs Lisp を使いこなそうと思ってドキュメントを読んでます。
Scheme では symbol は function と value を別にもつって事はないのですか??
0065デフォルトの名無しさん
NGNG文字列のなかから、特定の文字列が含まれるときにtrueを返す関数って
ないでしょうか?
たとえば、
str1="ようこそ2ちゃんねるへ"
str2="ようこそ15ちゃんねるへ"
str3="2ちゃん"
で、str1とstr3で比較するとtrue、
str2とstr3で比較するとfalseが返る感じです。
おながいします
0066デフォルトの名無しさん
NGNGvb質問に書き直します
006747, 49, 53, 58
NGNGまったくそのとおりだね。返すことばもありません。
>> 63
いわゆるHyperSpec
http://www.xanalys.com/software_tools/reference/HyperSpec/Front/index.htm
の本文は、(いろんな意味での間違いとかヤな部分も含めて)X3J13規格書そのもの。
そんでそれプラス独自にrationale見たいな感じでだれそれがこんなこと云ってました、そんでそれが採用されましたというのも含まれています(あれ、ANSIの規格書
にもこれは含まれているのかな)。
いま思い出したんだけど、CLtL2が出版されたあとで変更になったこととか
あるから、規格書を見た方がよいという理屈も comp.lang.lisp ではされたいたな。
読みやすさの問題があるだろうけど、いちおう「ルール」としては規格書を見るのが
普通だよね。(K&R vs. ISO C みたいな構図?)
0068デフォルトの名無しさん
NGNG006967
NGNGX3J13はANSIという組織にあるCommon Lispの規格を決める委員会だとおもう。
0070デフォルトの名無しさん
NGNG0071デフォルトの名無しさん
NGNG志を高く持て
007270
NGNG0073デフォルトの名無しさん
NGNG(call/cc (lambda (c) (0 (c 1)))) => 1
DrScheme だと 1 になって、Guile だとエラーになりました。
これはいかがなものか。
0074デフォルトの名無しさん
NGNGオレはそのままでいいと思う。それは揚げ足取りというか、
実際に問題になることはないんじゃねーの?
007573
NGNGたしかに。気にする程の事でもないですね。
ところで Lisp 使いの人って、オブジェクト指向をどう捉えてるんでしょ。
別に激しく議論する程のものでもないと思ってるのかな。
自分はオブジェクトとして扱うと便利かな? と思う時に使う程度。
抽象化の過程で無意識にオブジェクトとして扱っている場合も多いん
でしょうけど。
0076名無しさん@Emacs
NGNG1.シンボルを関数と値の二つを持つから、変数名に car とか list とか気がねなく使える.
(cf. Scheme の好きなところ 1)
2.(defun "ドキュメント" (arg) body) みたいに、ドキュメントを入れられる.
(他人の src 読むとき非常に便利)
3.keyword 引数.
4.コンパイルできる.
Scheme の好きなところ
1.(defun foo (f) (funcall f)) じゃなくて (define (foo f) (f)).
(cf. Common Lisp の好きなところ 1)
2.continuation.
007776
NGNGScheme の好きなところ
3.コンパイルしなくても末尾再起.
0078デフォルトの名無しさん
NGNG評価器の作りの違い。
オペレーターに対しての評価成否をどこで判定してるかの差。
0079デフォルトの名無しさん
NGNGしつも〜ん。
> (call/cc (lambda (c) (0 (c 1))))
0なんて関数は(ふつう)定義されていないから、エラーになるという解釈と、
それ以前に引数の評価で continuation を呼び出しいるために1がそのまま返される
という解釈?
0080デフォルトの名無しさん
NGNG0081デフォルトの名無しさん
NGNG4.1.3 Procedure callsにあるように
oprator, oprandの評価順は"in an unspecified order"だから、
Dr.Schemeもguileも仕様通りの実装。
>>73のコードが実装依存なだけと思われ
008273
NGNGThe operator and operand expressions are evaluated (in an unspecified
order) and the resulting procedure is passed the resulting arguments.
オペレータとオペランドの式は評価され (unspecified な順で)、結果の
手続きが結果の引数をパスされる。 ; ひどい訳だ
と書かれていますよね。ってことは、0 が procedure として引数をパス
される前に (c 1) は評価されるべきなのでは?
0083デフォルトの名無しさん
NGNGその英文だけから判断すると、0と(c 1)は unspecified な順で、つまりどっちが
先かは処理系に依存する順番にevalされてってことだから、やぱーりエラーになるか
1が返されるかは、処理系依存だろ。0でさえもevalされてから
オペレータオブジェクトみないなものになってから(漏れは scheme 用語知らん)
呼び出される。
008483
NGNG0085デフォルトの名無しさん
NGNGという罠?
0086デフォルトの名無しさん
NGNGこれについて、Will Clingerがdenotational semanticsをがしがし
計算して、1を返す(もしくはメモリがあふれる)のが正しいって
いってるんですがサパーリ理解できません。
http://www.ccs.neu.edu/home/will/Personal/Nerdliness/callcc.txt
008781
NGNGいや、Lispと違って、Schemeは、
(f x1 x2 x3 ...)のfもevalされてからapplyするの。
>>86
ああ、7.2 Formal semanticsがおかしいんじゃねーの? って話か。
確かに"runs out of memory"になるsemantics付けはおかしいな〜。
まあ⊥には違いないわけだが(w
どうやったらfixされるかは書いてないね。
0089デフォルトの名無しさん
NGNG(define x '(a b c))
(set-cdr! (cddr x) (list 'd))
2つ目のリストは、なぜ (a b c d)なのでしょうか?
(cddr x) => (c) なのだから、2つ目のリストは(c d) になる
ように思うのですが!?
0090デフォルトの名無しさん
NGNG2つ目のリストってのは何のこと?
1行目で(a b c)というリストが作られて、2行目でそれを変更してるだけでわ?
0091デフォルトの名無しさん
NGNG質問が少し間違いました。
[1] (define x '(a b c)) => x
[2] (set-cdr! (cddr x) (list 'd))
[3] x => (a b c d)
なぜ[3]は(c d) ではないのでしょうか? という質問でした。
(あっ!)すいません。今、理解できました。リストxの
3つめのアトムにset-cdr! するのですね。だから(a b c d)。
お騒がせしました(^^;
0092ななしLisp@それだけ
NGNG(setf (cdddr x) (list 'd))
0093デフォルトの名無しさん
NGNGconstant listを変更しちゃいかーん。
Schemeだとホントはset-cdr!の時点でエラーになるべき。
Common Lispだと定数リストを変更した場合の動作は未定義だっけ。
0094デフォルトの名無しさん
NGNGScheme初学者(89書き込みました)です。89は本の例題でした。
ところで、なぜ「 constant listを変更しちゃいかーん。」の
でしょうか?その辺が関数プログラミングの真髄ですか??
関数プログラミングの利点を知りたいな。。。
0095デフォルトの名無しさん
NGNGその本何ですか。
とりあえず、Schemeでそれをやっちゃいけないフォーマルな根拠は
R5RSのsection 3.4 "Storage model" の最後のパラグラフ。
Constant list (literal listの値)を変更してはいけない理由は、
- そういうオブジェクトはコンパイルされた時read-only memoryに
置かれる可能性がある (ハード的なROMというわけではなく、text
regionなどの変更不可なエリアも含む)。
- コンパイラは最適化によって、そういうオブジェクトをプログラムの
他のデータと共有することもある。破壊的操作をすると思わぬ箇所に
影響が出る可能性がある。
後者は最近、comp.lang.lispで「一行づつ実行すると動くのに関数に
まとめると動かない!」って誰か悩んでいたな。
(setq x (list 'a 'b 'c))
(set-cdr! (cddr x) (list 'd))
なら良い。
0096デフォルトの名無しさん
NGNG犬飼さんの「入門Scheme」のPDFバージョンのp.35です。ただし、
このようにコーディングせよと説明している訳ではなく、
set-cdr! set-car! の使用例としてあげられています。
http://www4.ocn.ne.jp/~inukai/scheme_primer_j.html
Constant list というのは、'(a b c d) のことですか?
'(a b c d) と (list 'a 'b 'c 'd) は同じと思ってましたが。。
0097デフォルトの名無しさん
NGNG> The consequences are undefined if literal objects (including
> quoted objects) are destructively modified.
ちなみにHyperSpecではliteralにリンクが張ってあって、 次のような
glossaryにあるliteralの定義に跳びます。
literal adj. (of an object) referenced directly in a program
rather than being computed by the program; that is, appearing
as data in a quote form, or, if the object is a self-evaluating
object, appearing as unquoted data. ``In the form (cons "one"
'("two")), the expressions "one", ("two"), and "two" are
literal objects.''
こりゃいいやね〜。
009893=95
NGNGもちろん、
(equal? '(a b c d) (list 'a 'b 'c 'd)) ==> #t
です。そういう意味では同じ。ただ、(list 'a 'b 'c 'd)は評価される
たびに新しいリストが作られることが保証されているのに対し、
'(a b c d)はコンパイラがあらかじめどっかにリストを作っておいて
そのポインタを返すだけ、とするかもしれない(処理系依存)。
(define (foo) (list 'a 'b 'c 'd))
(equal? (foo) (foo)) ==> #t
(eq? (foo) (foo)) ==> 常に#f
(define (foo) '(a b c d))
(eq? (foo) (foo)) ==> #tかもしれない
0099デフォルトの名無しさん
NGNGCommon Lisp には、eq, eql equal, equalpの4つ。
0100デフォルトの名無しさん
NGNGequalpってなんだっけ?
schemeでは
eq? (= eq)
eqv? (= eql)
equal? (= equal)
の3つだけ。
あとはmemq,memv,member/assq,assv,assocみたいに
比較形式毎に関数が用意されてるとか。
0101デフォルトの名無しさん
NGNGhttp://www.xanalys.com/software_tools/reference/HyperSpec/Body/f_equalp.htm
かいつまんでいうと、
数の型は無視して、数の数学的な値で比較。
文字の大文字と小文字を区別しない。
conse, array, structure, hash table などは中身をequalpで比較。
■ このスレッドは過去ログ倉庫に格納されています