CommonLisp Scheme Pa ..
[2ch|▼Menu]
211:209
05/06/03 13:46:23
なるほど,xyzzy Lisp が速いとは言えないけれど,比べた Petite Chez
Scheme が速すぎるから,びっくりするような相対値になったのですね.
Gauche とかだとどうなんだろう.

Emacs Lisp でも試してみようと思ったけれど,エラーになって動かない.
(error "Lisp nesting exceeds max-lisp-eval-depth")
Emacs はなかなかよく分かりません.

あと,野暮かも知れませんが,一応,
Chez Scheme     => しぇすきーむ
Petite Chez Scheme => ぷてぃとしぇすきーむ
Paul Graham     => ぽーるぐれあむ
が原音に近いのではないかと.


212:デフォルトの名無しさん
05/06/03 14:22:05
clisp 2.33.2: インタプリタ 15秒、コンパイラ 2.6秒
Emacs 21.3: インタプリタ 10.4秒、コンパイラ 4.7秒
Gauche 0.8.4: 3.3秒
SBCL 0.9.1: 0.4秒
(tarai 12 6 0) @ Pentium 4 2.4GHz

> (error "Lisp nesting exceeds max-lisp-eval-depth")
再帰の深さが変数 max-lisp-eval-depth を超えたってことなんで増やせばいい

213:210
05/06/03 15:28:20
defunの行とifの行の間に (declare (fixnum x y z)) を入れると gcl のコンパイラのみ
1.4秒→1.2秒になったがその他は変化無し。思ったほど効かないな。

214:デフォルトの名無しさん
05/06/03 16:18:46
>>212
cmuclの結果も知りたい。

215:デフォルトの名無しさん
05/06/03 16:38:47
lisp-worksでやってみた。
インタプリタだと66秒、コンパイルすると1秒以下になった。

216:212
05/06/03 17:03:28
>>214
CMUCL 19a:
インタプリタ: 92秒
コンパイラ: 0.55秒
コンパイラ (declare (type fixnum x y z)): 0.23秒
コンパイラ (declare (optimize speed)): 0.53秒
コンパイラ (declare (optimize speed) (type fixnum x y z)): 0.23秒

SBCL 0.9.1:
コンパイラ: 0.42秒
コンパイラ (declare (type fixnum x y z)): 0.31秒
コンパイラ (declare (optimize speed)): 0.38秒
コンパイラ (declare (optimize speed) (type fixnum x y z)): 0.21秒

217:209
05/06/03 20:23:37
いろいろな方にベンチを実行していただき,ありがとうございます.大変参考
になりました.

ところで,おまけとして,ラムダ式による遅延評価版を書いてみました.
(参考)URLリンク(www.shiro.dreamhost.com)

;;;竹内関数 aka たらいまわしべんち (or 'Common 'Emacs) Lisp
;;;遅延評価版
(defun tarai (x y z)
(if (<= (funcall x) (funcall y))
(funcall y)
(tarai (lambda () (tarai (lambda () (- (funcall x) 1)) y z))
(lambda () (tarai (lambda () (- (funcall y) 1)) z x))
(lambda () (tarai (lambda () (- (funcall z) 1)) x y)))))

こちらだと,引数が12 だとあっという間に終わってしまいますので,数字を
変えました.

(tarai (lambda () 192) (lambda () 96) (lambda () 0)) => 192

先ほどの条件で,xyzzy だと13秒程度でした.いささか極端な例とは言え,遅
延評価のありがたみを痛感します.


218:デフォルトの名無しさん
05/06/04 08:23:03
(defun tarai (x y z)
(let ((xx (funcall x)) (yy (funcall y)))
(if (<= xx yy)
yy
(let ((x (lambda () xx)) (y (lambda () yy)))
(tarai (lambda () (tarai (lambda () (- xx 1)) y z))
(lambda () (tarai (lambda () (- yy 1)) z x))
(lambda () (tarai (lambda () (- (funcall z) 1)) x y)))))))

219:デフォルトの名無しさん
05/06/04 13:02:22
xとyを遅延させる意味が無いように見えるんだが
と、LISPをまるで知らない俺が適当に言ってみる

220:デフォルトの名無しさん
05/06/04 13:31:58
無いね。z だけ遅延させるならこんな感じ?
(defun tarai (x y z)
(labels ((tarai-1 (x y fz)
(if (<= x y)
y
(let ((z (funcall fz)))
(tarai-1 (tarai-1 (1- x) y (lambda () z))
(tarai-1 (1- y) z (lambda () x))
(lambda () (tarai-1 (1- z) x (lambda () y))))))))
(tarai-1 x y (lambda () z))))

221:デフォルトの名無しさん
05/06/04 22:14:55
>>219 >>220
そんじゃ209が早くなったと言っているのは勘違いなの?


222:デフォルトの名無しさん
05/06/04 22:23:48
>>221
>>217 の参考リンクの一番したみてみそ。Zだけの遅延評価のページが紹介されている罠

223:デフォルトの名無しさん
05/06/05 17:29:43
流れ断ち切って悪いけど
DrSchemeって何て読むの?
ドクタースキームでいいの?

224:デフォルトの名無しさん
05/06/05 17:34:22
ドラスケ

225:デフォルトの名無しさん
05/06/05 18:09:09
>>224
採用。

226:デフォルトの名無しさん
05/06/05 23:21:23
スキーム博士


227:デフォルトの名無しさん
05/06/05 23:45:14
Note that they are listed as procedures, but implemented as syntax, so it is possible to use a name where the syntactical context implies one (they can also be used as values, but error messages will not have a meaningful name in this case).

これどういう意味か分かりますか?
どなたか解説をお願いします。

228:デフォルトの名無しさん
05/06/06 01:08:09
のっけからtheyとか代名詞が出てくるんだから、どういう文脈の文章かを
説明しろよな。まあ内容から何の話か見当つくけどさ。



229:?デフォルトの名無しさん
05/06/06 11:00:03
ぬるい実装の話みたいだが...どの処理系だ?

230:デフォルトの名無しさん
05/06/06 17:33:33
>>290-210
Cだと78msec(Pentium4,2.25GHz)でした。
やはりLISPは遅いようですね。

int tarai(int x,int y,int z)
{
if(x<=y) return y;
else return tarai(tarai(x-1,y,z),tarai(y-1,z,x),tarai(z-1,x,y));
}

