CommonLisp Scheme Pa ..
[2ch|▼Menu]
136:デフォルトの名無しさん
04/02/11 21:26
これのことですか.

URLリンク(dotlisp.sourceforge.net)

Activity Percentile (last week): 19.2626%

137:デフォルトの名無しさん
04/02/12 02:48
ecl をインストールしてみた。ドキュメントに書いてあるように hello world の
スタンドアローンプログラムを作ってみたら約 3MB の実行ファイルが出来た @
Mac OS X. こんなもんかな。

ところで、数ある Lisp レベルのスレッドの実装ってマルチプロセッサ下でどの位
スケールする物なのでしょうか? 実装依存 && 環境依存でしょうか。

138:デフォルトの名無しさん
04/02/12 04:00
clisp と ecl をたらいまわし簡易ベンチで比較してみました。ソースはここから。

最速スクリプト言語決定戦!
スレリンク(tech板)

結果)
非コンパイル:
clisp tarai.lsp 101.07s user 0.36s system 96% cpu 1:44.59 total
ロード -> コンパイル -> 実行:
clisp -C tarai.lsp 9.30s user 0.03s system 99% cpu 9.380 total
コンパイル済:
clisp tarai.fasl 9.28s user 0.06s system 99% cpu 9.342 total

ロード -> コンパイル -> 実行:
ecl -load tarai.lsp 67.55s user 19.54s system 93% cpu 1:33.05 total
コンパイル済:
./taraiecl 1.89s user 0.05s system 100% cpu 1.935 total

バージョンとか)
gcc (GCC) 3.3 20030304 (Apple Computer, Inc. build 1495)
GNU CLISP 2.32 (2003-12-29) (built 3285246448)
ECL (Embeddable Common-Lisp) 0.9c

139:デフォルトの名無しさん
04/02/12 07:51
>>137
C で書いたプログラムを動かすには C のランタイムが必要だ。
Java で書いたプログラムを動かすには java のランタイムが必要だ。
Lisp で書いたプログラムを動かすには Lisp のランタイムが必要だ。
で、通常 C のランタイムはシステム標準で付いてくるので意識する人が
少ないだけ。

寡聞にして Lisp レベルのスレッドの実装が複数あるとは知らなかった。
商用 Lisp は大抵 OS のネイティブスレッドだろうしなぁ……。まぁ
Lisp レベルのスレッドだとあんまりマルチプロセッサだから〜とか
期待しないほうがいいんじゃないかな。ネイティブスレッドのほうが
どう見ても有利だろう。

140:デフォルトの名無しさん
04/02/12 08:06
>>139
>寡聞にして Lisp レベルのスレッドの実装が複数あるとは知らなかった。
すんません。嘘書きました。CMUCL 以外の処理系がネイティブである
事をあまりにも強調してるので、混乱してました。

>商用 Lisp は大抵 OS のネイティブスレッドだろうしなぁ……。まぁ
>Lisp レベルのスレッドだとあんまりマルチプロセッサだから〜とか
>期待しないほうがいいんじゃないかな。ネイティブスレッドのほうが
>どう見ても有利だろう。
御意。

ファイルサイズの件について、ECL はデフォルトで共有ライブラリ化
されるみたいなので Mac 以外でも試してみます。現状でも特に不満は
無いです。

141:デフォルトの名無しさん
04/02/13 14:31
URLリンク(boost.cppll.jp) キモッ

142:デフォルトの名無しさん
04/02/13 15:46
>>141
俺にゃぁこーゆうのは複雑怪奇に見えるが,それでも、lisp よりはマシだとか思う
人も多いのだろうな。


143:デフォルトの名無しさん
04/02/13 16:12
GNUがm4なんて捨ててGuileをGNUツールの中心に据えるなんて話を
大分昔に聞いたんだけど、どうなったんだろう。親分の思惑とは
離れて、LISP嫌いのUNIXユーザが多すぎるんだろうな。arcなんてのも
最近は更新されてないし。

144:デフォルトの名無しさん
04/02/13 16:17
多過ぎるって程でもないんじゃないのかな。elispは結構使われてるし。

145:デフォルトの名無しさん
04/02/13 16:21
>>141
##の使い方見てて切なくなった(w

146:デフォルトの名無しさん
04/02/13 19:34
俺は元大したことないLisper。CLOSなんかでprogramming。
今はC++のtemplateを使ったgeneric programmingに萌え。

147:デフォルトの名無しさん
04/02/13 23:00
漏れは大したことのないC++コード書き。template使ってgeneric&generativeなprogramming。
最近興味本位で触ったLispのマクロにくらくらしてる。

148:デフォルトの名無しさん
04/02/14 08:20
リストが循環構造かどうか、って判定する方法ある?
いちいち全部比較してくよりは、GCのマーク&スイープみたいに
マーク付けながら辿っていった方がいいかな。

149:デフォルトの名無しさん
04/02/14 08:37
>>148
hare and tortoise

150:デフォルトの名無しさん
04/02/14 15:30
"tortoise and hare" algorithm は
guile/libguile/list.c の scm_ilength() を見たらよいよ。

151:デフォルトの名無しさん
04/02/14 23:02
SICPの例題をこなすのにお勧めのSchemeの処理系はありますか?
環境は、Win2000 です。

152:デフォルトの名無しさん
04/02/14 23:52
何でもいいに決まってる。

153:デフォルトの名無しさん
04/02/15 01:43
>>151
DrSceme が簡単でいいんじゃないの?
cygwin + gauche という手もあるけど。

154:デフォルトの名無しさん
04/02/15 02:44
>>153
漏れ、最初DrScheme使ってt-y-schemeやったけど、
売りのトレースとかが、初心者モード(ほとんど何にもできない)でしか使えなくて泣いた。


155:デフォルトの名無しさん
04/02/15 03:02
>>151
SICPのサンプルコードはSCMかMIT-Schemeだった気がするので、
Cygwinで動くようならこれが無難?

win2kならPetite Chez + ChezEditも良いかもしんない。

156:151
04/02/15 11:17
MIT-Schemeってこれ URLリンク(www.gnu.org) ですか?
Windows binary 版をインストールしてみました。
EDwinって言うEmacs見たいなエディタも付属してます。

つか、殆どEmacs。。。
Lisp/Scheme やるには Emacs も覚えなあかんの。 _| ̄|○

