トップページ⇒tech
982コメント359KB

LISP Scheme Part5

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさんNGNG
過去スレ
Part1: 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デフォルトの名無しさんNGNG
□仕様書関係□

Common 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デフォルトの名無しさんNGNG
□SICP関係□

SICP(英語)
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デフォルトの名無しさんNGNG
□その他□

Schemeで書かれた正規表現ライブラリ
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
http://mitpress.mit.edu/sicp/psets/ps4hnd/readme.html
の使い方教えてください。
0007デフォルトの名無しさんNGNG
Scheme 処理系に追加( Scheme 処理系を自作したい人向け)。

Minischeme: 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使いの名無しさんNGNG
スレたてお疲れ様です>1
0009デフォルトの名無しさん NGNG
>>1
お疲れ〜〜
00101NGNG
結局別アカウントで立ててきました。
いつのまにか5スレ目突入です。
0011デフォルトの名無しさんNGNG
SchemeのコードからJavaVMのアセンブリ言語を出力するコンパイラがあれば
誰かしら喜ぶかなぁ?
0012デフォルトの名無しさんNGNG
>>11
つーか、kawaで検索かも。
0013Lisp使いの名無しさんNGNG
kawaって言うとJEmacsとか言うのがついてくるけど、
使い方キボンヌ。
001411NGNG
うっ,既にあるのか….
自分で開発するのも楽しそうだと思ったのだが,
まぁ利用させてもらおうっと.
0015デフォルトの名無しさんNGNG
竹内郁雄が、月刊 ASCII 6月号の対談で、
(ガイ・スティールが)「何か記憶に残るプログラムを
書いたかというと、どうもピンと来ない。」

って言ってるけど、そうなの?

0016デフォルトの名無しさんNGNG
Lisp で複数人開発ってした事ないんだけど、誰かいますか?
なんか感じた事があれば教えてプリーズ。
0017デフォルトの名無しさんNGNG
>>16
car, cdr を使うか first, rest を使うかでもめたことがあります
001816NGNG
>>17
ありがとう。わかりやすいテーマですね...
0019デフォルトの名無しさんNGNG
>>17
>first, rest
これ使ってる人いるの?
0020デフォルトの名無しさんNGNG
>>18
ごめん、ちゃちゃだね。

とりあえず、複数人での開発とういう観点では、
ダイナミックスコープであることを意識しておかないとひどい目に
会うことがある、というかひどい目にあったことがあります。
それと、属性リストは使わないほうがよいと思います。パッケージ
を分けていない場合、複数の人が使ったときに破綻してしまうし、
ソースコード上わかりにくいので。
0021デフォルトの名無しさんNGNG
お前ら的にこのコードは読んでおけ!というSchemeソースを紹介してください
002216NGNG
>>20
参考になります。ひどい目にあったというのは free variable を参照
する時でしょうか? マクロとの兼ね合いもありそうですが。

>>21
SICP と R5RS で十分だと思いますよ。
0023デフォルトの名無しさんNGNG
>>16
2〜4人で開発したこと(CommonLisp, Scheme) は何度かあります。
Lispハッカーの人は、コメントをほとんど書かないか詳細に書くかの2極に分かれる
ように感じました。コメントを書かない人は、きっと頭の中にロジックが収まって
いるのでしょう。ただコメント無しで高階関数を使いまくられると、ぱっと見た時
関数がどんな関数を受け取ることを仮定してるのかわからないんでつらいです。
分かりやすさという点ではなるべくオブジェクト渡しにしておく方が良いですね。
0024デフォルトの名無しさんNGNG
>>15
RABBITってScheme compilerは、Steeleの作。
最低限のprimitiveにprogram変換しといてからってやつ。

http://citeseer.nj.nec.com/context/1162426/0
こういう評価。古典だな。
0025デフォルトの名無しさんNGNG
Debianでapt-get upgradeしたらDrSchemeがカコヨクなてたsage

0026デフォルトの名無しさんNGNG
apt-cache search しても DrSchemeなんてないYO!
0027デフォルトの名無しさんNGNG
>>26
potatoだとない。woody/sidには入ってる。
002816NGNG
>>23
なるほど。名前空間の管理は特に問題ありませんでしたか?
複数人で開発するとなると命名規則を作ったり、名前にプレフィックス
が必要になったりしそうな気がしますが。
0029デフォルトの名無しさんNGNG
>>28
LISPだと名前空間は問題にならないんでは?
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デフォルトの名無しさんNGNG
Shiroさんage
0031デフォルトの名無しさんNGNG
>>28
こちらでは ACL を使っているので、命名規則は ACL に習って、
public な変数: *foo*
public な関数: foo (そのまま)
private な変数: .foo.
private な関数: .foo
にしています。