231:デフォルトの名無しさん
05/06/06 19:53:32
とりあえず空気嫁、と。
空気をどうしても読めなかったら、
悲惨な喪毎の頭のベンチマークでも並べとけと。

232:デフォルトの名無しさん
05/06/06 20:47:44
>>230
>>220 なら sbcl on Pentium 4 2.4GHz で 7μsecだよ。
がんばって遅延評価実装してみ。

233:227
05/06/06 20:57:01
>>228
ごめん、もう分かった。
>>229
MzScheme です。


234:デフォルトの名無しさん
05/06/06 21:29:03
>>227
R5RS関連だろうと思ってたら、やっぱコレか。

PLT Foreign Interface Manual
PLT <scheme@plt-scheme.org>
299.100Released March 2005
URLリンク(download.plt-scheme.org)

2. Foreign Interface
This is a description of the foreign interface. The interface has some parts implemented in C (plt/src/foreign/foreign.c)
which is available as a built-in #%foreign module. This module is not intended for general use as is, and further
documentation can be found in the source. The relevant functionality is provided via the foreign module in MzLib
(foreign.ss).

2.2 Simple Types
2.2.4 Type Constructors
Since types are first-class values, there are several type constructors that build type objects. These are just the simple
ones, more constructors are described below. Note that they are listed as procedures, but implemented as syntax, so it
is possible to use a name where the syntactical context implies one (they can also be used as values, but error messages
will not have a meaningful name in this case).

235:デフォルトの名無しさん
05/06/06 21:49:17
>>233
お願いだから次からはもうちょっと質問の仕方も上達してくれよ

236:デフォルトの名無しさん
05/06/06 23:21:44
class tarai {
 int x, y;
 const tarai* tp;
public:
 tarai(int y) : x(0), y(y), tp(0) {}
 tarai(int x, int y, const tarai& t) : x(x), y(y), tp(&t) {}
 int operator()() const {
  if (x <= y) return y;
  int z = (*tp)();
  return tarai(tarai(x-1,y,*tp)(),tarai(y-1,z,tarai(x))(),tarai(z-1,x,y))();
 }
};

LISPをまるで知らない俺が五分で作ったC++遅延評価版
tarai(192, 96, tarai(0))()で、0.01秒くらい?

237:デフォルトの名無しさん
05/06/06 23:53:03
tarai(192, 96, 0)と使えるように直した

class tarai {
 int x, y;
 const tarai* tp;
public:
 tarai(int y) : x(0), y(y), tp(0) {}
 tarai(int x, int y, const tarai& t) : x(x), y(y), tp(&t) {}
 operator int() const {
  if (x <= y) return y;
  int z = *tp;
  return tarai(tarai(x-1,y,*tp),tarai(y-1,z,x),tarai(z-1,x,y));
 }
};

238:209
05/06/07 08:18:39
209 です.ろくにレスもしなくてすみませんでした.>>209-237 の流れを,大
変興味深く読ませていただきました.正直,>>236-237 はすばらしいと思いま
す.

>>232 のレスを見て,自分もC で遅延評価を実装しようと考えて,かなり汚い
コードしか思いつかず,ああクロージャ(関数閉包)って本当に便利なんだな,
と思った矢先に>>236-237 が書き込まれました.自分は C++ はよく知らない
のですが,とてもすっきり書けているように見えます.

日本の Lisp の巨人というと,竹内郁雄先生(たらいまわしべんちの生みの親)
と萩谷昌己先生がまず挙げられると思います.竹内先生は「Lispは確かに遅い
が,言語としての生産性は格段に高い.トータルのコストはLispの方がずっと
小さい」という考えであり,萩谷先生は「Lisp はあくまでプロトタイプのた
めのもので,本物のプログラムは C で書かなければならない」という考えだ
と聞いております.

Lispというのはとにかく書きやすい言語ですから,解くべき問題の複雑さによっ
て,どちらが正しいかは変わるのだと思うのですが,竹内関数(たらいまわし
べんち)に関しては,現時点では萩谷教授が正しいということになるようです.
この逆説めいた結末に,私は興奮すら覚えました.


239:デフォルトの名無しさん
05/06/07 08:20:50
Bill Clementson's Blog が復活したみたい

URLリンク(bc.tech.coop)

何時もこっちを見てるけど

URLリンク(planet.lisp.org)

240:209
05/06/07 08:59:31
今回の流れを見て,もう1つ思い出したのがこの言葉です.

「10年前ならLispは大きなアドバンテージを持っていたけれど、現在は他の言
語が追い付いて来てLispのメリットは小さくなっている。」Peter Norvig

今回のC++のエレガント(と私には見える)な回答を見て,確かにいくつかの
洗練は,Lispの占有物ではなくなったのだ,と感じた方もおられるのではない
でしょうか.

しかし,聞きかじりで書くのですが,C++にはテンプレートを多用した新しい
スタイルが登場しつつあるそうです.それは Lisp や関数型言語から大きな影
響を受けているそうです.つまり,Lisp は2005年の現時点でも,豊かなアイ
ディアの源泉でありつづけているのではないでしょうか.もちろん(不幸にも)
Lispの進歩が停滞して,その差が縮まりつつあるのかも知れませんが.

ところで,Lisp 側は最速のものがまだ出ていません.Allegro Common Lisp
(ACL) と Chez Scheme コンパイラの,二つの商用ソフトです.これらなら,
C++とも結構いい勝負をするかもしれません.

それにしても,最初にたらいまわしべんちを書き込んだ時にはまったく予想し
なかった展開になりました.大変勉強になりました.ありがとうございました.


241:209
05/06/07 09:01:28
参考リンク(うざいので最後にまとめました)

竹内郁雄『初めての人のためのLISP』
URLリンク(www.amazon.co.jp)
萩谷昌巳「たかが論理 されど論理」
URLリンク(nicosia.is.s.u-tokyo.ac.jp)
Lisp:読み物
URLリンク(www.shiro.dreamhost.com)
%aa
Modern C++ Design
URLリンク(www.amazon.co.jp)
The Great Computer Language Shootout
URLリンク(web.archive.org)
html


242:209
05/06/07 09:09:16
リンク貼り失敗.本当にウザくてごめんなさい.

