[Q] 最近はcar/cdrの代りにfirst/restというのが今時なのでしょうか?
それともCommon Lispだけの方言と思えばよいのでしょうか?
#「クラブとディスコ」以来の衝撃を受け中...
noj...@taito.co.jpさん:
> [Q] 最近はcar/cdrの代りにfirst/restというのが今時なのでしょうか?
> それともCommon Lispだけの方言と思えばよいのでしょうか?
CommonLispから始まって最近のLispはこういう感じなのかな。
でもcaddrとか書きたいですよね。 久野
ku...@gssm.otsuka.tsukuba.ac.jp wrote:
> noj...@taito.co.jpさん:
>> [Q] 最近はcar/cdrの代りにfirst/restというのが今時なのでしょうか?
>> それともCommon Lispだけの方言と思えばよいのでしょうか?
>
> CommonLispから始まって最近のLispはこういう感じなのかな。
LISP のコミュニティーに属していないし、最近のコードを詳しく読んで
いないので、今時の潮流はわかりませんが、car/cdr は今でも普通に使
うものだと思ってました。
first, second...tenth の文脈の中で first, rest を使うのは
あるかもしれないけれど(nth や nthcdr ってのもあるわな)。
> でもcaddrとか書きたいですよね。 久野
ただ、「cadr は例外的に使われるけれど、ca[ad]*r 表記を人に読ませ
るようなコードに書くのはいただけないネェ」っつぅような話はどこかで
読んだ気が……
まあ、こういうときに first...tenth (or nth) を使うってものな
のかもしれない。
--
「十分間で決断し、短い理由を添えよ」
A.I.Soft, Inc. CS・品質推進課 成田隆興
ku...@gssm.otsuka.tsukuba.ac.jp writes:
知り合いも同じこと言ってました。
やろうと思えばfirest,firrest,firrrestとかを実装...(ウソです)
あとでわかったのですが、このfirst/restの議論って、随分昔からあるみたいですね。
> Subject:CAR/CDR vs FIRST/REST (was Re: Book review: "Lisp Style and Design")
> Newsgroups:comp.lang.lisp
> Date:1992-04-27 13:41:27 PST
http://groups.google.co.jp/groups?hl=ja&lr=&ie=UTF-8&inlang=ja&c2coff=1&th=381d70c597d083eb&rnum=4
(mapcarの名前どうすんだとか、宗教論争だとか言ってますが)
ただ、/.jpあたりにcar/cdrで書いたら失笑されたという話↓
http://slashdot.jp/comments.pl?sid=157845&cid=496382
もあり、ちょっと心配になった次第です。
というわけで、最近はfirst/restとまずは言ってみるのが今時なのかなぁと
思いました。Lispを実際に使って仕事している人達にはどんな感じなのでしょうか。
#自分はemacsぐらいしかlispっぽいものを知らないのでcar/cdrが安心。
In article <c0pjhm$16...@utogw.gssm.otsuka.tsukuba.ac.jp>, ku...@gssm.otsuka.tsukuba.ac.jp wrote:
>久野です。
>
>noj...@taito.co.jpさん:
>> [Q] 最近はcar/cdrの代りにfirst/restというのが今時なのでしょうか?
>> それともCommon Lispだけの方言と思えばよいのでしょうか?
>
> CommonLispから始まって最近のLispはこういう感じなのかな。
そもそも単に読み易さ (readability) だけの問題なんですが...
尚,first, ..., は CommonLisp 以前から使われていました.CommonLisp
はそれを追認して正式に導入しただけです.
> でもcaddrとか書きたいですよね。 久野
cad*r の形のものに関しては,d が増えて,読む度に d の個数を数えな
きゃならないってんじゃぁあんまりだから,first, ... が用意された,と
理解しています.それ以外の形のものはそのまま使えばいいし,n-th の意
味ではない場合も cad*r を使えばいいと思います.
#cadddddr とか caddddddr なんてのは誰も読みたくないでしょ?
--
Hideki Kato <mailto:ka...@pop12.odn.ne.jp>
----== Posted via Newsfeed.Com - Unlimited-Uncensored-Secure Usenet News==----
http://www.newsfeed.com The #1 Newsgroup Service in the World! >100,000 Newsgroups
---= 19 East/West-Coast Specialized Servers - Total Privacy via Encryption =---
In article <40307b1a.6913%ka...@pop12.odn.ne.jp>, Hideki Kato <ka...@pop12.odn.ne.jp> writes
> cad*r の形のものに関しては,d が増えて,読む度に d の個数を数えな
> きゃならないってんじゃぁあんまりだから,first, ... が用意された,と
> 理解しています.それ以外の形のものはそのまま使えばいいし,n-th の意
> 味ではない場合も cad*r を使えばいいと思います.
今の学生に書かせると、defstruct して、setf しかしないので、
car,cdr は、ほとんど意味ないですね。rplcdr とか nconc とか...
今から考えると、append するのに linear order ってのもあれ
なんだけど、既存の queue library とか使うと、これもなんか
大きくて重くて。
ところが、
s += "</item1>";
とか書いてあっても、あまり気にならないみたい。よくわからん。
---
Shinji KONO @ Information Engineering, University of the Ryukyus
河野真治 @ 琉球大学工学部情報工学科
> 成田です。
> >> [Q] 最近はcar/cdrの代りにfirst/restというのが今時なのでしょうか?
> >> それともCommon Lispだけの方言と思えばよいのでしょうか?
> >
> > CommonLispから始まって最近のLispはこういう感じなのかな。
>
> LISP のコミュニティーに属していないし、最近のコードを詳しく読んで
> いないので、今時の潮流はわかりませんが、car/cdr は今でも普通に使
> うものだと思ってました。
Winston-Horn の教科書 Lisp 2nd Ed (1988) が既に car/cdr を使ってなかったです。
http://portal.acm.org/citation.cfm?id=60990&dl=ACM&coll=GUIDE&CFID=11111111&CFTOKEN=2222222
http://www.amazon.com/exec/obidos/ASIN/0201083191/acmorg-20/102-0297323-4336121
によるともう 3rd Ed なんですね。
--
mailto:shi...@dd.iij4u.or.jp
Nobuhiro Shibuya at Office
Tokyo Japan
noj...@taito.co.jpさん:
> やろうと思えばfirest,firrest,firrrestとかを実装...(ウソです)
爆笑しました ^_^; 久野
P.S. でもこれじゃcaddd...rだけですよね。cadarとかは?
> cad*r の形のものに関しては,d が増えて,読む度に d の個数を数えな
> きゃならないってんじゃぁあんまりだから,first, ... が用意された,と
> 理解しています.それ以外の形のものはそのまま使えばいいし,n-th の意
> 味ではない場合も cad*r を使えばいいと思います.
> #cadddddr とか caddddddr なんてのは誰も読みたくないでしょ?
aとdが4つまでなら全然問題ないですよ。それよりforthとかfifthと
かいわれる方が嫌じゃないですか? 日本人だし ^_^; あと結構あるのが、
carに何かあって、cadrとかcaddrが「1番目」みたいなリスト作っちゃ
う場合。そのとき、1番目がsecond、これは許せない。
結構思い当たるでしょ? :-) 久野
<c0q3o1$1h...@utogw.gssm.otsuka.tsukuba.ac.jp>の記事において
ku...@gssm.otsuka.tsukuba.ac.jpさんは書きました。
kuno> aとdが4つまでなら全然問題ないですよ。それよりforthとかfifthと
kuno> かいわれる方が嫌じゃないですか? 日本人だし ^_^; あと結構あるのが、
kuno> carに何かあって、cadrとかcaddrが「1番目」みたいなリスト作っちゃ
kuno> う場合。そのとき、1番目がsecond、これは許せない。
kuno> 結構思い当たるでしょ? :-) 久野
普通「1番は second」ですよね :-)
(nth 1 x) == (second x) == (cadr x)
だし.
--
名古屋大学大学院 情報科学研究科 計算機数理科学専攻
小野 孝男
Nobuhiro Shibuya at Office wrote:
>> >> [Q] 最近はcar/cdrの代りにfirst/restというのが今時なのでしょうか?
>> >> それともCommon Lispだけの方言と思えばよいのでしょうか?
:
>> LISP のコミュニティーに属していないし、最近のコードを詳しく読んで
>> いないので、今時の潮流はわかりませんが、car/cdr は今でも普通に使
>> うものだと思ってました。
>
> Winston-Horn の教科書 Lisp 2nd Ed (1988) が既に car/cdr を使ってなかったです。
ちょっと頭の温っけぇ感じではありますが、clisp-2.30 の src の下で
grep -wi ... | wc -l してみた結果です:
key | lines
------+--------
car | 885
first | 702
cdr | 837
rest | 836
cadr | 99
second| 613 : ここで大差が……
:
nth | 69
nthcdr| 27
...car/cdr 派の負け?(^^;
ta...@hirata.nuee.nagoya-u.ac.jpさん:
> 普通「1番は second」ですよね :-)
> (nth 1 x) == (second x) == (cadr x)
> だし.
げげー、分かってなかった(使わないもんで :-) 久野
In article <c0q3o1$1h...@utogw.gssm.otsuka.tsukuba.ac.jp>, ku...@gssm.otsuka.tsukuba.ac.jp wrote:
>久野です。
>
>ka...@pop12.odn.ne.jpさん:
>> cad*r の形のものに関しては,d が増えて,読む度に d の個数を数えな
>> きゃならないってんじゃぁあんまりだから,first, ... が用意された,と
>> 理解しています.それ以外の形のものはそのまま使えばいいし,n-th の意
>> 味ではない場合も cad*r を使えばいいと思います.
>> #cadddddr とか caddddddr なんてのは誰も読みたくないでしょ?
>
> aとdが4つまでなら全然問題ないですよ。
cdaddaaadr はどう読みますか? :-)
#NHKで顔文字の話してて,こう↑いうのも説明してました.チャップリ
#ンなんてのも有ったんですねぇ,知らなかった.
>それよりforthとかfifthと
>かいわれる方が嫌じゃないですか? 日本人だし ^_^;
4th, 5th にして欲しいって話?
>あと結構あるのが、
>carに何かあって、cadrとかcaddrが「1番目」みたいなリスト作っちゃ
>う場合。そのとき、1番目がsecond、これは許せない。
こういうのは自分でマクロを定義するしかないでしょ.
#そもそもこの「1番目」ってはリストの1番目じゃなくて手前が定義した
#ものなんだから.#とマジフォロー
> 結構思い当たるでしょ? :-) 久野
構造体の場合は vector 使っちゃうからなぁ...
#メモリが半分で済むし.
<4030d691.6915%ka...@pop12.odn.ne.jp>の記事において
ka...@pop12.odn.ne.jpさんは書きました。
katoh> > aとdが4つまでなら全然問題ないですよ。
というのは c[ad]{1,4}r のことだと思うので
katoh> cdaddaaadr はどう読みますか? :-)
は外しているような気はするんですが, 無理に読むと
「クダッダアアドル」
かな?
でもやっぱりわかりにくいので cad*r と caar くらいに限定してほしい
気もするな.
katoh> >それよりforthとかfifthと
katoh> >かいわれる方が嫌じゃないですか? 日本人だし ^_^;
あ, 今気付いたけど fourth のスペルが違う.
# 確かに日本人 (とーぜん私も含む) にはつらいかも.
Takahide Nojima <noj...@taito.co.jp> writes:
> nojimaです。
>
> [Q] 最近はcar/cdrの代りにfirst/restというのが今時なのでしょうか?
> それともCommon Lispだけの方言と思えばよいのでしょうか?
>
皆様に沢山のフォローいただき解決しました。ありがとうございました。
以下に自分なりにサマリあげます。
[A] 現在はまだ一部のLisp処理系の方言です。
ただ、car/cdrだけでは可読性がちょっと悪すぎなので、
・nth とか、
・first,second,third,...,rest
とかにした方が良いかもです。(補足1参照)
ただ、Lispからcar/cdrが消え去り、nthやらfirst/restに完全にとって変わる
かは不明です。mapcarという名前からして大変なものもあるためです。
#lispの話してる時に言い方でちょっとおしゃれに言うときにはfirst/rest/nthで
#言ってみて、相手の目が点になったりまわりに異和感を憶えたら、
#直にcar/cdrで言い直して笑ってごまかすとかのテクがいる模様です;-)
補足:
1. 可読性が犠牲になる例:
・ caddddrでd何個だからどこの要素だとか、
・ cdaddaaadrとか言われてもちょとすぐにわからん
2. Winston-Horn の教科書 Lisp 2nd Ed (1988) が既に
car/cdr を使ってなかったりしてます。
3. caddr,caddddrに習って、firrest,firrrrestはさすがに無いもようです。
> nojimaです。
> 以下に自分なりにサマリあげます。
>
> [A] 現在はまだ一部のLisp処理系の方言です。
で挙げた
> 補足:
> 2. Winston-Horn の教科書 Lisp 2nd Ed (1988) が既に
> car/cdr を使ってなかったりしてます。
の部分ですけど、この年かその前後がCommonLisp標準化がなされた年
なので標準化推進の役割を担ってcar/cdrを使わなかったんじゃないかと
割り引いて受け取った方がいいかも、と後になって気がつきました。
In article <40319895...@dd.iij4u.or.jp>, Nobuhiro Shibuya at Office wrote:
>Takahide Nojima wrote:
>
>> nojimaです。
>
>> 以下に自分なりにサマリあげます。
>>
>> [A] 現在はまだ一部のLisp処理系の方言です。
>
>で挙げた
>
>> 補足:
>> 2. Winston-Horn の教科書 Lisp 2nd Ed (1988) が既に
>> car/cdr を使ってなかったりしてます。
>
>の部分ですけど、この年かその前後がCommonLisp標準化がなされた年
>なので標準化推進の役割を担ってcar/cdrを使わなかったんじゃないかと
>割り引いて受け取った方がいいかも、と後になって気がつきました。
この本は元々アメリカの大学/大学院の教科書ですから,当然読み易さを優
先しているでしょうね.
まぁ,周りがどちらを使っているかなんて気にせずに,使いたい方を使えば
いいんじゃないでしょうか.#と,勝手に纏めてみたり
> まぁ,周りがどちらを使っているかなんて気にせずに,使いたい方を
> 使えばいいんじゃないでしょうか.#と,勝手に纏めてみたり
自動車が好きかどうかで決めるとかさ。 久野
P.S. carとは「車」を意味する英語だなあ、と今ふいに思い付いたので。
Lispを知ってウン十年になりますが、今の今までそんなことは考
えたことがなかった ^_^;
> ちょっと頭の温っけぇ感じではありますが、clisp-2.30 の src の下で
> grep -wi ... | wc -l してみた結果です:
>
> key | lines
> ------+--------
> car | 885
> first | 702
> cdr | 837
> rest | 836
> cadr | 99
> second| 613 : ここで大差が……
> :
> nth | 69
> nthcdr| 27
>
> ...car/cdr 派の負け?(^^;
first は関数以外にもコメントや first-part みたいなところに結
構使われているようです。
&rest なんかもたくさんあったようです。
CVS の HEAD ですが「(car 」みたいなのだけ数えたら、以下のよ
うな結果になりました。
$ for i in car first cdr rest cadr second nth nthcdr; \
do echo -n "$i: ";egrep -i '\('$i'[\t ]' *.lisp|wc -l;done
car: 826
first: 577
cdr: 745
rest: 184
cadr: 98
second: 595
nth: 41
nthcdr: 23
--
水戸
In article <c0t4uv$r...@utogw.gssm.otsuka.tsukuba.ac.jp>, ku...@gssm.otsuka.tsukuba.ac.jp wrote:
>久野です。
>
>ka...@pop12.odn.ne.jpさん:
>> まぁ,周りがどちらを使っているかなんて気にせずに,使いたい方を
>> 使えばいいんじゃないでしょうか.#と,勝手に纏めてみたり
>
> 自動車が好きかどうかで決めるとかさ。 久野
烏が好きかどうか
エヴァ(の綾波レイ)が好きかどうか
...お粗末 (_ _)
> ただ、Lispからcar/cdrが消え去り、nthやらfirst/restに完全にとって変わる
> かは不明です。mapcarという名前からして大変なものもあるためです。
car/cdr, first/rest, nth... どれも必要だと思います。cons cell を意識す
るなら car/cdr、項目が横に並んでいる list を意識するなら first/rest、
文脈によって当然使い分けします。not/null や if/cond/when/case/...、
do/dolist/loop/... などもそうですよね。
fourth や fifth が頻繁に出てこざるをえないような、
S式の入り組んだやつには、わたしは destructuring-bind を使うことが多いです。
> 1. 可読性が犠牲になる例:
> ・ caddddrでd何個だからどこの要素だとか、
> ・ cdaddaaadrとか言われてもちょとすぐにわからん
ご存知かとは思いますが、念のため、
caddddr や cdaddaaadr は Common Lisp にはありません。
> [A] 現在はまだ一部のLisp処理系の方言です。
最後になりましたが、Common Lisp は方言では無いと思います。
;; ANSI C は C の方言ですか?
--
KURODA, Hisao
Mathematical Systems Inc.
10F Four Seasons Bldg.
2-4-3 Shinjuku, Shinjuku-ku,
Tokyo 160-0022 Japan
Tel: +81-3-3358-1701
Fax: +81-3-3358-1727
URL: http://www.msi.co.jp/~kuroda
> ご存知かとは思いますが、念のため、
> caddddr や cdaddaaadr は Common Lisp にはありません。
私の大学時代の研究室の同期がLisp処理系作っていたのですが
c(a|d)+r
という*任意の長さの*名前の関数が使えるという実装になってました。
そういえば「cr」というのもOKだったらしい。
> 最後になりましたが、Common Lisp は方言では無いと思います。
> ;; ANSI C は C の方言ですか?
方言の定義によりますよね。 久野
P.S. 標準語とは単なる東京山手あたりの方言で…みたいな。
P.P.S. そういえばJISのBASICなんて方言みたいな雰囲気?
P.P.P.S. 誰か「方言」て名前の言語作ればいいんだよ…
<c0utnq$27...@utogw.gssm.otsuka.tsukuba.ac.jp>の記事において
ku...@gssm.otsuka.tsukuba.ac.jpさんは書きました。
kuno> 私の大学時代の研究室の同期がLisp処理系作っていたのですが
kuno> c(a|d)+r
kuno> という*任意の長さの*名前の関数が使えるという実装になってました。
これは見れば機能もわかるし実装も想像がつくんですが,
kuno> そういえば「cr」というのもOKだったらしい。
ってどんな機能の関数なんでしょうか? 想像できない....
> 小野@名古屋大学 です.
> kuno> そういえば「cr」というのもOKだったらしい。
> ってどんな機能の関数なんでしょうか? 想像できない....
terpri()
とおなぢだったりして…
;;;;;;ごめんなさいごめんなさいごめんなさい
> c(a|d)+r
>
> という*任意の長さの*名前の関数が使えるという実装になってました。
これは、4.x BSDに付いてきたFranz Lispにもあった機能のような記憶があり
ます。readerが、こういうシンボルをinternする時に、自動的に関数を定義す
るんですよね、たぶん。
ta...@hirata.nuee.nagoya-u.ac.jp (Takao Ono) writes:
> kuno> そういえば「cr」というのもOKだったらしい。
> ってどんな機能の関数なんでしょうか? 想像できない....
そりゃ identityでしょう…
前田敦司
shi...@dd.iij4u.or.jpさん:
> terpri()
> とおなぢだったりして…
ああなるほど。しかしなんでカッコが後ろなの? ^_^;
じゃなくて、「(lambda (x) x)」です。 久野
P.S. さすがにconsにしたりする方法はなかったらしい…
P.P.S. cとrの間の文字列だけですべてが計算できる言語…面白そう。
maeda...@ialab.is.tsukuba.ac.jpさん:
> これは、4.x BSDに付いてきたFranz Lispにもあった機能のような記憶があり
> ます。readerが、こういうシンボルをinternする時に、自動的に関数を定義す
> るんですよね、たぶん。
え、それじゃそういう名前の全然別の関数を定義したいとき困っちゃ
うじゃないですか。やっぱり「呼ばれた瞬間に未定義だったら定義」じゃ
なくちゃ。
とわざと難癖をつける 久野
> > これは、4.x BSDに付いてきたFranz Lispにもあった機能のような記憶があり
> > ます。readerが、こういうシンボルをinternする時に、自動的に関数を定義す
> > るんですよね、たぶん。
>
> え、それじゃそういう名前の全然別の関数を定義したいとき困っちゃ
> うじゃないですか。やっぱり「呼ばれた瞬間に未定義だったら定義」じゃ
> なくちゃ。
さすがに、readerが関数を作るのは「その名前のシンボルを初めて読んだとき
(シンボルテーブルになくて、新たにinternする時)」だけでしょう。
なので、たとえば、ユーザが
(defun cr (&optional stream) (terpri stream))
とか定義するならば問題ないです。
readerが定義した後に、defunでその定義が上書きされることになるでしょう
から。
> とわざと難癖をつける 久野
問題が起きるとすれば、「未定義関数を呼んだ」というエラーが起きてくれな
いと困る時、かな。
前田敦司
> readerが、こういうシンボルをinternする時に、自動的に関数を定義す
> るんですよね、たぶん。
intern の タイミング だと 単に
'cr
とやっただけでも関数定義に行ってしまって、もったいなくないかな?
と思ったんですが、 Franz Lisp に限っては、どうやらそのようです。
;; Lisp に入っていきなり symbol 情報を print させると
;; 下のようになりました。
Franz Lisp, Opus 38.92
-> (pp caaaaaaar)
(def caaaaaaar
(lambda (??)
(car (car (car (car (car (car (car ??)))))))))
t
->
maeda...@ialab.is.tsukuba.ac.jpさん:
> readerが定義した後に、defunでその定義が上書きされることになる
> でしょうから。
! Lispからしばらく遠ざかっていたので「平気で上書き」というのが
思い浮かびませんでした。
ふつーの言語だと2重定義はエラーだし… 久野
> 久野です。
> ふつーの言語だと2重定義はエラーだし… 久野
S とか R とか平気で再定義できる言語って普通じゃないんですか?
# ものを知らないので純粋に質問です。
--
mailto:shi...@dd.iij4u.or.jp 渋谷伸浩
shi...@dd.iij4u.or.jpさん:
> S とか R とか平気で再定義できる言語って普通じゃないんですか?
すいません、普通というのは失言でした。コンパイルする言語の
ことを想定していただけで。
もちろんLispだって普通の言語です 久野
いろいろ Common Lisp の処理系のソースをとって来て見てみました
が、
# Scheme の場合は、first とか無いから ;-)
KURODA Hisao wrote:
> cons cell を意識す
> るなら car/cdr、項目が横に並んでいる list を意識するなら first/rest、
> 文脈によって当然使い分けします。
この傾向は確かに読みとれました。
ただ、見てて思ったのだけれど、熟練 lisper は「一番目」というと
きでも car が最初に出て来るのか?という感じの部分がまま見受けら
れたりも。
けれども「二番目」に対しては、cadr を持って来る率が car-first
のときほどではないっぽくて、こちらは second が強く優勢という感じ。
ku...@gssm.otsuka.tsukuba.ac.jp writes:
> コンパイルする言語のことを想定していただけで。
(Common) Lisp は「コンパイルする言語」です。
ANSI Common Lisp には compiler に関する規定はあっても interpreter に関
するそれはありません。
ku...@gssm.otsuka.tsukuba.ac.jp wrote:
> 「強い型検査する言語」に修正します ^_^;; 久野
静的束縛をする言語というならほとんど理解できるのですが……
# 強い型検査する言語なら「普通」(ここで普通を使う)は二重定義
# は禁止というのでも理解出来るけれど。
## 危険水域に入りつつある気がする……
> ku...@gssm.otsuka.tsukuba.ac.jp wrote:
> > 「強い型検査する言語」に修正します ^_^;; 久野
>
> 静的束縛をする言語というならほとんど理解できるのですが……
静的束縛だったら二重定義と両立するような気がしてます 久野
2重定義と再定義はちょっと感覚的に違うような気がします。
Algol 系の 強く型付けされた、コンパイルされる言語でも、
なんていうんだろう、ネスト(?)の中では関数だろうが変数だろうが
再定義できる言語は多いですよね。
(C でさえ関数こそできないけど変数はできれ)
一方、2重定義は、同じレベルで再定義している、って
感じがします。lisp の toplevel でだけで考えてるって感じ。
それなら、Algol系でもエラーですし。
どちらにしても、そういう気がするってだけなので、
突っ込まないでください。
...
(c[ad]*r x) が読みにくくて嫌なら、
マクロを造るんですかね、って一瞬思ったけど、
それが優子な状況なら、
common lisp なら defstruct してしまうし...
申し訳ないです。以前のサマリに突込み入りまくりでしたので、修正します。
情報いただいた方々ありがとうございました。
Takahide Nojima <noj...@taito.co.jp> writes:
> > nojimaです。
> >
> > [Q] 最近はcar/cdrの代りにfirst/restというのが今時なのでしょうか?
> > それともCommon Lispだけの方言と思えばよいのでしょうか?
> >
>
> 皆様に沢山のフォローいただき解決しました。ありがとうございました。
>
> 以下に自分なりにサマリあげます。
修正サマリ
[A] 現在はCommon Lispでfirst/restが採択されております。
Common Lispに習った処理系であれば利用できるかもしれません。
参考:Common LispのLispにおける立場は
http://ja.wikipedia.org/wiki/Lisp
を参照
なお、
1. car/cdrだけでは可読性がちょっと悪すぎなので、
・nth とか、
・first,second,third,...,rest
とかにした方が良いという話があります。(補足1参照)
2. 順列を意識する場合は、car/cdr使わずあえて
・nth とか、
・first,second,third,...,rest
とかにした方が良いという話があります。
3. cadd*r等使わざるを得ない場合はCommon Lispの場合
defstructする方が何かと良い場合がある模様です。
4. firstに限りcarする人も多い模様です。
さらにLispからcar/cdrが消え去り、nthやらfirst/restに完全にとって変わる
かは不明です。
補足:
1. 可読性が犠牲になる例:
・ caddddrでd何個だからどこの要素だとか、
・ cdaddaaadrとか言われてもちょとすぐにわからん
2. Winston-Horn の教科書 Lisp 2nd Ed (1988) が既に
car/cdr を使ってなかったりしてます。
3. caddr,caddddrに習って、firrest,firrrrestはさすがに無いもようです。
4. common lispにcadddr等は無いそうです。
> 静的束縛をする言語というならほとんど理解できるのですが……
「静的束縛」って、どういうものをおっしゃってます?
lexical binding のことでしょうか?
;; ちなみに (Common) Lisp は lexical binding する言語です。
;; もちろん dynamic binding *も* 使えます。
> 3. cadd*r等使わざるを得ない場合はCommon Lispの場合
> defstructする方が何かと良い場合がある模様です。
データを S式 で持つのか structure あるいは instance で持つのかは、プロ
グラムの基本設計にかかわることで、「cadd*r等使わざるを得る/得ない」で
*普通* 決めないと思います。そういう人がいるとすると、相当お行儀悪いです。
> さらにLispからcar/cdrが消え去り、nthやらfirst/restに完全にとって変わる
> かは不明です。
わたしは、明かにあり得ないと思ってます。
> 4. common lispにcadddr等は無いそうです。
cadddr はありますよ。
http://www.franz.com/support/documentation/6.2/ansicl/dictentr/carcdrca.htm
> 参考:Common LispのLispにおける立場は
Common Lisp に関しては CLHS を読まれることをお薦めします。
http://www.franz.com/support/documentation/6.2/ansicl/ansicl.htm
ご指摘ありがとうございました。
KURODA Hisao <kur...@msi.co.jp> writes:
> Takahide Nojima <noj...@taito.co.jp> writes:
>
> > 3. cadd*r等使わざるを得ない場合はCommon Lispの場合
> > defstructする方が何かと良い場合がある模様です。
>
...中略...
> Common Lisp に関しては CLHS を読まれることをお薦めします。
> http://www.franz.com/support/documentation/6.2/ansicl/ansicl.htm
さらに上の指摘を考慮したものを以下にのせます。
[A] 現在はCommon Lispでfirst/restが採択されております。
Common Lispに習った処理系であれば利用できるかもしれません。
参考:Common LispのLispにおける立場は
http://www.franz.com/support/documentation/6.2/ansicl/ansicl.htm
を参照
なお、
1. car/cdrだけでは可読性がちょっと悪すぎなので、
・nth とか、
・first,second,third,...,rest
とかにした方が良いという話があります。(補足1参照)
2. 順列を意識する場合は、car/cdr使わずあえて
・nth とか、
・first,second,third,...,rest
とかにした方が良いという話があります。
3. Common Lispの場合、defstructという便利なものもあります
(もちろん設計上の都合/ポリシーが優先されますが)
4. firstに限りcarする人も多い模様です。
さらに将来Lispからcar/cdrが消え去り、nthやらfirst/restに完全にとって変わる
かはさすがにないそうです。
補足:
1. 可読性が犠牲になる例:
・ caddddrでd何個だからどこの要素だとか、
・ cdaddaaadrとか言われてもちょとすぐにわからん
2. Winston-Horn の教科書 Lisp 2nd Ed (1988) が既に
car/cdr を使ってなかったりしてます。
3. caddr,caddddrに習って、firrest,firrrrestはさすがに無いもようです。
4. common lispにある定義済みのcad*r等は以下の通りです。
http://www.franz.com/support/documentation/6.2/ansicl/dictentr/carcdrca.htm
言われてみれば、そうかも。でもこれも「普通は」無さそう。
ということは、いずれにせよどこかに「普通は」を入れる必要があるのかな。
# どっちも採算度外視の言語系ならありうるだろうと言われりゃまさしく似
# たようなものか。
> Narita Takaoki <tak...@aisoft.co.jp> writes:
>
> > 静的束縛をする言語というならほとんど理解できるのですが……
>
> 「静的束縛」って、どういうものをおっしゃってます?
> lexical binding のことでしょうか?
たぶん、なりたさんは「late binding の反対」の意味で使っていらっしゃる
のでしょう(early bindingっていうのかな?)。
OO の人達はlate bindingあるいはdynamic bindingという言葉を、
「関数(メソッド)名と呼び出されるコードの対応が、呼び出し時に決まる」と
言うような意味で使います。C++のvirtualメソッドとか。
Lisp使いが言うbinding(名前と値の対応)とは似てますが、もっと限定された
局面で使う言葉だと思います。
ところで、「再定義を許す」というのが、同じ関数(あるいは同じシグネチャ
を持つメソッド)の定義が、1つのプログラム中に2回以上現れてもエラーとな
らない、と言う意味だとすると、late bindingかどうかと、関数の再定義を許
すかどうかは別の話だと思います。
* late bindingで関数(メソッド)の再定義を許さない言語の例
… C++ のvirtualメソッドは、late bindingですが実行時に再定義はでき
ません。
* late bindingではないが、関数の再定義(二重定義)を許す言語の例
… これまで話題になった再定義とはちょっと違うかも知れませんが、
MLの関数名と実体の対応はコンパイル時に完全に決まります。同じ名前の
関数が2つ定義されると、『それ以後の呼び出しでは』新しい定義が参照さ
れます。すでに古い定義を参照してコンパイルされた部分には影響しません。
(Lisperには、「関数定義は代入ではなくて、新たな束縛が付け加わる。し
たがって、すでに作られたclosureには影響しない。」と言うと分かりやす
いかも。)
前田敦司
MAEDA Atusi wrote:
> KURODA Hisao <kur...@msi.co.jp> writes:
>
>> Narita Takaoki <tak...@aisoft.co.jp> writes:
>>
>> > 静的束縛をする言語というならほとんど理解できるのですが……
>>
>> 「静的束縛」って、どういうものをおっしゃってます?
>> lexical binding のことでしょうか?
>
> たぶん、なりたさんは「late binding の反対」の意味で使っていらっしゃる
> のでしょう(early bindingっていうのかな?)。
まさしくそれです。
> ところで、「再定義を許す」というのが、同じ関数(あるいは同じシグネチャ
> を持つメソッド)の定義が、1つのプログラム中に2回以上現れてもエラーとな
> らない、と言う意味だとすると、late bindingかどうかと、関数の再定義を許
> すかどうかは別の話だと思います。
:
> * late bindingではないが、関数の再定義(二重定義)を許す言語の例
> … これまで話題になった再定義とはちょっと違うかも知れませんが、
> MLの関数名と実体の対応はコンパイル時に完全に決まります。同じ名前の
> 関数が2つ定義されると、『それ以後の呼び出しでは』新しい定義が参照さ
> れます。すでに古い定義を参照してコンパイルされた部分には影響しません。
> (Lisperには、「関数定義は代入ではなくて、新たな束縛が付け加わる。し
> たがって、すでに作られたclosureには影響しない。」と言うと分かりやす
> いかも。)
MLのことを忘れてました。このように方針を決めてしまって、古いのは古
いのだよとしてしまえばコストも気にしなくて良くなりますね。
# しかも型付だし。
In article <m3vfm2mn...@nospam.maedapc.cc.tsukuba.ac.jp>
MAEDA Atusi <maeda...@ialab.is.tsukuba.ac.jp> writes:
> * late bindingではないが、関数の再定義(二重定義)を許す言語の例
> … これまで話題になった再定義とはちょっと違うかも知れませんが、
> MLの関数名と実体の対応はコンパイル時に完全に決まります。同じ名前の
> 関数が2つ定義されると、『それ以後の呼び出しでは』新しい定義が参照さ
> れます。すでに古い定義を参照してコンパイルされた部分には影響しません。
再帰呼出しは、どうなるのですか? 単純なものでなくて、相互に
呼び合うものなどです。
Forth は、late binding ではないのですが、再定義できます。同
じ名前の手続きを呼ぶと、古いものに対して stacking されます。
再帰はできません。たとえば、
: w lock w unlock ;
とすると、w という手続きは、lock & unlock 付きの w になりま
す。Cで書くとこんな感じ。
w()
{
...
}
...
w()
{
lock();
w(); // 再帰でなくて古い w() が呼ばれる
unlock();
}
PostScript は再帰はできたと思いますが、showpage を再定義して
n-up にしたりしてますね。
% psnup -2
%%BeginProcSet: PStoPS 1 15
userdict begin
[/showpage/erasepage/copypage]{dup where{pop dup load
type/operatortype eq{1 array cvx dup 0 3 index cvx put
bind def}{pop}ifelse}{pop}ifelse}forall
んん、よめないなあ。
PDF って、そういうのできないんですかね。
\\ 新城 靖 (しんじょう やすし) \\
\\ 筑波大学 電子・情報 \\
> > * late bindingではないが、関数の再定義(二重定義)を許す言語の例
> > … これまで話題になった再定義とはちょっと違うかも知れませんが、
> > MLの関数名と実体の対応はコンパイル時に完全に決まります。同じ名前の
> > 関数が2つ定義されると、『それ以後の呼び出しでは』新しい定義が参照さ
> > れます。すでに古い定義を参照してコンパイルされた部分には影響しません。
>
> 再帰呼出しは、どうなるのですか? 単純なものでなくて、相互に
> 呼び合うものなどです。
その場合は、複数の名前を「同時に」定義しなければなりません。
fun even 0 = true
| even n = odd (n-1)
and odd 0 = false
| odd n = even (n-1)
MLのfunという構文は、おおむねSchemeの(letrec ((name (lambda ...にあたる
ものです。
Lisperの言葉で言えば、同じ環境に複数の名前が定義され、それらの名前が束
縛される値の式もまた、その同じ環境で評価されます。
> Forth は、late binding ではないのですが、再定義できます。同
> じ名前の手続きを呼ぶと、古いものに対して stacking されます。
> 再帰はできません。たとえば、
SunのROMモニタにはrecというwordがあったような。
> PostScript は再帰はできたと思いますが、showpage を再定義して
> n-up にしたりしてますね。
PostScriptでは「辞書スタック」が環境に当たります。同じ辞書に複数の名前
を定義すれば、相互再帰ができますね。辞書は書き換え可能ですから、定義を
上書きできます。また、辞書をプッシュして名前を定義すると、上書きでなく
名前を一時的に隠す(shadowする)こともできます。
前田敦司
昔, 竹内さんのところで作った LIPQ は, セルが2つ組でなく4つ組でした.
アクセス関数は car cbr ccr cdr でした.
天海
> 昔, 竹内さんのところで作った LIPQ は, セルが2つ組でなく4つ組でした.
> アクセス関数は car cbr ccr cdr でした.
ああ、リップク(立腹?)ですね。噂は聞いた覚えがあります。
あと、Lispじゃないけど、ペアの左右を取り出す関数の名前にhidarとmig と
いう表記もどこかで聞いた気が。
Logoだとfirstとbutfirst(略称BF)ですね。
前田敦司
<1988...@koubou.nue.org>の記事において
ama...@koubou.nue.orgさんは書きました。
amagai> 昔, 竹内さんのところで作った LIPQ は, セルが2つ組でなく4つ組でした.
amagai> アクセス関数は car cbr ccr cdr でした.
最初の LISP ではアクセス関数が car/cdr/ctr/cfr の 4つであったと耳
にしています.
そういう意味では「先祖返り」?
--
名古屋大学大学院 情報科学研究科 計算機数理科学専攻
小野 孝男
> 最初の LISP ではアクセス関数が car/cdr/ctr/cfr の 4つであったと
http://www-formal.stanford.edu/jmc/history/lisp/lisp.html
によれば、car, cdr, cpr, and ctr ですね。
IBM 704 の 36 bit word を、
Contents of Address part of Register 15 bits
Decrement 15
Prefix 3
Tag 3
のように分けるのが自然だと考えられたため、ということです。
TAO/ELIS 上での C プログラミングを実現したときのマイクロ関数です.
記号処理研究会 37-8 で発表がありました.
hidar は変数の左辺値を取り出す & 演算にあたるもので, mig は参照の * に
あたります.
天海
In article <m3ptc9l...@nospam.maedapc.cc.tsukuba.ac.jp>
MAEDA Atusi <maeda...@ialab.is.tsukuba.ac.jp> writes:
> > Forth は、late binding ではないのですが、再定義できます。同
> > じ名前の手続きを呼ぶと、古いものに対して stacking されます。
> > 再帰はできません。たとえば、
>
> SunのROMモニタにはrecというwordがあったような。
Sun の ROM モニタは、F83 だから。see の逆コンパイラなんか、
「そこまでやるか」って感じです。
F83 って、ソースが comp.sources に流れた気がするのですが、ど
こに行ったんでしょうね。
ROM モニタというと、Apple にも Forth が入っています。
起動時に Command+Option+O+F だったかなあ。OpenFirmwareの意味
です。
さっき見たら PowerBook G4 の ROM には rec はなかったみたいです。
Forth で再帰するなら、変数に番地を入れてやるんだったかなあ。
あ、忘れた。
variable wptr
: f ... wptr @ call ... ;
' f wptr !
void (*wptr)();
f() { ... (*wptr)(); ... }
main() { wptr = f; }
call って無かったような気がするんだけどなあ。リターンスタッ
クに積んで ret でもどるか。
: f ... wptr @ >r ;S ... ;
戻る命令わすれた。;S で良かったかなあ。この作戦なら、call は
これでもいいか。
: call r> drop ;
自己再帰でよければ、
: f .... [ ' f , ] ... ;
でもいいかも。' での検索は、定義中はかからなかった気がするか
らなにかフラグをぐにょぐにょしないといけなかったかも。となる
と
: rec 現在定義中のコードの先頭を取ってくる , ; immediate
でもいいかも。immediate で即実行でコンパイル時に働くものにし
ます。
> PostScriptでは「辞書スタック」が環境に当たります。同じ辞書に複数の名前
> を定義すれば、相互再帰ができますね。辞書は書き換え可能ですから、定義を
> 上書きできます。また、辞書をプッシュして名前を定義すると、上書きでなく
> 名前を一時的に隠す(shadowする)こともできます。
Forth の辞書は、append only で、定義の逆順にサーチです。複数
の辞書(vocabulary) は作れます。F83 は検索用は8個くらいまで
スタックにできたかなあ。標準は、検索用(context)が1つに定義
用(current)が1つ。