>>29
Common-Lisp の package って、

(mypackage::private-function)

のように :: を使えば private な領域にアクセスできてしまうのが
困ると言えば困りませんか?微妙な問題だと思いますが。
0032デフォルトの名無しさんNGNG
そういえばSchemeって構造体が無いの?
全部リストにしていたけど,今更ながら違和感を覚えた.
0033デフォルトの名無しさんNGNG
>>32
クロージャでもベクターでも作れますが何か?
0034デフォルトの名無しさんNGNG
>>32
リストで何か問題でも?


つっても、まあ気持ちはわかる。
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
003534NGNG
しまった、member1 member2はx yと置き換えて読んでね。
0036デフォルトの名無しさん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デフォルトの名無しさんNGNG
Internet Draft
http://theory.lcs.mit.edu/~rivest/sexp.txt
Expire してるけど、S式好きとしてはなるほどと思う。
世の中ぜんぶS式になっちゃえ!アヒャ
0038デフォルトの名無しさんNGNG
>>32
ちょっと大きなシステムを組む時は、構造体っぽいwrapperがあったほうが
圧倒的に便利と思われ。
ポータビリティ重視ならSRFI-9か。
http://srfi.schemers.org/srfi-9/srfi-9.html
0039デフォルトの名無しさんNGNG
>> 31
> :: を使えば private な領域にアクセスできてしまうのが
> 困ると言えば困りませんか?

非常時以外はそういうことをしない、というルールを
徹底できれば…

モジュール間のインタフェースを摺り合わせつつ開発してて、
別モジュールのあれは非公開だけど使ったらインタフェースが
すっきりするんじゃないか、と思い付いた時に、わざわざその
モジュールに公開してもらう前に試せる、というのが便利なんですよね。

建前では「そんなことはケシカラン」のですが、「本当にそのように
インタフェースを変更することが有効か」を検証するためには
一度組んでみなければならない場合もあるわけで。
iterativeに開発してて、明日デモらなくちゃならんとかいう
追い込みの時は特に…

そういう意味では実にハック向けの言語ですね。

デモが終ったらそういうハックを忘れてそのままにしてしまう
危険はありますが。
0040デフォルトの名無しさんNGNG
>>38
リンク見れないんですが。
0041デフォルトの名無しさんNGNG
>>36
named-letはinternal-defineやletrecと同じ扱いなので、
その例では末尾再帰です。
0042デフォルトの名無しさんNGNG
JavaとLISPって相性良さそうだね。
ガーベジコレクションを意識する必要ないだけで、かなり。
0043デフォルトの名無しさんNGNG
>>42
もちょっと詳しい解説きぼん
0044デフォルトの名無しさんNGNG
>>3
Common Lisp の仕様書としては、いわゆる HyperSpec
http://www.xanalys.com/software_tools/reference/HyperSpec/Front/index.htm
のほうが正規のものだとおもいます。
0045デフォルトの名無しさんNGNG
妙に c がおおいc なぁco2-→-c3   -o2       
                        
0046デフォルトの名無しさんNGNG
>>42
意識する必要のあるGC萌え
0047デフォルトの名無しさんNGNG
非常に感覚的な話なんですが、どうも日本では Scheme のほうが
Common 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
僕は脳味噌の記憶容量が少ないので、Scheme の方が好きです。
規格はあまり気にしてないかな。Common Lisp も嫌いではありませんが、
よくわからんので中途半端にしか使えません。Emacs Lisp は書けます。
0049デフォルトの名無しさんNGNG
>> 48
はっきりいって、Schemeの各処理系もR5RSだけでは耐え切れなくて
Common Lisp にあるような機能を独自に拡張したり、
ど忘れしてしまったけど、ユーザーレベルの規格みたいなものを決めていこうと
いう動きがあるよね?

それだったら、とりあえず Common Lisp を使ってしまって、いいんじゃないの? と思うんだけど。 Kyoto Common Lisp を書いた偉い先生もたしか、
エッセイで「アメリカは嘘っぽいことをもっともらしく言うけど、
結果オーライで、Lispプログラムの互換性がとれればまぁ、我慢できるかな」
みたいなことを言っていたのを読みました。