竹内郁雄『初めての人のためのLISP』
URLリンク(www.amazon.co.jp)
萩谷昌巳「たかが論理 されど論理」
URLリンク(nicosia.is.s.u-tokyo.ac.jp)
Lisp:読み物
URLリンク(www.shiro.dreamhost.com)
Modern C++ Design
URLリンク(www.amazon.co.jp)
The Great Computer Language Shootout
URLリンク(web.archive.org)


243:デフォルトの名無しさん
05/06/07 10:39:40
C++のテンプレートは、色々やろうとすると制限が多すぎてちょっと嫌になる

244:デフォルトの名無しさん
05/06/07 11:21:50
>>243
boost の lambda なんかを見ると、一見 Lisp チックなんだけど、正確な挙動を
理解するのはなかなか大変。C++ って複雑な言語だなと思う。
そのくせ、制限が多いというのには同意。

Common Lisp なんかも「大きな言語」と言われるけど、C++ に比べれば子供
みたいなもんだなと思うよ。(もちろん良い意味でね)

245:デフォルトの名無しさん
05/06/07 11:58:44
>>240
過剰なお褒め、恐縮です。というか、気恥ずかしいです
でも、自分でも思った以上にエレガントだなと、思っていたり
ちなみに、Cでもやってみました
CでやるなんてlazyというよりCrazyかとおもったけど
書いてみたら、非常に簡単でした

struct tarai { int x, y; const struct tarai* tp; };

int tarai_sub(int x, int y, const struct tarai* tp) {
 if (x > y) {
  int z = tarai_sub(tp->x, tp->y, tp->tp);
  struct tarai t[3] = { { z, z, 0 }, { x, x, 0 }, { y, y, 0 } };
  struct tarai tz = { z-1, x, t+2 };
  return tarai_sub(tarai_sub(x-1,y,t), tarai_sub(y-1,z,t+1), &tz);
 }
 return y;
}

int tarai(int x, int y, int z) {
 struct tarai tz = { z, z, 0 };
 return tarai_sub(x, y, &tz);
}

C++よりも、速いっぽい

246:デフォルトの名無しさん
05/06/07 11:59:15
C++版もちょっと手直し

int tarai(int x, int y, int z) {
 class Tarai {
  int x, y;
  const Tarai* tp;
 public:
  Tarai(int y) : x(y), y(y), tp(0) {}
  Tarai(int x, int y, const Tarai& t) : x(x), y(y), tp(&t) {}
  operator int() const {
   if (x <= y) return y;
   int z = *tp;
   return Tarai(Tarai(x-1,y,z), Tarai(y-1,z,x), Tarai(z-1,x,y));
  }
 };
 return Tarai(x,y,z);
}

このコードなら、人に見せても恥ずかしくないかな

247:デフォルトの名無しさん
05/06/07 12:13:50
>>245
struct tarai に tp 入れる必要なくない?
typedef struct { int x, y, z; } tarai_t;
int tarai(int, int, int);
int tarai_1(int x, int y, tarai_t *tp) {
if (x <= y) return y;
int z = tarai(tp->x, tp->y, tp->z);
return tarai_1(tarai(x - 1, y, z), tarai(y - 1, z, x),
&(tarai_t){ z - 1, x, y });
}
int tarai(int x, int y, int z) {
if (x <= y) return y;
return tarai_1(tarai(x - 1, y, z), tarai(y - 1, z, x),
&(tarai_t){ z - 1, x, y });
}

248:デフォルトの名無しさん
05/06/07 15:18:08
個人的には興味深い話題ではあるのだけど、延々とC++の話が続くのはさすがに
スレ違いだと思う。もうちょっとLisp絡みの話へ軌道修正してほしい。

249:デフォルトの名無しさん
05/06/07 17:54:02
もうちょっとだけ、Cで
245を書いて、247を読んで、ちょっと考えてやっと気づいたんですけど
この問題の本質って、実はめちゃめちゃ簡単ですね
LISPのコードで書かれてる段階では全く気づかなかったんですけど
Cで書いて、読んでみたら、やっと気づきました

必要になるかどうか分からない関数値は、
事前に計算しないで引数のまま渡す
タダそれだけですね

int tarai(int x, int y, int z);
int tarai_sub(int x, int y, int z_x, int z_y, int z_z) {
 if (x > y) {
  int z = tarai(z_x, z_y, z_z);
  return tarai_sub(tarai(x-1,y,z), tarai(y-1,z,x), z-1, x, y);
 }
 return y;
}
int tarai(int x, int y, int z) { return tarai_sub(x, y, z, z, 0); }

このコードなら、Cに疎いLISPerの方々でも余裕で理解できるでしょう

なんかこう、高度なというか表現力や抽象化能力の高い道具が
問題の本質を逆に隠してしまっていたような、そんな気がします

250:デフォルトの名無しさん
05/06/07 18:03:57
…………………… 頭悪いのが粘着してるの放置 ……………………

251:デフォルトの名無しさん
05/06/07 18:07:32
確かに。tarai関数の主旨もわからず、Lazy Evaluationの例>>220の30スレも後になって
そんな事言い出すとは、かなり逝かれてるな。

なんつうか、人の話聞いた後「ところで話題変わるんだけど・・・」とか言って同じ話しだすドキュソを思い出した。

252:デフォルトの名無しさん
05/06/07 18:12:14
>>241-242もかなりイタタ。
こんなの(理系全般板の悪名高い荒らし)にURL覚えられちゃった
はぎゃ先生も災難だな

253:デフォルトの名無しさん
05/06/07 18:27:00
>>249
> なんかこう、高度なというか表現力や抽象化能力の高い道具が
> 問題の本質を逆に隠してしまっていたような、そんな気がします
そんなことないよ。>>220 の labels を分解して
(defun tarai (x y z)
(labels ((tarai-1 (x y fz) (if (<= x y) y
(tarai-2 x y (funcall fz))))
(tarai-2 (x y z) (if (<= x y) y
(tarai-1 (tarai-2 (1- x) y z)
(tarai-2 (1- y) z x)
(lambda () (tarai-2 (1- z) x y))))))
(tarai-2 x y z)))
tarai-1 をインライン展開して
(defun tarai (x y z)
(labels ((tarai-2 (x y z)
(if (<= x y) y
(let ((xx (tarai-2 (1- x) y z)) (yy (tarai-2 (1- y) z x)))
(if (<= xx yy) yy
(tarai-2 xx yy (funcall (lambda ()
(tarai-2 (1- z) x y)))))))))
(tarai-2 x y z)))