Schemeの処理系って小さいイメージがあったけど
MIT-Schemeって一式で35Mbyteもあるのね。

157:デフォルトの名無しさん
04/02/15 11:42
>Emacs も覚えなあかんの。 _| ̄|○
Win環境の人からすると異常だけど、
UNIXのソフトって全体的にemacsのキーバインドに沿ったものが多いからね。


158:デフォルトの名無しさん
04/02/15 14:16
>>156
さあ、*nix文化へいらっしゃい。
今までM$に飼い頃されてたのはなんだったんだ、と開眼するから。

159:デフォルトの名無しさん
04/02/15 15:31
vi>>>>>>>>>>>>>>>>>>emacs

160:デフォルトの名無しさん
04/02/15 15:57
秀丸>>>>>>>vi

161:デフォルトの名無しさん
04/02/15 16:07
Emacs>>>>>秀丸

さてどうしよう。

162:140
04/02/15 18:55
Scheme についても調べてみました。ネイティブコードコンパイル可能な処理系では、chicken と
mzScheme は Lisp レベルでの thread みたいでした。RScheme はサイトが落ちていて不明。

ECL で --enable-threads するとビルド出来ない(最新 CVS 版)のですが、Linux 限定なのかな。

163:デフォルトの名無しさん
04/02/15 20:13
>>157, 158
一応、vi (ex, ed) は使えるんですけどね。漏れって vi 信者。w
などと言いながら emacs のマニュアル本買って来ました。




164:デフォルトの名無しさん
04/02/15 21:15
Kahua セミナー逝った香具師、レポートしてください。
地方在住 lisper は逝きたくても逝けないのです。おながいします。

165:デフォルトの名無しさん
04/02/15 22:31
>>158
ウイソのプログラムでメシを食ってる漏れとしてはそんな事は口が裂けても・・・


166:これってどうよ?
04/02/16 10:40
Pythonによるcommon lispのフロントエンド "lython"
URLリンク(www.caddr.com)

スラドの記事
URLリンク(slashdot.jp)



167:デフォルトの名無しさん
04/02/16 11:30
あくまで、Common Lisp風ね。だからScheme風といってもいいだろうし。
(import os)

(:= out "/tmp/lythontest")
(if (os.path.exists out)
    (os.unlink out)
  (print "target file does not exist"))

(:= f (open "/tmp/lythontest" "w+"))
(f.write "Hello World from Lython!")

168:デフォルトの名無しさん
04/02/17 05:50
pythonのライブラリが使えるlispモドキかな。
ちょっと前に話になったスクリプト云々の話は
これに食われそうだね。
ポータブルな実装としてはベースがpythonなら問題ないだろうし。

169:デフォルトの名無しさん
04/02/17 14:26
前も話題に出たけど、pythonと共存できて何か意味あるのか?

速度: pythonはバイトコード
ライブラリ: pythonよりもC/C++のライブラリの方が膨大


170:デフォルトの名無しさん
04/02/17 14:49
> ライブラリ: pythonよりもC/C++のライブラリの方が膨大

FFI が面倒なので Python のライブラリでウマーって事でしょう.
まぁ,中途半端な Lisp モドキよりは普通に Python 使ったほうが
いいような気がしますがね…

171:デフォルトの名無しさん
04/02/17 16:09
#define BEGIN { と似たような一抹の虚しさがただような。
ライブラリを手軽に使うのだけが目的なら、Common LispかSchemeと言語仕様を同じにしなくちゃね。
ただ、ここから新しい言語として羽ばたかせようというなら話は別だけど。
Arcみたいにね。

まぁ、ただ面白そうだからやってみたんだろうけど。

172:デフォルトの名無しさん
04/02/17 16:32
おまえらこんなとこでケチつけてないで、今 後 に 期 待 し と け

173:デフォルトの名無しさん
04/02/17 16:47
>>172 そんな言い方じゃ、話が面白くならないよ。今後に期待できるようなことは何かあるの?

174:デフォルトの名無しさん
04/02/17 16:57
pythonが超ポピュラーになってライブラリが暴発的に増えるとかいう展望を抱けw

175:デフォルトの名無しさん
04/02/17 17:10
lythonダウンロードしてみました。ウェブサイトやコードを見た限り、まだまだ、
孵化する日は先で、生まれたてのホヤホヤという感じです。

みんなが作るのが好きな俺Lispの1つですね。

しかし、よくSlashdotが取り上げたね。それが悪いというわけじゃないけど。

176:175
04/02/17 17:13
あっ、つけるの忘れてた。最後にwをつけて読んでください。