Common Lisp の制定時に、金がからんだり、政治的な思惑があったらしい
ということは、当時者ではないので、詳しくは知らないけど、噂レベルでは
知っています。(漏れはcomp.lang.lispをたまに読んでいるので、Common Lisp 制定時のEditor だった KMP さんがいろいろ昔話をするのを読んだりして、その当時の雰囲気を察しています。当然一方的になるのは承知ですので、カンウンター情報希望。)
005048NGNG
>>49
他人の定義した関数を調べるよりも、自分でササッと書いてしまった方が
楽な場合が多いので、あえて Common Lisp を使う気になれないんです。
もし多くの処理系で動作する事が最重要課題のひとつであるならば、
Common Lisp を使いますよ。

あとは、Scheme の proper tail recursion の存在が非常に大きいです。
全ての Common Lisp 処理系でこれが使えたら、Common Lisp を選んで
いたと思います。
0051デフォルトの名無しさんNGNG
>>44
「正規」どういう意味?
こっちがX3J13で採用されたんだっけ?

>>49
CLtL読んだ?
Common Lisp誕生については、共立のbitのバックナンバーも読んでね。
竹内さんがCommon Lispのヤな所を書いた記事もあったはず。

俺はCommon LispはCLOS以外忘れた。
0052デフォルトの名無しさんNGNG
>>11
亀レスだが、biglooもどうぞ。
0053デフォルトの名無しさんNGNG
>> 48
> あとは、Scheme の proper tail recursion の存在が非常に大きいです。
これはたしかに、Common Lisp の規格には含まれていません。
しかし、これってそんなに必要っていうか、重要でしょうか?
proper tail recursionが保証されているっていうのは、
プログラムのその部分の実行速度が高速になるという思惑があるんですよね?
現在、すでにかなり酒を飲んでいるので、厳密な書き方が不可能なんですが(すいませんはっきり言って変なこと言っても見逃してくれモードに入っています)、
proper tail recursionとか言っても、なんか、foo-BANGみたいな
むりやり別の関数を定義して、accumulator変数、(つまり結果を累積するための変数)なんかを引数としてとる関数を別に定義したりする必要が出て来たり
しませんか?
漏れはそんなことするくらい実行速度を速くしたいなら、そこだけ、Cなり、
アセンブラなりで記述すえばいいと思います。
あぁぁ、今これを書いていて、なんだか知らないけど、Mozillaのメールウィンドウが馬鹿みたいに立ち上がって、今まで書いたことが無駄になりそうに
なったので、とりあえずこれだけを送信します。(はっきりいって2ch初心者です。)

0054デフォルトの名無しさんNGNG

Arc   
005548NGNG
>>53
僕が proper tail recursion に期待しているのは、実行速度ではなく
可読性と記述性です。他の言語を使用していていると、proper tail
recursion ならスッキリ書けるものをわざわざ汚いループ構文や
制御変数を使ってバグの元を作らなければならない事態にストレスが
たまるんですよ。
0056デフォルトの名無しさんNGNG
>>51
> >>44
> 「正規」どういう意味?
> こっちがX3J13で採用されたんだっけ?
というか、X3J13規格(って言うんだっけ?)そのものに、規格制定時に
もめた事項、つまりだれかが文句を言って、それが採択されたりした経緯
もあわせて収録されていると思います。

comp.lang.lispの雰囲気では、 CLtL1もしくは2を元になにか言おうとすると、「1は規格を制定した団体が認めたものだけど、2はちがうよ、
規格そのものを見てね」みたいな雰囲気です。でもこれは一日本人が
つたない英語理解能力で解釈したものです。

> Common Lisp誕生については、共立のbitのバックナンバーも読んでね。
> 竹内さんがCommon Lispのヤな所を書いた記事もあったはず。
ここは確か、書店でCommon Lispという書名で分厚い本を見た記憶があるのですが実際には読んでいません。(翻訳を誰がやったのかとか、他のコンピュータ
関連の日本語訳でいたい目にあって段々翻訳を信用しなくなっていた時期なので読んでいません。残念です。でも竹内先生の「はじめての人のためのLisp」は
最初に読んだLisp啓蒙書なのでなんだか良い気持。{でも最初は何内輪受けしてんだこの学者野郎ーという感想})