254:デフォルトの名無しさん
05/06/07 18:27:54
まとめると
(defun tarai (x y z)
(if (<= x y) y
(let ((xx (tarai (1- x) y z)) (yy (tarai (1- y) z x)))
(if (<= xx yy) yy (tarai xx yy (tarai (1- z) x y))))))
それを C にすると
int tarai(int x, int y, int z) {
for (;;) {
if (x <= y) return y;
int xx = tarai(x - 1, y, z), yy = tarai(y - 1, z, x);
if (xx <= yy) return yy;
z = tarai(z - 1, x, y); x = xx; y = yy;
}
}
こうなるんだけど、>>249 よりシンプルだし速度も倍。

255:デフォルトの名無しさん
05/06/07 18:31:21
…………………… 頭悪いのが自作自演始めたので放置 ……………………

256:209
05/06/07 21:45:06
勝手ながら,flatline 氏の Wiliki を借りました.
URLリンク(www.komaba.utmc.or.jp)

このスレでは,ちょっとこれ以上の話は皆さんにご迷惑のようです.
しかし,できるならもう少し続けたい気持ちが私にはあります.
いっしょにこちらに移動していただけませんか?>> C++ の人


257:209
05/06/07 21:48:32
補足.Wilikiのリファレンスです(私も不慣れなのですが).

URLリンク(www.shiro.dreamhost.com)

ということで,大変ご迷惑をおかけしました.申し訳ありません.>>ALL


258:デフォルトの名無しさん
05/06/07 22:38:25
今度はwiki荒らしか

259:デフォルトの名無しさん
05/06/07 22:57:12
>>253-254
どうもすみません。勉強になりました
勉強ついでに、249のCコードをそのままLISPにしてみました
(defun tarai (x y z)
 (labels ((tarai-1 (x y zx zy zz) (if (<= x y) y
  (let ((z (tarai zx zy zz))) (tarai-1 tarai((1- x) y z) tarai((1- y) z x) (1- z) x y)))))
 (tarai-1 x y z z 0)))

そこで、let式を関数呼び出しに変えて
(defun tarai (x y z)
 (labels ((tarai-1 (x y zx zy zz) (if (<= x y) y
   (tarai-2 (x y (tarai zx zy zz)))))
   (tarai-2 (x y z) (tarai-1 tarai((1- x) y z) tarai((1- y) z x) (1- z) x y)))
 (tarai-1 x y z z 0)))

さらに、tarai-1呼び出しをlet式に変えてみました
(defun tarai (x y z)
 (labels ((tarai-2 (x y z)
  (let ((xx (tarai((1- x) y z)) (yy (tarai((1- y) z x)))
   (if (<= xx yy) yy (tarai-2 (xx yy (tarai (1- z) x y)))))))))
 (if (<= x y) y (tarai-2 x y z))))

260:デフォルトの名無しさん
05/06/07 22:57:25
これをそのままCにすると、こうで
int tarai_sub(int x, int y, int z);
int tarai(int x, int y, int z) {
 if (x <= y) return y;
 return tarai_sub(x, y, z);
}
int tarai_sub(int x, int y, int z) {
 for (;;) {
  int xx = tarai(x-1,y,z), yy = tarai(y-1,z,x);
  if (xx <= yy) return yy;
  z = tarai(z-1,x,y);
  y = yy;
  x = xx;
 }
}

最初のifがループの外に出せて、なんか倍くらい速くなります。
それともこれ、何か間違ってますか?

261:デフォルトの名無しさん
05/06/07 23:33:28
フリーのCommon Lisp処理系で、threadをサポートしているのって有ります?
SchemeはDrSchemeがサポートしているけど。。

262:デフォルトの名無しさん
05/06/08 00:16:13
>>261
URLリンク(www.sbcl.org)

263:デフォルトの名無しさん
05/06/08 03:59:01
>>239
おお、待ち焦がれてたよ BIll さん。
blog 関連のリンクはテンプレに入れるとしたら Planet Lisp のがいいかもね。

さておき、記念に前に出たトランポリン関連のネタを引っ張っておく。

URLリンク(bc.tech.coop)

リストに詰めて apply、ってやり方だから大量のゴミを作るだろうあたりが気になるけど。
相互末尾再帰でもかかわってくる関数それぞれが取る引数の数は大抵の場合は同じだろうから、
そこを固定したコードを吐くマクロを書いた方が実用上は好ましいかな。


264:デフォルトの名無しさん
05/06/08 07:46:38
>>261
ECL もオケ

DrScheme のスレッドは所謂 Green Thread でしょ。
Native Thread じゃなくていいなら CMUCL にもある。

265:デフォルトの名無しさん
05/06/08 08:01:30
連投スマソ

>>261
PowerPC 使いなら OpenMCL も Native Thread 使える
Intel Mac の登場で x86 にポーティングされないかな…
作業大変だろうけどね

266:デフォルトの名無しさん
05/06/08 12:31:04
.coopなんてTLDできてたのか……。.bizとか.infoと同時に作られたのだな。



267:デフォルトの名無しさん
05/06/08 20:54:46
すいません
スレ間違えたっぽいので誰か知ってたら答えてください

スレリンク(tech板:380番)

エラー検出とかのためにリストがどの行のものか保存する
LISP処理系ってありますか?

268:デフォルトの名無しさん
05/06/09 06:50:31
Shiro Kawaiの演技にカツモクせよ
[ドラマ] 恋におちたら 〜僕の成功の秘密〜 第01話 「ずっと探してた人」 (D-KTV 1024x576 DivX511).avi aaLPbRVQ8B 1,089,947,648 56df0ca851a66ec551b59c6a54db9978