177:デフォルトの名無しさん
04/02/17 17:37
(´-`).。oO(孵化してないのに産まれたて。。。)

178:デフォルトの名無しさん
04/02/17 17:41
(・A・)lython!!

179:デフォルトの名無しさん
04/02/17 22:46
大蛇は卵生だから、産まれてから孵るまで時間がかかるんじゃないの。

しかし、インデントのかわりにS式使ってる感じだね。

そういえば、Parrot上のSchemeはどうなったんだろ。Parrot自体が資金ショー
トという噂も聞いたこともあるけど。


180:デフォルトの名無しさん
04/02/18 01:45
えーとguileやgaucheは「組み込みLispライブラリ」としての用途も意図されているわけですが,
実際に組み込むためのHOWTO文書とかチュートリアルってあります?
けっこう検索したんだが見付からない.

guileを組み込んだGNUプロジェクトのアプリはいくつかあるけど,大き過ぎて見る気がしない.
なんか「Schemeで拡張できるtail(1)を作ってみました」みたいな文書ないもんですかね.

181:デフォルトの名無しさん
04/02/18 11:00
>>180 guileの現状は知らないんですが、すこし前までは、guile自体の発展速度が
速すぎて、非互換な変更とかがけっこうあって、アプリに組み込んだ人が苦労した
という話がありました。とかいうふうに一度、レッテルを貼られると、それを取り除く
のに苦労しますよね。GNUはマニュアルをちゃんと書く習慣があると思うんだけど、
guileのマニュアルにアプリへの組み込みチュートリアルないのかな?

>>179 つーか、Parrotをやってる人たちって金もらっているのですか?
ParrotがJVMレベルのバーチャルマシンとしてみんなに認められれば、オモロ。

182:デフォルトの名無しさん
04/02/18 17:14
>>181
とりあえず去年の今ごろのParrot/Perl6の紹介には金が足りないというのがあっ
た。URLリンク(www.newsfactor.com)

CVSにはscheme用もあったけど動くのか不明。ぱっと見、まだ途中かなという
感じがした。H"なんで下して試す元気がないから、誰が試してくれるとうれし
い。

;; 遅れぎみ(婉曲的な表現)なんで、逆に誰かがどれでもいいから別のVM上に
;; Perl6を実装しちゃえば英雄になれるかも。


183:180
04/02/19 01:04
>>181
GuileのinfoのPart 3がそれっぽいんですが,どうもイマイチ実感が...
マトモなサンプルになってないんですよ.
ドローソフトの組み込みにするために,いかに「図形」をSchemeオブジェクトとして
Cレベルで定義するかが主眼らしいんだけど.
そんな高尚なことよりとりあえずS式の設定ファイルを読みたいだけなのにな.
ま,がんばったらできそうなので文書にするかも.

184:デフォルトの名無しさん
04/02/19 19:52
>>180
Gaucheはドキュメントはまだ無いみたいだけど、インタプリタであるgoshが
「Gaucheライブラリのサンプルアプリ」という位置付けらしいのでソース見るのが早い。
goshはlibgaucheを初期化してrepl起動してるだけだから本当に小さいし。

185:デフォルトの名無しさん
04/02/20 23:00
Gauche0.7.4.1 で gdbm はどうやって使うのでしょうか。
gdbm.so が ext/Makefile から外されてる
gdbm.c はコンパイルできない。エラー多すぎ
までは調べました


186:デフォルトの名無しさん
04/02/20 23:04
半分解決

ndbm 使うと perl コンパチのファイルができたみたい・・
なので gdbmは不要となりました。


187:デフォルトの名無しさん
04/02/20 23:18
確か、configure時にgdbmの存在をチェックしてると
思うので、それが見つけられていないのでは。
gdbmが/usr/localとかにインストールしてあるなら、
./configure --with-local=/usr/local みたいにするとか。


188:デフォルトの名無しさん
04/02/21 00:11
恐れ入ります。
config.log 見て納得しました。
perl は p5-GDBM 入れないと駄目なんですね。
gdbm はあまり使われてないと。


189:デフォルトの名無しさん
04/02/21 11:11
multiple-value-bind の属性リスト版を書いたんですけど、
どうやったら gensym を使うように改良できますか?

使い方は、(setq alist '((a 2) (b 3))) と代入しておいてから
(alist-bind alist (print (+ a b)) (* a b)) を評価すると、
5 を印字してから 6 を返すような関数です。

現状はこんな感じです。
(defmacro alist-bind (alist &body body)
 (let ((alist-bind-internal-variable (eval alist)))
  `(multiple-value-bind
   ,(values (mapcar #'car alist-bind-internal-variable))
  ,(cons 'values (mapcar #'cadr alist-bind-internal-variable))
   ,@body)))
バッククオートを入れ子にして使うのがどうしてもうまくいかなくて
ほかと重ならない変数名で逃げてます。実用上は問題ないんですが
もっとスマートな解決策はないものでしょうか。

190:デフォルトの名無しさん
04/02/21 11:13
>>189
>5 を印字してから 6 を返すような関数です
マクロの typo です。

191:デフォルトの名無しさん
04/02/21 12:28
>>189
ちょっとあなたのと仕様が違いますが、昔書いたものを。

(defmacro alist-bind ((&rest vars) alist &body body)
(let ((tmp (gensym)))
`(let ((,tmp ,alist))
(let ,(mapcar #'(lambda (var)
`(,var (cdr (assoc ',var ,tmp :test #'eq))))
vars)
,@body))))

(setq data '((a . 1) (b . 2) (c . 3)))

(alist-bind (b c a) data
(list b c a))
=> (2 3 1)

(macroexpand-1 '(alist-bind (b c a) data (list b c a)))
=> (LET ((#:G219 DATA))
(LET ((B (CDR (ASSOC 'B #:G219 :TEST #'EQ)))
(C (CDR (ASSOC 'C #:G219 :TEST #'EQ)))
(A (CDR (ASSOC 'A #:G219 :TEST #'EQ))))
(LIST B C A)))

192:189
04/02/22 22:00
>>191
let の変数定義をマクロ展開の結果に置き換えるマクロを書くわけですね。
勉強になります。alist-bind がレキシカルコンテキストを参照できるので、
こちらの方が優れてますね。その代わり、vars に与える変数一覧を事前に
与えないといけないので、今やりたい用途には使えないですね。

いま欲しいのは、destrucuring-bind の複数版で、1個の値に対して
パターンを複数与えることができるようなマクロです。最初のパターンに
うまくマッチしなければ次のパターンを試し、マッチしたパターンがあれば
そこで変数を束縛して、対応する式を順次評価して最後の式の値を返すと
いうような物です。最後のパターンにもマッチしなかったばあいは nil と
いうことで。
(let ((x 2))
 (dbind* (list (+ 3 4) 5)      ; 最初に評価して(7 5)を得る
  ((a b c) (list a b c))       ; マッチしないので実行されない
  ((a b) (incf x) (list a b x))))   ; (7 5 3) になる
というような dbind* がうまくできなくて困ってます。
まず値を集めて、後から展開するという方針が間違ってるのかもしれません。
どうしても評価のレベルが一致しないんですよね。

193:デフォルトの名無しさん
04/02/22 22:20
先に進んじゃってるとろスマンけど、>>189 ってちゃんと動くのか?
(setq alist '((a 1) (b 2)))
(alist-bind alist (print (+ a b)) (* a b))
とかいたファイルをコンパイルしたら、alist-bind の展開時に
まだ alist がバインドされてないとかでエラーになるような…。

194:デフォルトの名無しさん
04/02/22 23:00
>>192
パターンが単純であればこんな感じかな?
destructuring-bind と同等のことがしたい場合は、
もっと複雑なことをしなければならないが。

(defmacro dbind* (list &body forms)
 (let ((vals (gensym)))
  `(let ((,vals ,list))
    (case (length ,vals)
     ,@(mapcar #'(lambda (form)
            (let ((vars (car form)))
             `(,(length vars)
              (let ,(mapcar #'(lambda (var)
                       `(,var (pop ,vals)))
                     vars)
               ,@(cdr form)))))
          forms)))))

195:189
04/02/22 23:50
>>193 やってみたら、compile-file でエラーが出ました。load したら 3 が印字されて t が
返りましたけど。>>192 がうまく動かないはそのせいなのかもしれません。

196:189
04/02/23 00:21
>>194 すみません、調べてみたら destructuring-bind よりもっと複雑な仕様でした。
例えば (dbind* '(a (2 3 4)) (('a (b 3 c)) (+ b c))) がマッチして、6 が返されます。
シンボル以外のアトムや quote されたシンボルをネストした S 式の中に書くことができ、
パターンの同じ場所に eq になるアトムが存在するときに、マッチするものと見なされます。
上の例の 3 や a がそれです。このとき、a はシンボル a に束縛されます。

197:デフォルトの名無しさん
04/02/23 01:50
>>196
ふむ、若干面倒だね。とりあえず、パターンのシンボルに
リストがマッチするものとして書いてみた。

(defun match (vars vals)
 (do ((vars vars (cdr vars))
    (vals vals (cdr vals)))
   ((or (null vars) (null vals))
    (not (or vars vals)))
  (let ((var (car vars))
     (val (car vals)))
   (unless (cond ((eq var val) t)
          ((symbolp var) t)
          ((atom var) nil)
          ((eq (car var) 'quote)
           (eq (cadr var) val))
          ((atom val) nil)
          (t (match var val)))
    (return)))))

198:197
04/02/23 01:50
続き

(defmacro dbind* (list &body forms)
 (let ((dummy (gensym))
    (vals (gensym)))
  (labels ((bind (vars vals)
        (mapcan #'(lambda (var)
              (cond ((atom var)
                 `((,(if (symbolp var) var dummy)
                   (pop ,vals))))
                 ((eq (car var) 'quote)
                 `((,(if (symbolp (cadr var)) (cadr var) dummy)
                   (pop ,vals))))
                 (t (let ((temp (gensym)))
                   `((,temp (pop ,vals))
                    ,@(bind var temp))))))
            vars)))
   `(let ((,vals ,list))
     (cond ,@(mapcar #'(lambda (form)
               (let ((vars (car form)))
                `((match ',vars ,vals)
                 (let* (,@(bind vars vals))
                  ,@(cdr form)))))
             forms))))))