0057デフォルトの名無しさんNGNG
>> 48
> 僕が proper tail recursion に期待しているのは、実行速度ではなく
> 可読性と記述性です。他の言語を使用していていると、proper tail
> recursion ならスッキリ書けるものをわざわざ汚いループ構文や
> 制御変数を使ってバグの元を作らなければならない事態にストレスが
> たまるんですよ。
求めるものが可読性とかなら、勝手にそういうふううに書いとけば、最低限,
結果は正しくなるとおもいます。というか、だって、proper tail recursion
って、(速度はどうだっていいっていうのなら)、その関数内で、実行するのがその関数への呼び出しだってことだけだよね? そしてそれは実装上じつは、
ループで済んでしまうのでしたぁ!!!!!ってことだけだよね?




0058デフォルトの名無しさんNGNG
あぁ、みんな軟化書き込んでくれ、っていうか漏れはDebian使ってるんだが、
日本語が何かいい壊れ具合。加えて2chデビューしたのも良い気分。
酒飲んで酔っ払って井幾分。今日、Common lispに校夷狄な書き込みしたのは
同一人物だ。みん適当な書き方でなですまん。そのうち埋め合わせするつもりだ。
0059デフォルトの名無しさんNGNG
俺がSchemeの方を使っているのはSICPの影響かな.
CommonLispはほとんど使ったことがないのだが,話によると
関数と変数の名前空間が違うとのことだそうで.
それって関数もデータとして扱う関数型言語として非常によろしくないような気が….

商用Schemeが少ないのは少々困りものだが,まぁローカルでごにょごにょ書くときは
slibもあるしsrfiもあるし,まぁ無駄に多くプログラムを書く必要性は少なそうね.
0060デフォルトの名無しさんNGNG
>>57
> 求めるものが可読性とかなら、勝手にそういうふううに書いとけば、最低限,
> 結果は正しくなるとおもいます。

そういえばそうだなあ。性能もやっぱり気になるんだよなあ。
100Mくらいあるログファイルをがーっとなめる処理なんかを
よくtail callでがしがし書くんだけど、それがproper tail recursion
で実行されてないとなると、やっぱり気がひけるんだなあ。
0061デフォルトの名無しさんNGNG
>>59
symbol-functionとsymbol-valueが別にある、
ってのはSteeleも「やめておけば良かった」点として上げてるね。
けど、互換性考えると"Common" Lispとしては、
そういうわけにいかなかったと思うけど。
0062デフォルトの名無しさんNGNG
proper tail recursionがtail recursive callがloopになるという意味なら
実行速度よりもスタック消費無しというのが重要なんじゃないのか?
スタック喰い潰して途中終了という事がなくなる。
ちなみにcommon lispでもコンパイラは大抵そのように扱ってくれるので
問題があればコンパイルすれば大抵大丈夫。

0063デフォルトの名無しさんNGNG
>>56
> というか、X3J13規格(って言うんだっけ?)そのものに、規格制定時に
> もめた事項、つまりだれかが文句を言って、それが採択されたりした経緯
> もあわせて収録されていると思います。

それがCLtLで、>>44のHyperSpecとは違うんじゃない?
これnoteやrationaleが全くないよね。
0064デフォルトの名無しさんNGNG
>61
> 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デフォルトの名無しさんNGNG
すいません>>65は誤爆です。無視してください。
vb質問に書き直します
006747, 49, 53, 58NGNG
>> 62
まったくそのとおりだね。返すことばもありません。

>> 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デフォルトの名無しさんNGNG
X3J13とANSIって、なんかちがうの?
006967NGNG
すんまそ。67では両方とも同じ意味で書きました。ANSIは組織のおおもと。
X3J13はANSIという組織にあるCommon Lispの規格を決める委員会だとおもう。
0070デフォルトの名無しさんNGNG
70ゲットオォズザ
0071デフォルトの名無しさんNGNG
>>70
志を高く持て
007270NGNG
Part4 に書き込んでる人がいたので、あんなことやりました。
0073デフォルトの名無しさんNGNG
comp.lang.scheme で話題になってる問題。

(call/cc (lambda (c) (0 (c 1)))) => 1

DrScheme だと 1 になって、Guile だとエラーになりました。
これはいかがなものか。
0074デフォルトの名無しさんNGNG
>>73
オレはそのままでいいと思う。それは揚げ足取りというか、
実際に問題になることはないんじゃねーの?
007573NGNG
>>74
たしかに。気にする程の事でもないですね。