269:デフォルトの名無しさん
05/06/09 08:05:03
一瞬、誤爆かとおもた(w

270:デフォルトの名無しさん
05/06/09 16:28:51
>>268
こらこらこら


271:デフォルトの名無しさん
05/06/10 05:07:09
一瞬、ny導入しようとした俺guile

272:ミミ
05/06/11 07:54:40
Scheme 関係の文書に arity ってよく出てくるけど、うまい訳語ある?

273:デフォルトの名無しさん
05/06/11 09:24:39
一応、『項数』ってのがあるけど、使わない方が無難だと思う。
直感的じゃないし、初学者には意味不明な単語が増えるだけ。
『引数の数』じゃダメな理由でもあるの?

274:デフォルトの名無しさん
05/06/11 09:24:54
URLリンク(en.wikipedia.org) 読んでみたけど、
カジュアルには「引数の数」かな。
もう少し丁寧に「手続き(関数)が受け取り可能な引数の数」とか。
精確に行くなら「アリティ」で。

275:デフォルトの名無しさん
05/06/11 09:38:15
ちなみに中国語では元数と書くみたいだね
引数はそのまま引数みたい

276:デフォルトの名無しさん
05/06/11 10:25:32
有体

277:デフォルトの名無しさん
05/06/11 10:40:51
可変個の引数も扱うわけだから
引数として受け付ける個数の範囲かな


278:デフォルトの名無しさん
05/06/11 10:41:05
algorithmに語源はあるけど、
arityに語源はないの?

279:デフォルトの名無しさん
05/06/11 11:48:59
unary, binary の ...ary ----> arity

280:ミミ
05/06/11 14:34:38
ありがとうございます。
やはり「引数の数」が一番分かりやすそうですね。
でも用語に「の」が入ると、「の」が沢山でてきて
読みにくい文章になったりするんですよね。
そういう意味では「アリティ」のほうがましかも。

281:デフォルトの名無しさん
05/06/11 16:02:01
>>280
> そういう意味では「アリティ」のほうがましかも。

それはない。


282:デフォルトの名無しさん
05/06/11 17:52:52
アリティ(引数の個数)...

として、以降アリティで良いんじゃないかな

283:ミミ
05/06/11 18:15:03
ちなみに、「引数の数」と「引数の個数」では、
後者ののほうが分かりやすいと思うんだけど、
「個数」って訳する人、意外と少ないんだよねぇ。

284:デフォルトの名無しさん
05/06/11 18:18:41
アニキィ


285:デフォルトの名無しさん
05/06/11 18:26:10
ありていにいって>>281に同意。

286:デフォルトの名無しさん
05/06/11 18:35:56
>>285
全米が凍った

287:デフォルトの名無しさん
05/06/11 20:54:02
確かにGaucheのマニュアルで説明無しにarityという
用語が出てきて困ったな〜。

288:デフォルトの名無しさん
05/06/11 21:25:31
めんどいからもう引数数でいいんじゃね

289:デフォルトの名無しさん
05/06/11 21:26:57
アミティ

290:デフォルトの名無しさん
05/06/11 21:27:48
arityという単語を覚えて貰うためにも、ちゃんと説明した上で「アリティ」で良いと思う。
どうせいつかは英文のマニュアルとか読む機会もあるだろうからね。

291:デフォルトの名無しさん
05/06/11 22:15:51
だったら変なカタカナにするよりarityのままの方がいいような

292:デフォルトの名無しさん
05/06/11 22:39:14
それは翻訳としては不完全。
商用レベル文書の品質としては失格。

293:デフォルトの名無しさん
05/06/11 22:46:35
そんな業界基準があるなら正してもらう必要があるな。
間違っている。

294:デフォルトの名無しさん
05/06/11 22:56:50
そろそろ誰かコードを…
コードをくれ

295:デフォルトの名無しさん
05/06/11 23:05:08
商用レベルの邦訳って変な拘りがあるんですね。
それで分かり難い訳本が多いんですね。
納得しますた。

296:デフォルトの名無しさん
05/06/12 00:15:55
まともな翻訳には日本語で表現できる概念を増やすという役割もあるから。


297:デフォルトの名無しさん
05/06/12 00:22:08
. o O (理想が高過ぎると返って悪い結果を生む良い例だな...)

298:通りすがり
05/06/12 00:29:43
いやだから、人類の知性の向上に役立ってない屑は関係ないって。
屑はいつもみたくν速で一日中遊んでりゃいいやん

299:デフォルトの名無しさん
05/06/12 00:38:36
元数は納得できる訳語だな。
方程式でも変数がxだけなら1元、xとyなら2元というのを
そのまま函数にも適用したという感じだ。
(方程式の変数の数を元数というのは日本でも普通)

今辞書を引いて初めて知ったんだが、函数というのは中国由来で
functionのfunと同音の字を当てたらしい。関数は日本で更に同音の字を
当てて書き換えたものとか。
googleで関数(簡体字で)を検索すると世界で4件しか引っ掛からん。


300:デフォルトの名無しさん
05/06/12 00:56:59
四元数とかの元数か。悪くないね。
ただ、やっぱり使う前に説明が必要だね。

301:デフォルトの名無しさん
05/06/12 01:10:03
ここ数ヶ月、随分レベルの低い話題ばっかだな。

302:3歳児
05/06/12 01:11:00
レベルが低いのは、ここ数ヶ月ではなく
ここ数日のまちがいだとおもいます。

303:デフォルトの名無しさん
05/06/12 01:20:17
>>302 3歳は もう寝ろYO!

304:デフォルトの名無しさん
05/06/12 01:21:48
最高につまんねぇレスだな。

305:デフォルトの名無しさん
05/06/12 01:27:16
自演コテが湧くよりゃマシだ

306:デフォルトの名無しさん
05/06/12 02:17:46
Joswig タンの Concordia デモムービー見たんだが、あれが本物の CLIM かぁ
今見ると、やっぱりちょっと古くさいね…

307:デフォルトの名無しさん
05/06/12 13:23:58
えぇぇ〜CLIM(Common Lisp Interface Manager)?
Symbolics みたいなタイルウィンドウシステムでしょ。
一度触ってみたいなぁ。
Macintosh CommonLispのdigitoolには Mac用バイナリがまだ置いてあるみたいだけど


308:デフォルトの名無しさん
05/06/12 20:45:30
>>301
君のいうレベルの高い内容を提示してくれよ。

309:デフォルトの名無しさん
05/06/12 21:24:01
(gc)

310:デフォルトの名無しさん
05/06/12 21:29:58
OS ネイティブのスレッドを扱える Lisp/Scheme 処理系はありますか?

311:デフォルトの名無しさん
05/06/12 22:14:02
>>310 >>262

312:デフォルトの名無しさん
05/06/12 22:27:55
誰かILC2005行く香具師いる?

313:デフォルトの名無しさん
05/06/13 02:08:41
Commonclipseかと思った。
URLリンク(www.eclipsewiki.net)

314:デフォルトの名無しさん
05/06/13 04:05:46
>>310
scheme なら gauche と KSM も

Lisp/Scheme 以外でもフリーの処理系でネイティブスレッドを
サポートしている物は非常に少ない
知ってるのは OCaml, GHC, Perl, Python, Erlang くらいかな
SML 系は全滅っぽいね

315:デフォルトの名無しさん
05/06/13 11:31:38
>>314
> サポートしている物は非常に少ない
なぜ少ないのでしょうか?

316:デフォルトの名無しさん
05/06/13 11:55:13
>>315
面倒なんだろ。

317:デフォルトの名無しさん
05/06/13 12:02:55
>>315
おこちゃまだから。。

318:デフォルトの名無しさん
05/06/13 12:07:21
頭の悪いレスだ

319:デフォルトの名無しさん
05/06/13 12:52:33
>>318 おまえがな。

320:デフォルトの名無しさん
05/06/13 13:04:14
必死だな

321:デフォルトの名無しさん
05/06/13 13:12:15
>>320
See: 319

322:デフォルトの名無しさん
05/06/13 13:18:21
× おまえがな
○ おまえモナー

323:デフォルトの名無しさん
05/06/13 13:37:46
>>322
See: 320

324:デフォルトの名無しさん
05/06/13 14:02:20
・・・・・・ここからはLispに関係ないレスは禁止・・・・・・

325:デフォルトの名無しさん
05/06/13 20:38:12
後藤英一先生のご冥福をお祈りします。

326:デフォルトの名無しさん
05/06/13 20:49:40
IPSJ コンピュータ博物館
後藤英一 - 日本のコンピュータパイオニア
URLリンク(www.ipsj.or.jp)

327:デフォルトの名無しさん
05/06/13 20:57:40
この人か。HLISP 作った人なんだね。

URLリンク(www.ipsj.or.jp)
URLリンク(www.mainichi-msn.co.jp)
URLリンク(nicosia.is.s.u-tokyo.ac.jp)

>>315
理由はここら辺じゃないかな
1. 実装が面倒
2. 1CPU のマシンではネイティブスレッドのメリットが見えにくい
3. Linux のスレッドがイケてなかった

1 は GC 絡みとかなのかな
2 は最近の CPU のデュアルコア化でちょっとはメリットが出てくるかも
3 は 2.6 以降問題なくなった(らしい)

328:デフォルトの名無しさん
05/06/13 21:01:10
スマソ。リロードしてなくて被った。
Lisp Machine ってスレッドとか LWP みたいな概念はあったのでしょうか?

329:デフォルトの名無しさん
05/06/13 21:04:33
GUI作ったりメリットは沢山あるよ。
やっぱ面倒なんじゃないかね。

作るとしたら、GCやコンストラクタは排他制御して、
オブジェクトの更新毎にWriteバリアかね。
やっぱGC周り面倒だなあ。
適当に作ったらすぐ破綻しそう。

330:デフォルトの名無しさん
05/06/13 21:54:17
JavaのGCなんかを見るとネイティブスレッディング自体はそれほど性能的な
ハンデにはならないのかなという気もする。面倒なのは同意だけど。w

331:デフォルトの名無しさん
05/06/13 22:03:28
>>325
まじか。
中西(正和)先生も少し前に亡くなったが、今度は後藤先生か。

332:デフォルトの名無しさん
05/06/14 10:56:27
このスレでもおなじみの新山ゆうすけ氏が、Common Lisp の仕事を始めたらしい。
URLリンク(tabesugi.net)

> しかし相手はそこそこ有名なLisp ハッカーであり、習うべきことは多い。
> Lisp で仕事できる機会なんてそんなにないと思う。

などと書いている。今まで Lisp の悪口ばかり書いていたのになあ。

と思ったら、今日はさっそく Lisp の悪口であった。
URLリンク(tabesugi.net)

やっぱり新山氏はそう来なくっちゃ!


333:デフォルトの名無しさん
05/06/14 12:56:36
>>332
なんか有名な人なの?
嫌いな言語使って仕事してるっていう愚痴のようにしか読めんが。

334:デフォルトの名無しさん
05/06/14 14:50:02
>>333
NY市立大の院生で、Python や Scheme、OpenSSH の世界ではそこそこ有名な人。
URLリンク(www.unixuser.org)

Shiro さんが wiliki で取り上げたこともある。
URLリンク(www.shiro.dreamhost.com)


335:デフォルトの名無しさん
05/06/14 15:01:18
>>334
何言ってんの? この人ぜんぜん有名じゃないよ。

336:デフォルトの名無しさん
05/06/14 18:25:51
有名かどうかは人それぞれが判断すればいいこと。それより、内容についての
話をしようよ。

Common Lisp のライブラリが、過去互換性のために見通しが利きにくいこと、
package は実用上不可欠なのに、Scheme にはまだ標準がなく、実装依存だと
いうこと、これらはもっともな批判だと思うのだけど。


337:デフォルトの名無しさん
05/06/14 19:06:44
ごく一部の日本人で英語が読めない奴限定で有名かも知れんが

>>334
> Python や Scheme、OpenSSH の世界ではそこそこ有名

なんていうような仕事はしとらん。

まあ言ってみればプチ岩谷宏。


338:デフォルトの名無しさん
05/06/14 19:08:14
LispはJavaにMLはC#に昇華しましたので、そのようなことを考えること自体無駄です。

339:デフォルトの名無しさん
05/06/14 19:36:34
>>336
> Common Lisp のライブラリが、過去互換性のために見通しが利きにくいこと、

確かにそういう面は否定できないが、正直言って慣れてしまったね。

それを言うなら例えば C のライブラリとか UNIX のシステムコールにしたって
「過去互換性のために見通しが利きにくい」と思うし。

誰かが整然とした New Common Lisp を設計したとしても、それを布教するのは
大変だろうなぁ・・・

340:デフォルトの名無しさん
05/06/14 20:04:52
Scheme はそういう整然とした Lisp の標準を作ろうとしているわけだが、議
論百出で、いつまでたっても Common Lisp 並のライブラリがそろわない件に
ついて。


341:デフォルトの名無しさん
05/06/14 20:12:26
今のペースだと、
あと50年は掛かるな

342:デフォルトの名無しさん
05/06/14 20:25:24
C や UNIX の設計のまずいところを一気に作り直そうとした Plan9(Inferno)
も、いつまでたっても実験段階から離陸しないものね。

コンピュータ技術、ひいては技術一般に、いかに市場とのタイミングというも
のが重要か、分かるように思う。


343:デフォルトの名無しさん
05/06/14 20:41:53
「技術」の一般論を語るには、まだまだじゃない?
現状と個人の経験なわけで。
このスレには厳密主義が多いかと思った。


344:デフォルトの名無しさん
05/06/14 20:47:54
>>338
ちょっと待て、聞き捨てならん。こんな書いてて楽しくないものが、LISP の
昇華物であってたまるかぁっ!

345:デフォルトの名無しさん
05/06/14 21:03:17
>>344
昔、Lispの研究をしていた人がSunに行ってJavaを作り、それに対抗したMicrosoftが
MLの研究グループを引き抜いてC#を作ったんだよ。

Lispは特にリサーチプロジェクトなんかには便利な言語だね。 Javaは大規模なプロジェクト
向きかな。 要するに、適材適所で使えば良いかと。

346:デフォルトの名無しさん
05/06/14 21:09:40
昇華(しょうか)(Sublimation)

物理学では
  省略・・・

心理学では

 防衛機制の一つ。
 実現不可能な目標・葛藤や満たすことができない欲求から、
 別のより高度で社会に認められる目標に目を向け、
 その実現によって自己実現を図ろうとすること。

 例)かつてアクション映画で活躍したが、
  障害を負ってアクション映画に出演できなくなった→障害者保護団体を設立する