199:デフォルトの名無しさん
04/02/23 05:51
Gauche0.7.4.1をインストールして
(string-concatenate-reverse '(" must be" "Hello, I") " going.XXXX" 7)
っていう式を評価させたらエラーになったんだけど、
SRFI-13ではそういう実装も許されてるの?
それともインストール失敗しただけ?

200:デフォルトの名無しさん
04/02/23 06:21
>>199 バグじゃん? wilikiにでも報告するよろし。


201:デフォルトの名無しさん
04/02/23 18:37
perlのスクリプトとをgaucheに移植してるんだけど
perlとgaucheの対応表なんてどっかにありませんか。
とりあえず
open(STDERR, ">&STDOUT")
$| = 1
$!
がわからない。


202:デフォルトの名無しさん
04/02/23 22:40
>>199
URLリンク(www.shiro.dreamhost.com)
optionalついてないのがGaucheでの仕様なんじゃないの?

203:デフォルトの名無しさん
04/02/25 19:07
つーかトランスレーター作ろうぜ
perlよくわからない

204:デフォルトの名無しさん
04/02/25 20:51
Perl を勉強して書き直すほうがためになるよ。きっと。

205:デフォルトの名無しさん
04/02/25 21:07
Perlを知らずにトランスレータもないだろうに

206:デフォルトの名無しさん
04/02/26 00:12
>>201
$| = 1 と $! の例を強引に考えてみた(dup は不明)。詳しい人のフォロー希望。

(with-error-handler
(lambda (e) ;; e は例外オブジェクト($! のようなもの)
(format (current-error-port) "ERROR: ~a¥n" (ref e 'message)))
(lambda ()
;;(with-input-from-file *program-name* ;; 正常パターン
(with-input-from-file "nowhere file" ;; エラーパターン
(lambda ()
(set! (port-buffering (current-output-port)) :full) ;; $| = 1 ?
(port-for-each
(lambda (line)
(display line)
(newline))
read-line)))))

C がわかるなら、リファレンスの C と Scheme の対応一覧が役に立つかも。

207:デフォルトの名無しさん
04/02/26 10:34
勘で。

----
$|=1;
open IN, "foo.pl";
print while (<IN>);

-----
(call-with-input-file "foo.scm"
(lambda (in) (copy-port in (current-output-port)))
:buffering :none)


208:こゆことかな...?
04/02/26 11:29

------------------------------
#!/path/to/gosh

(display "Content-type: text/plain\r\n\r\n")
(display "Test.\r\n")

(with-error-handler (lambda (e) (print #`"***ERROR: ,(ref e 'message)") (exit 1))
(lambda () (with-input-from-file "no_such_file" (lambda () (print "File opend.")))
))

------------------------------
#!/path/to/perl

open(STDERR, ">&STDOUT");
$| = 1;

print "Content-type: text/html\n\n";
print "This is a test.<BR>";

open(IN, "no_such_file") || die "***ERROR: ", $!;
close(IN);


209:デフォルトの名無しさん
04/02/26 15:25
恐れ入ります。
簡単に行かないというのがわかりました。
dup と flush は gosh本体に仕込んで起動時オプションで処理する。
$! もグローバル変数に組み込んでしまうのが簡単か


210:デフォルトの名無しさん
04/02/27 00:11
別の言語なんだし全部直訳はできないのは当然じゃん。
いろいろ解説してくれた人がいたんで代わりにまとめ。

open(STDERR, ">& STDOUT") なら
(with-error-to-port (current-output-port) THUNK)

$| = 1 じゃなくて autoflush を使うべきなんで
((setter port-buffering) PORT :none)

$! でメッセージが欲しいのなら with-error-handler
でエラーをキャッチして (slot-ref ERR 'message)。
これは eval で die をキャッチするのをイメージ。


211:189
04/02/27 08:09
>>197-198
ありがとうございました。遅くなりましたが、自分の欲しい内容への改造が
やっとできたのでお伝えします。
比較対象がアトムやquoteされたアトムの場合の動作を改善するため、
トップレベルだけを別扱いにすることにしました。
(defun match0 (vars vals)
(cond ((symbolp vars) t)
((atom vars) (eq vars vals))
((atom vals)
(and (eq (car vars) 'quote) (null (cddr vars)) (eq (cadr vars) vals)))
((eq (car vars) 'quote) nil)
(t (match vars vals))))
という関数を追加し、dbind* の labels で定義している局所関数にも
((bind0 (vars vals)
(cond ((atom vars) (if (symbolp vars) `((,vars ,vals))
`((,dummy ,vals))))
((eq (car vars) 'quote) `((,dummy ,vals)))
(t (bind vars vals))))
という定義を追加します。そして dbind* 末尾から3,4行目の
`((match ',vars ,vals)
(let* (,@(bind vars vals))
をそれぞれmatch0, bind0 の呼び出しに置き換えます。

動作の変わった例としては、以下のようなものがあります。
(dbind* 3 ((4) 5)) ; エラーにならずにnilを返すようになった
(dbind* '(3 7) (any any)) ; (3 7) を返すようになった
(dbind* '(3 7) ('any t) ; 7 を返していたのがnilを返すようになった

212:嵩
04/02/27 16:48
131 : :04/02/10 19:06
(define make-structure
(lambda (n) (lambda (d) (lambda (m) ((m n) d)))))
(define select
(lambda (c) (c (lambda (a) (lambda (b) a)))))

の意味がいまいちわかりません。
例えば、
(select ((make-structure (+ 7 5)) (- 9 3)))
とした時のラムダ計算の課程を教えてくれませんか。

132 :デフォルトの名無しさん :04/02/10 19:17
>>131
n := 7 + 5 => 12
d := 9 - 3 => 6
c := (lambda (m) ((m 12) 6)) => #<closure>
m := (lambda (a) (lambda (b) a)) => #<closure>
a := 12 => 12
b := 6 => 6
=> 12

となっているけど、もう少し詳しく説明できる人いますか?
ラムダ計算が今一よくわからないもんで。

213:デフォルトの名無しさん
04/02/27 16:54
>>212
詳しく説明できるが

聞 き 方 が 気 に 食 わ な い

214:デフォルトの名無しさん
04/02/27 17:09
関数適用で束縛変数を引数で置き換えればいいんだよ。

215:デフォルトの名無しさん
04/02/27 17:18
make-structure = λn.λd.λm.((m n) d)
select = λc.(c λa.λb.a)

(select ((make-structure (+ 7 5)) (- 9 3)))
= (select ((make-structure 12) 6))
= (select ((λn.λd.λm.((m n) d) 12) 6)) ; nを消す
= (select (λd.λm.((m 12) d) 6)) ; dを消す
= (select λm.((m 12) 6))
= (λc.(c λa.λb.a) λm.((m 12) 6)) ; cを消す
= (λm.((m 12) 6) λa.λb.a) ; mを消す
= ((λa.λb.a 12) 6) ; aを消す
= (λb.12 6) ; bを消す
= 12

216:デフォルトの名無しさん
04/02/27 23:36
私はslot-refでCLOS止めました
letで囲めばいいじゃん!

217:デフォルトの名無しさん
04/02/28 02:39
なんか物凄い基本的なことかもしれないですが、
Schemeの末尾再帰の動きが良くわからないのです。
どなたか教えてくださいませんか

(define fact-tail
(lambda(n x)(if( (= n 0) x
(fact-tail(- n 1)(* n x)))))

階乗を求めようとしているのはわかりますが、
これに対して、(fact-tail 5 1)
を与えたら何で120が導けるのかいまいちわからないです。

(fact-tail 3 1) として
どういう風に再帰展開されるのかわかるかた
教えていただけませんでしょうか。

218:デフォルトの名無しさん
04/02/28 02:48
>>217
1ステップずつ考えれば分かるだろ

219:デフォルトの名無しさん
04/02/28 02:50
>>217
(fact-tail 3 1)
(fact-tail (- 3 1) (* 3 1))
(fact-tail 2 3)
(fact-tail (- 2 1) (* 2 3))
(fact-tail 1 6)
(fact-tail (- 1 1) (* 1 6))
(fact-tail 0 6)
(= n 0) が真になるので 6 を返す

末尾再帰は C などの for ループと本質的に同じ
int fact(int n){
    int x=1;
    for(; n--; 0!=n) x*=n;
    return x
}

220:217
04/02/28 03:05
>>219
ありがとうございます。ぼけてました。引用もとの文には
(if (= n 0) x
と書いてあるのに手持ちのメモに
(if (= n 0) 1
と書き写してしまいそっちをみていてはまってしまいました
すっきりしました。おさわがせしてすみません。

221:217
04/02/28 03:11
>>219
引用元はSoftwareDesign の2000年9月号のScheme特集でした。
「末尾再帰を使うとスタックを消費しない」
と書いてあったけどイメージしにくかったんですが
for ループに対応してると考えるとわかりやすいですね。

222:デフォルトの名無しさん
04/02/28 11:34
繰り返しを末尾再帰に直すと、変数代入の様な
明示的副作用を書なくて良いというのがあって、
Schemeではset!をほとんど使わずにコードが書ける。


223:デフォルトの名無しさん
04/02/28 12:18
schemeに限ったことじゃないような。
まあ、"俺Lisp"的な実装はは末尾再帰最適化がなかったりするけど。


224:デフォルトの名無しさん
04/02/28 13:18
>>223
Schemeは言語仕様上いつでも安心して使えるってことだよ。
例えばtail recursionがproperじゃないCommonLispで
「常に末尾再帰を意識しながら書く」って奴がいるとも思えないが。


225:デフォルトの名無しさん
04/02/28 15:41
>>216
言いたい事が良くわかりまらないんだが with-slots あたりで満足ですか?

>>224
大抵のプログラマは意識はしてると思いますが。
末尾再帰の話が出てこない CL の入門書は見たことないですし。
CL だと最適化オプション下げれば末尾再帰の最適化が
OFF になってデバッグしやすくなるし。

226:デフォルトの名無しさん
04/02/28 16:08
Emacs LispやCommon Lispを主に使って、Schemeはあまり使わない俺の場合だと、
再帰呼び出しが末尾にあるかどうかは最初はほとんど気にしません。

読みやすさや見ための綺麗さを優先して最初はコーディングします。

再帰を使う時は、スタックの消費量が問題になるほど、呼び出しが深くなるか
どうかには注意します。そして、CLを使っているときは、もし再帰呼び出しが
末尾位置にあれば、ああ、スタックの消費量を気にしなくてもいいかな、という
考えが頭に浮かびます。

227:225
04/02/28 16:16
> 言いたい事が良くわかりまらないんだが with-slots あたりで満足ですか?
いかん、丁寧に直したら副作用で日本語が壊れている……

>>226
末尾再帰って末尾位置に再帰があれば良いってもんじゃないんだけど。


228:デフォルトの名無しさん
04/02/28 16:22
>>227
>末尾再帰って末尾位置に再帰があれば良いってもんじゃないんだけど。
R5RSに定義されている「末尾位置」のつもりだったんですけど?


229:デフォルトの名無しさん
04/02/28 16:45
>>227
> 言いたい事が良くわかりまらないんだが with-slots あたりで満足ですか?
あんた、いい人だ!
でもgoshに無いのでやっぱりCLOS止め

230:デフォルトの名無しさん
04/02/28 16:54
>>228
スマン。末尾位置ってはじめて聞いたもんで。tail context の事なのか?

>>229
なんだそりゃ! 無いならお前が作れ!

231:デフォルトの名無しさん
04/02/28 17:07
>>230
> tail context の事なのか?
そうです。不正確でしたね失礼しました。今、R5RSで確認したんですけど、
tail contextが正しい用語みたいですね。覚えておこう。ちなみにtail contextの
日本語定訳はあるのかな?

gaucheでゴーシュ。俺はしばらく「ガウチェ」と発音していたよ。

232:デフォルトの名無しさん
04/02/28 17:07
>>225
末尾呼び出しを思いっきり使えるかどうかって、
コーティングスタイルがまるで変わってくると思うんですが、

>URLリンク(www.swiss.ai.mit.edu)
(define (cpstak x y z)
 (define (tak x y z k)
  (if (not (< y x))
    (k z)
    (tak (- x 1)
       y
       z
       (lambda (v1)
        (tak (- y 1)
          z
          x
          (lambda (v2)
           (tak (- z 1)
              x
              y
              (lambda (v3)
               (tak v1 v2 v3 k)))))))))
 (tak x y z (lambda (a) a)))
;;; call: (cpstak 18 12 6)

たとえばこういう内包挟んだ末尾再帰もCommonLispコンパイラが
ちゃんと末尾として認識するのかなと。

233:デフォルトの名無しさん
04/02/28 17:18
>>230
いや、おれは「letで囲めば良い」を布教させる事に全力を傾けたい
だから、もう一度、キョンキョンにこの歌を歌ってもらおう

(キョンキョン)おまえら!一緒に歌ってくださーい

♪defineの次に、letで囲めばぁー
いーじゃん♪ (見逃してくれよー)
いーじゃん♪ (見逃してくれよー)

♪作ったlambdaの引数はいつもこれ→(msg . args)
いーじゃん♪ (メッセージ送れよー)
いーじゃん♪ (メッセージ送れよー)


(キョンキョン)よし、分かったな。じゃあ解散!

234:デフォルトの名無しさん
04/02/28 17:22
↑バカ?

235:デフォルトの名無しさん
04/02/28 17:24
>>232
大抵のコンパイラは普通に認識するよ。

236:デフォルトの名無しさん
04/02/28 17:25
徹夜で気でも狂ったか?

237:デフォルトの名無しさん
04/02/28 17:30
ワロタ

238:デフォルトの名無しさん
04/02/28 17:32
>>232 俺はこういうコーディングは思いつかないと思うけど、schemerの人って
こういうコーディングをよくするの? 見ためは、綺麗だよね。

239:デフォルトの名無しさん
04/02/28 17:37
>>232
そういうコードが安心して使えるかどうかっていうと駄目だろ。
CommonLispはコンパイラの最適化って点でインプリメンタの気まぐれなわけだし。
コーティングスタイルにまでは及ばない。

240:デフォルトの名無しさん
04/02/28 17:39
>>238
CPS(232みたいなk=continuationを渡していくやつ)はよく使うよ。

241:デフォルトの名無しさん
04/02/28 17:40
♪defineの次に、letで囲めばぁー

242:デフォルトの名無しさん
04/02/28 17:41
春はまだ先だぞ

243:デフォルトの名無しさん
04/02/28 17:44
最適化部分は処理系依存なだけで。 C とかだって最適化は規格で決まってなくても
プログラマは処理系のマニュアル見て安心して使うだろう?末尾再帰の最適化が完全
に良い事づくめなら Scheme みたいに規格で決めちゃってもいいかもしれんけど,デ
バッグがやりにくくなるからなぁ……

でも普通は処理系が対応してりゃ安心して使えるだろう。大抵のコンパイラは末尾再
帰の最適化機能を備えているわけだ。以前 c.l.l でも出ていたがやっぱ最適化オプ
ションに「末尾再帰の最適化」を設けるべきだろうなぁ。規格以外は一切使わないと
いうポリシーもありだと思うけどね。

244:sage
04/02/28 17:45
(見逃してやれよー)

245:デフォルトの名無しさん
04/02/28 17:55
>>243
デバッグがやりにくくなる?
どんなデバッグしてるのさ
ログ出すだけじゃないの?

246:デフォルトの名無しさん
04/02/28 18:40
アセンブラ出力しておっかけてるんだろ

247:デフォルトの名無しさん
04/02/28 18:56
xyzzy で tail recursion が遅いのは大変残念な思いがします.

248:デフォルトの名無しさん
04/02/28 18:56
関数トレースしたり、エラーがでたらバックトレースみたり、
スタックフレームのぞくだけだけど…。ひょっとして「ログ出す」
ってのが普通なの?漏れ Lisp の正規の教育受けてないので
常識には自身がないんだよね。

249:デフォルトの名無しさん
04/02/28 18:58
s/自身/自信/
どうやら国語も勉強しなおしたほうがいいようだ。吊ってくるわ。

250:デフォルトの名無しさん
04/02/28 19:06
所詮はエディタだし。

251:デフォルトの名無しさん
04/02/28 19:08
Lispの正規の教育受けてる人なんてほとんどいないだろ。
Java/C/C++でさえ書籍orWebの情報だけでやっていく人がたくさんいるし。

252:デフォルトの名無しさん
04/02/28 20:55
正規の教育ってなんだ?(w

253:デフォルトの名無しさん
04/02/28 21:14
>>245 のデバッグ手法を教えてください。漏れも最適化したらデバッグ用
情報が減るのは当たり前だと思ってたんだけど。Scheme では関数呼び出し
情報とかはあんまりデバッグに使わないんですか?

254:デフォルトの名無しさん
04/02/28 22:17
schemeも、トレース実行すると末尾再帰の呼び出しが
普通の再帰みたくツリー上に出るんじゃない?
デバッグでなんか大きな違いってあるの?

255:デフォルトの名無しさん
04/02/29 01:09
>>253
ログ出しについての説明か?
ループの中で変化する変数を表示するだけですが。


256:デフォルトの名無しさん
04/02/29 13:11
>>254
え、何という処理系ですか?デバッグ周りって処理系依存ですよね。
トレース実行って特定の関数だけとか全体とか指定できるんですか?
>>255
それだけじゃキツイなぁ。再帰がふか〜い所でエラーな時とか。
やっぱエラーになってデバッガが立ち上がったところから手繰って
いけたほうが便利だと思いますが。私の使ってる処理系は debug レベル
を 2 以上にすると末尾再帰の最適化が行われなくなるのでエラーに
なった時点からフレームをたどっていけますが…。

257:デフォルトの名無しさん
04/02/29 13:50
traceなら処理系というかマクロでできるよ

258:デフォルトの名無しさん
04/02/29 15:53
デバッグがらみの話題で、処理の流れを目で追うことができるソースレベルデバッガが
売り物の処理系でも付いていないというのは、要望が少ないからなのかな? たしかに
バックトレースの表示などの伝統的なやり方でもデバッグできるけどね。あと、要所
要所に(format t "my-var = ~S~%" my-var)を挿入とか。俺はPerlでもこのやり方で
デバッグするね。Data::Dumperという便利なものもあるし。

俺はEmacs Lispではソースレベルデバッガであるedebugをもっぱら使ってdebugはほとんど
使ったことがない。

259:デフォルトの名無しさん
04/02/29 16:39
stepじゃ駄目なの?

260:デフォルトの名無しさん
04/02/29 16:53
>>259 いや、stepでもたぶん同じことができると思うけど、エディタでコード全体を
見渡しながらデバッグできると気持がいいんだよね。ついでに、監視したい式なんかを
複数登録しておいて常時、その値を表示させておくとか。ブレーク時に画面上で変数の
上にマウスポインタを置くだけで、値が表示されるとか。

つまり、昔かたぎの人からみれば、俺は現在のIDEに毒されているヘタレということか。プ

261:デフォルトの名無しさん
04/02/29 17:53
slimeに期待かな。
現時点でもエラー箇所の表示とか凝ったことできるし。

262:デフォルトの名無しさん
04/02/29 18:10
名前がスライムっぽくて嫌

263:デフォルトの名無しさん
04/02/29 19:34
メタルスライムがあらわれた
メタルスライムAは逃げ出した


264:デフォルトの名無しさん
04/02/29 20:05
バックトレースってデバッグでは便利だと思うんだけど Scheme の人は
要らないのかな?拾ってきたプログラムがエラー吐いてとまったときと
かバックトレースが空だとちょっと悲しいんだけど。

>>257
なんか安心して使える trace の実装とかあります?処理系によっては
付いてるみたいだけど。付いてないのも結構あるので困るんですが。

265:デフォルトの名無しさん
04/02/29 22:05
>>264
そういうのはどう転んでも処理系依存だしなあ。
いつでも外せるassertみたいなの埋め込むぐらいしか。
昔さわったminischemeのトレースはトレース対象を出力用の
フック関数で挟む方式だった。後付けマクロ。
関数突入・脱出でトレース出力するので、
トレース対象関数は自然と末尾再帰が外れて山形の出力になる。
ただし内部関数、名無し関数には使えない。


266:デフォルトの名無しさん
04/03/01 12:48
foo,bar,baz,mumble,glorp
これって何に由来してんだぁ?

267:デフォルトの名無しさん
04/03/01 13:21
>>266
foo と bar は RFC で定義されているよ

268:デフォルトの名無しさん
04/03/01 14:02
RFCは冗談も混ざっているからなぁ。

269:デフォルトの名無しさん
04/03/01 23:33
MLの有名な本より写経
A Lisp hacker says: 'Since the integers are a subset of the
real numbers,the distinction between them is wholly artificial
--foisted on us by hardware designers.ML should simply provide numbers,
as Lisp does, and automaticaly use integers or reals as appropriate.'
Do you agree? What considerations are there?

MLerはいろいろ言うだろうが、Lisperはどう答える?

270:デフォルトの名無しさん
04/03/02 00:00
なにを勿体つけてるんだ? ML for the working programmer の ex2.2
って言えばいいじゃん。翻訳もせずに丸投げなあたり宿題か何か?

まぁ実際 ML にまでそうしろと言う Lisper は少ないと思うよ。
NetNews でも ML の数値周りが気に食わないと噛み付いてた Lisper
は居たけど ML に Lisp 式の数値にしろ!とまで言うやつぁ少ないだろ。
理由はなんで ML がそうしてるかを考えればわかるだろ。

271:デフォルトの名無しさん
04/03/02 00:08
まあ、そう熱くならんでも。
型無しのありがたみって何だろうな、というネタフリなんよ。

272:デフォルトの名無しさん
04/03/02 00:36
本からのコピペ程度でいちいち age るのがウザイんだよ。
ML スレでやれば?型無しのありがたみは無いってことでいいからさ。
デバッグ方法が聞けてウマーと思ってたのに、そんなつまらんネタ振るな。
だいたいここは Lisp 総合スレなんだ、型有りの Lisper 連中からすりゃ
ハァ?って話題だろーが。全部の LISP 型無しという狭い見識をなんとか
してから出直してきてくれ。

273:デフォルトの名無しさん
04/03/02 00:37
dat 落ちした前スレを html 化してもらいました。

LISP Scheme Part9
URLリンク(ruku.qp.tc)

274:デフォルトの名無しさん
04/03/02 12:24
強い型付けのないSchemeのような言語には
良いところもあるよなぁ、ということを言いたかった
だけなんだがなぁ...


275:デフォルトの名無しさん
04/03/02 12:49
まぁ、あんまり気にすんなや。

276:デフォルトの名無しさん
04/03/02 19:09
健全なマクロ VS 不健全なマクロ

1 :デフォルトの名無しさん :04/03/02 19:14
(ちょっと入れ子でスレ立たせてくれや)
健全なマクロって不便だし、不健全なマクロの貸しコートもささくれ立っていてなんかイヤ。
だから、健全なマクロに「不健全」ていうオプション欲しいよな?
お前ら、どう思いますか。



277:デフォルトの名無しさん
04/03/02 19:14
健全なマクロ VS 不健全なマクロ

2 :デフォルトの名無しさん :04/03/02 19:15
2get

278:デフォルトの名無しさん
04/03/02 19:16
「不健全」というと健全なのより悪いイメージがあるからな〜。
個人的にはつまらないマクロと楽しいマクロだな。変数キャプチャ
があった方がいろんな意味で楽しい。はまるとデバッグも愉快な事
になるしな。アヒャヒャヒャヒャ。

279:デフォルトの名無しさん
04/03/02 19:20
define-unhygienic-syntax ;-)

280:デフォルトの名無しさん
04/03/02 19:56
defmacro/define-macroの方が簡単だし構造見えるし作りやすい。
gensym命。でもSRFIのhygienicマクロそのまま読めない罠。
まあhygienic作る暇あったら正規表現でも統一しなさいってこった。

281:デフォルトの名無しさん
04/03/02 20:28
>>278
define-boring-macro/define-amusing-macro とか?
まぁ変数キャプチャを防いだところで世間の見る目はかわらんよね。
R... な言語の作者だってマクロはダメポって言ってたけどこれは
変数キャプチャ云々の話じゃないわけだし。

282:デフォルトの名無しさん
04/03/02 22:08
>>281
世間の見る目って?どんな風に見られてるの?
m@zはどうしてマクロはダメポって言ってるの?

283:デフォルトの名無しさん
04/03/02 22:21
>>282
「神聖なる構文を一般利用者が触るなんてとんでもない。そんなの混乱の元だよ!」
ユーザビリティの問題だとかいってたあたりの事だと思われ。確認してないから
不正確かも知れんが探すのマンドクサ(括弧の話だったかも?)

284:デフォルトの名無しさん
04/03/02 22:26
あのひとはユーザビリティって言葉好きだよね

285:デフォルトの名無しさん
04/03/02 22:42
その割にRubyて妙な構文だらけだね
え、LISPには劣るって!?

286:デフォルトの名無しさん
04/03/02 23:02
あぁ!?神聖なる構文?

しゃらくせえ。

おれ様が欲しいのは圧倒的な自由なんだよ!
Schemeは聖域無き言語だぜ!

ユーザビリティーだと?

ヌルイ!ヌルイよそれ!
ちょーヌルイよ!

あーヌルイ。母さーん、火ぃつけてくれ。

ふぅー、ぬるぽ。

287:デフォルトの名無しさん
04/03/02 23:05
C言語みたいな、ちょっと小汚い言語の方が好かれるかもなあ

288:デフォルトの名無しさん
04/03/02 23:58
vimのVIlispってプラグインまともに動かせてる人いる?
設定のコツを教えてくれ。
\esで評価しようとするとvimが固まるんだけど…

289:デフォルトの名無しさん
04/03/03 20:35
  ( ・∀・)   | | ガッ
 と    )    | |
   Y /ノ    人
    / )    <  >__Λ∩
  _/し' //. V`Д´)/
 (_フ彡        /  ←>>286



290:デフォルトの名無しさん
04/03/04 14:28
Lispをよく知る前は、Lispは再帰が命と聞いた。

Common Lispを習ったら、再帰はC++と同じくらいしか使わないなと思った。

Schemeを習ったら、「やっぱりLispは再帰が命?」と思った。


291:デフォルトの名無しさん
04/03/04 14:39
CPS (continuation passing style)ってSchemerの人達が発明したコーディングスタイルなのかな?
末尾再帰の最適化が保証されていないと、いやがる人がいそうな書き方だよね。

実際は、メモリを結構積んでいるマシンが増えたから、再帰が多少深くなったって、困る場面ってそうそう
ないような気もするけど。


292:デフォルトの名無しさん
04/03/04 16:36
コンパイラ関連でよく出てくるよ>CPS


293:デフォルトの名無しさん
04/03/04 23:34
>>291
CPS ってもう少し汎用的な概念だと思う。
state パターンも原始的な CPS だと言えなくもない。

末尾再帰を使うのはたまたま scheme が末尾再帰を正当化してくれているから。


294:デフォルトの名無しさん
04/03/05 13:44
URLリンク(www.lispworks.com)
> System Class STANDARD-CLASS
> Class Precedence List: standard-class, class, standard-object, t
(subtypep 'standard-class 'standard-object)
=> NIL T ;; clisp
=> NIL T ;; cmucl
=> T T ;; ecl
=> T T ;; lispworks
なにこの処理系たち…

久しぶりにaclをインストールしたら、
./alisp
dlopen(/tmp/acl62_trial/libacli623t.so, mode) error: /tmp/acl62_trial/libacli623t.so: symbol errno, version GLIBC_2.0 not defined in file libc.so.6 with link time reference
と言って立ち上がらない…

295:デフォルトの名無しさん
04/03/05 15:28
CVS 鯖のトラブルで遅れれてるけど CMUCL 19a は↓だよ.がんがれ Martin !
(Martin は週末に時間があったらがんがるそうです)

CLOS based on Gerd's PCL 2003/06/18 09:23:09
* (subtypep 'standard-class 'standard-object)
T
T


296:294
04/03/05 15:47
clisp 2.28 (released 2002-03-03)
cmucl CLOS 18e (based on PCL September 16 92 PCL (f))
ecl 0.9c
lispworks Version 4.3.6
でした。

そういえば、cmuclはCLOSをだれか(Martinていう人?)が速くなるように書き直し
ているという話を聞きました。

clispとか報告したほうがいいのかな…。fixも一緒じゃないとなんとなく気が引ける
んだよね。一般的にconformance bugって重箱の隅をつつきだしたら結構あるし。


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

5384日前に更新/290 KB
担当:undef