ところで Lisp 使いの人って、オブジェクト指向をどう捉えてるんでしょ。
別に激しく議論する程のものでもないと思ってるのかな。
自分はオブジェクトとして扱うと便利かな? と思う時に使う程度。
抽象化の過程で無意識にオブジェクトとして扱っている場合も多いん
でしょうけど。
0076名無しさん@EmacsNGNG
Common Lisp の好きなところ
1.シンボルを関数と値の二つを持つから、変数名に 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.
007776NGNG
追加
Scheme の好きなところ
3.コンパイルしなくても末尾再起.
0078デフォルトの名無しさんNGNG
>>73
評価器の作りの違い。
オペレーターに対しての評価成否をどこで判定してるかの差。
0079デフォルトの名無しさんNGNG
>>78
しつも〜ん。
> (call/cc (lambda (c) (0 (c 1))))
0なんて関数は(ふつう)定義されていないから、エラーになるという解釈と、
それ以前に引数の評価で continuation を呼び出しいるために1がそのまま返される
という解釈?
0080デフォルトの名無しさんNGNG
80ゲトズザ
0081デフォルトの名無しさんNGNG
>>73
4.1.3 Procedure callsにあるように
oprator, oprandの評価順は"in an unspecified order"だから、
Dr.Schemeもguileも仕様通りの実装。
>>73のコードが実装依存なだけと思われ
008273NGNG
R5RS:
The 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
>>73
その英文だけから判断すると、0と(c 1)は unspecified な順で、つまりどっちが
先かは処理系に依存する順番にevalされてってことだから、やぱーりエラーになるか
1が返されるかは、処理系依存だろ。0でさえもevalされてから
オペレータオブジェクトみないなものになってから(漏れは scheme 用語知らん)
呼び出される。
008483NGNG
ごめん、82を73とまちがえちゃった。
0085デフォルトの名無しさんNGNG
つーかもしかして「0って数字だからformの先頭にあったらだめですよ」
という罠?
0086デフォルトの名無しさんNGNG
>>73
これについて、Will Clingerがdenotational semanticsをがしがし
計算して、1を返す(もしくはメモリがあふれる)のが正しいって
いってるんですがサパーリ理解できません。

http://www.ccs.neu.edu/home/will/Personal/Nerdliness/callcc.txt
008781NGNG
>>82
いや、Lispと違って、Schemeは、
(f x1 x2 x3 ...)のfもevalされてからapplyするの。

>>86
ああ、7.2 Formal semanticsがおかしいんじゃねーの? って話か。
確かに"runs out of memory"になるsemantics付けはおかしいな〜。
まあ⊥には違いないわけだが(w
どうやったらfixされるかは書いてないね。
008882NGNG
>>87
それは知っとるよ。要は 0 が procedure である事を要求されるのが
apply 時が eval 時かって事でしょ?

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デフォルトの名無しさんNGNG
>>89
2つ目のリストってのは何のこと?

1行目で(a b c)というリストが作られて、2行目でそれを変更してるだけでわ?
0091デフォルトの名無しさんNGNG
>>90
質問が少し間違いました。

[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
(setq x '(a b c))
(setf (cdddr x) (list 'd))
0093デフォルトの名無しさんNGNG
>>89 >>92
constant listを変更しちゃいかーん。
Schemeだとホントはset-cdr!の時点でエラーになるべき。
Common Lispだと定数リストを変更した場合の動作は未定義だっけ。
0094デフォルトの名無しさんNGNG
>>93
Scheme初学者(89書き込みました)です。89は本の例題でした。
ところで、なぜ「 constant listを変更しちゃいかーん。」の
でしょうか?その辺が関数プログラミングの真髄ですか??

関数プログラミングの利点を知りたいな。。。
0095デフォルトの名無しさんNGNG
>>94
その本何ですか。
とりあえず、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
>>95
犬飼さんの「入門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
Common Lisp 規格のSpecial Operator QUOTE の項から。
> 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=95NGNG
>>96
もちろん、
(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デフォルトの名無しさんNGNG
Scheme で eq? 系のオペレータってどれくらいあるの?
Common Lisp には、eq, eql equal, equalpの4つ。
0100デフォルトの名無しさんNGNG
>>99
equalpってなんだっけ?
schemeでは
eq? (= eq)
eqv? (= eql)
equal? (= equal)
の3つだけ。
あとはmemq,memv,member/assq,assv,assocみたいに
比較形式毎に関数が用意されてるとか。
0101デフォルトの名無しさんNGNG
正式な定義は以下をどうぞ。
http://www.xanalys.com/software_tools/reference/HyperSpec/Body/f_equalp.htm
かいつまんでいうと、
数の型は無視して、数の数学的な値で比較。
文字の大文字と小文字を区別しない。
conse, array, structure, hash table などは中身をequalpで比較。
■ このスレッドは過去ログ倉庫に格納されています