347:デフォルトの名無しさん
05/06/14 21:18:09
>>345
本気で言ってるのだとしたら面白すぎる

348:デフォルトの名無しさん
05/06/14 21:22:16

数理論理学では
ならば

349:デフォルトの名無しさん
05/06/14 21:33:23
>>345
それって、ガイ・スティールのことか?Java はやっぱりジェームズ・ゴスリ
ングのものだと思うのだけどなあ。ゴスリングとビル・ジョイが Java の仕様
でもめたところを、ガイ・スティールがまとめたんだろう。彼は他にもいろん
な言語の仕様に関わってるし。JavaScript とか。

ML とC# の関係は全然知らなかった。ありがとう。


350:デフォルトの名無しさん
05/06/14 22:08:05
下らん
ヒント:Java, Delphi, ObjectPascal

351:デフォルトの名無しさん
05/06/14 22:15:33
>>349
> 彼は他にもいろんな言語の仕様に関わってるし。

をいをい。Schemeを忘れるなよ。w
時系列で言えば Scheme→Common Lisp→Java の順で手がけている。
もちろんこの順序と言語の優劣は関係ない。
漏れはGuy Steeleの絡んだ言語はすべて好きだよ。

352:デフォルトの名無しさん
05/06/14 22:24:29
>>351
初期のJavaの研究会行ったら「私の仕事はGuy L. Steele 仕事ですw」という奴が居て噴いたなぁ。

 Scheme → CommonLisp → StarLisp, C* (ThinkingMachine) → HighPerformanceFortran → Java

のうち、漏れ自身ThinkingMachine以外はやってたw


353:デフォルトの名無しさん
05/06/14 22:48:06
C: A Reference Manual を書いたり ECMAScript の標準化を手伝ったりも

354:デフォルトの名無しさん
05/06/15 00:09:09
ガイ・スティールの手のひらでころがされてる気分になってきた


355:デフォルトの名無しさん
05/06/15 00:20:44
>>344
反応するなよ

>>349
騙されるなよ

356:デフォルトの名無しさん
05/06/15 00:31:28
>>345
ダウト

357:デフォルトの名無しさん
05/06/15 01:21:56
r6rs の作業が始まってから一年半経つけど、あとどのくらい掛かるんだろうか。
UNICODE サポート、例外機構、モジュール機構、構造体辺りが楽しみだ。
モジュールは長く標準化が待ち望まれた機能だしね。

358:デフォルトの名無しさん
05/06/15 01:28:41
構造体作るから多値はいらないという
多値は受け取ったり受け取らなかったりと、今一不可解なプロトコルと言える
参照ベースな言語では構造体パックが正解なのかもしれない


359:デフォルトの名無しさん
05/06/15 03:35:45
>>339
そこで Arc ですよ。

>>358
個人的には多値で渡していくやり方は細かいことを気にせずに済んで好きなんだけど、
いまいち現状だと構文上すっきりしないところが多いのも確かですね。
wiliki であった、アリティに応じて返す値の数を変えられるようにする、
ってのは結構面白いなあと思った。問題が色々出て来ちゃうみたいだったけど。

……でもその辺すっきりしたいなら他の関数型言語に転んじゃった方が楽な気が。
どうせ構造体でパックしちゃうなら 1-in 1-out で、型付けも静的な方が楽じゃないですか?

360:デフォルトの名無しさん
05/06/15 07:09:22
多値で受け取るのも、構造体のアクセッサ経由で値を受け取るのも、
手間は変わらないって考えて良いのかな。

361:デフォルトの名無しさん
05/06/15 11:25:48
こんな感じかな?

(i) 構造体のコンストラクタが関数の末尾位置にあるときは、構造体
そのものをスタックにアロケートして、
(ii) その関数の呼び出し側で返値(構造体)がエスケープしないなら
そのままスタックの上で使う。

362:デフォルトの名無しさん
05/06/15 11:37:37
割り込み失礼。スラドに載った。シンボルを HashTable にしたのが後藤氏の
仕事とは知りませんでした。

「日本のコンピュータ研究の先駆者、後藤英一さん他界」
URLリンク(slashdot.jp)


363:デフォルトの名無しさん
05/06/16 11:02:58
質問です。
『初めての人のためのLISP』を図書館で借りて読んでいるのですが、ちょっと
分からない点があります。

P147
-------------------------
初心者は nconc の使い方でミスをするケースが非常に多い。例えば,プログ
ラムの中で
(setq x (nconc '(title =) y))
などとやると,プログラムの中の
(title =)
というリストの後ろに y の値がくっついてしまう。だからふたたびこの式を
評価すると,前回くっついたものの後ろにまた nconc することになる。プロ
グラム中で quote されたリストもデータには代わりはないから要注意。
-------------------------

しかし、手元の処理系(emacs21, xyzzy)では、上の式は何度評価しても、x に
は同じ(equalな)値がバインドされています。どんどん長くなったりしません。

私が勘違いしているのでしょうか?それとも、昔の処理系なら x はどんどん
長くなったのでしょうか?


364:ζ
05/06/16 12:21:12
こうゆーことが言いたいんじゃないのか?

(setq a "hi" )
=> "hi"

(setq a (nconc '(title =) a))
=> (title = . "hi")
=> (title = title = . "hi")
=> (title = title = title = . "hi")
=> (title = title = title = title = . "hi")


365:363
05/06/16 12:37:21
ちょっと違うと思います。それだったら、nconc ではなく append でも同じで
すから。


366:デフォルトの名無しさん
05/06/16 13:31:00
評価するときに
(setq x (nconc '(title =) y))
ってもう一度打ち込んでるとか。
そうすると '(title =) のリストが(多くの処理系では)再評価のたびに新しく作られる。
(defun f () (setq x (nconc '(title =) y)))
のような関数を作って (f) を再評価してみては?

ちなみにANSI Common Lispの規定ではquote式のリストを書き換えることは禁止
になっていたと思う。

367:364
05/06/16 14:06:31
当方の環境は emacs と xyzzy ですので、新たに手入力をしたりはしていませ
ん。*scratch buffer* の同じ行で、C-j を繰り返しています。それでも x は
伸びないのです。

なお、念のため (defun f () (setq x (nconc '(title =) y))) も書いてみま
したが、やはり emacs、xyzzy とも x が伸びたりはしません。


368:デフォルトの名無しさん
05/06/16 14:15:10
こうじゃないの?
(setq x '(1 2 3))
(nconc x '(4 5))
nconc を繰り返すと x は長くなっていく(@emacs21)。

369:デフォルトの名無しさん
05/06/16 14:15:44
>>367
>C-j を繰り返しています。
これはLispインタプリタ側から見たらテキストを再入力してるのと同じ。
内部的にはトップレベルの (read) がもう一回呼ばれるからね。

ところで y の値には何を入れて試してるの?

370:364
05/06/16 14:36:05
(setq y 'hoge) としてから実行しています。ちなみに、先の関数 f をバイト
コンパイルしても、やはり x は伸びません。

私の疑問をまとめますと、'(title =) を評価したら、それが再度の手入力で
あれ、バイトコンパイル後の関数内であれ、毎回新たな cons セルが生成され
るのが自然なのではないか、x が伸びるのはおかしいではないか、というもの
です。

しかし、よく考えてみると、伸びないのが逆におかしいような気もします。混
乱してきました。

nconc に渡されるものの実体は何でしょうか?渡されるものがただの文字列で、
それを nconc が評価してリストを生成するなら、伸びないのが自然だし、渡
されるものが cons セルそのもので、その生成は最初にコードを書いたときに
行われるなら、伸びるのが当然のような気がします。

皆さんの処理系では、どうなるでしょうか?


371:デフォルトの名無しさん
05/06/16 14:44:44
destructive か non-destructive の差だろ。
実装による。

372:デフォルトの名無しさん
05/06/16 14:48:44
>>370
'(title =)のセルが作られるのはトップレベルの内部で呼ばれるread関数の中。
エディタは文字列で持っているが、それがLispの世界に渡されるときにconsセル
に変換される。君の場合はC-jを押したときに起こっているはず。

あとyの値がアトムでは面白いことは起きないだろ。
(setq y '(hoge))
(defun f () (setq x (nconc '(title =) y)))
しておいて(f)を評価してみ。2回目の評価で凄いことが起きるぞ。w

373:デフォルトの名無しさん
05/06/16 14:50:01
>>371
nconcがdestructiveでない実装ってある?

374:364
05/06/16 16:39:48
大変よく分かりました。ありがとうございます。というか、実に自分は分かっ
てませんでした。

(setq y '(hoge); リストを入れる。
(f);      評価にあたって、バイトコンパイルの必要はない。
=>(title = hoge) ; 1回目
=>(title = hoge hoge . #2) ; 2回目
=>無限ループ ;3回目...あわてて C-g で停止。

nconc は破壊的だから、同じリストを nconc で何度も結合すると、自己参照
が起きてしまうのですね。私のところで問題が起きなかったのは、一つはアト
ムを nconc していたからなのですね。

まとめると、こんな感じでしょうか。
・(setq x (nconc '(title =) y)) の評価は、これを素で評価するのと、関数
 に入れて評価するのとで、結果が違う。
・(setq z '(title =)) として、(setq x (nconc z y)) を評価すると、素で
 評価しても、関数に入れても同じ結果になる。
・だから、Common Lisp では、quote 式のリストに破壊的操作を行ってはなら
 ないことになっている。


375:デフォルトの名無しさん
05/06/16 18:54:46
違う。それだと (setq x (nconc (list 'title '=) y)) でも同じだよね。

* '(a b c) のようなフォームはリテラルと呼ばれ、コンパイル時に作成される。
* だから (defun f () '(a b c)) の時、(eq (f) (f)) は真になる。
* もしここでリテラルの変更を許可してしまうと
(f) => '(a b c)
(nconc (f) '(d e f))
(f) => '(a b c d e f)
となり、参照透過性が保てなくなる。
* また、コンパイラは同じ値のリテラルを同じオブジェクトにしてもかまわない。
(setq x '(a b c) y '(a b c)) において (eq x y) が真になってもかまわない
ということ。そのような最適化をするコンパイラでは
(setq x '(a b c) y (nconc '(a b c) '(d e f))) で x まで '(a b c d e f)
になってしまう。


次ページ
最新レス表示
スレッドの検索
類似スレ一覧
話題のニュース
おまかせリスト
▼オプションを表示
暇つぶし2ch

5277日前に更新/268 KB
担当:undef