[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 2chのread.cgiへ]
Update time : 04/21 19:13 / Filesize : 249 KB / Number-of Response : 867
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

【入門】Common Lisp その3【質問よろず】



1 名前:デフォルトの名無しさん mailto:sage [2007/06/10(日) 21:41:07 ]
lispを触ってみたい入門者のQ&A
初心者のQ&A
本スレでは恥ずかしくて聞けない人のQ&A
本スレは高度すぎて割り込めない人のQ&A
linuxでなくてwindowsでやりたいんですが・・・Q&A
lispを使用してC#やJAVAの代替にするための方法(おまけ)

ま、ゆっくりたりましょう。

「いいものの本質は、いかなる時代においても変わらない」byパワーズ

(list
(url pc8.2ch.net/test/read.cgi/tech/1101386936/l50 :part 1)
(url pc11.2ch.net/test/read.so/tech/1140012484/l50 :part 2))


82 名前:デフォルトの名無しさん mailto:sage [2007/06/15(金) 07:58:37 ]
>>81
なるほど,よくわかりました

83 名前:デフォルトの名無しさん mailto:sage [2007/06/15(金) 17:08:07 ]
岩波の「Common Lisp 入門」って良いですか?

84 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 03:14:44 ]
良いかどうかはわかんないですけど学校の教科書にはなっとります

85 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 05:03:08 ]
Lisp関数の探し方というか絞り込み方がよくわかりません。
java,c++,等ならパッケージ、ライブラリなどから必要そうなクラスの名前がだいたい検討がつくのですが
関数一覧から探すのはちょいとしんどいです。
なにかカテゴリー分けされた辞書みたいなものは無いものでしょうか?



86 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 07:44:04 ]
>>85
HyperSpec はまさに辞書だけど駄目?
ttp://www.lisp.org/HyperSpec/FrontMatter/Chapter-Index.html
クックブックもあるよ。
ttp://cl-cookbook.sourceforge.net/

おれはようやくHyperSpecの引きかたに慣れてきたよ。やっぱ辞書は
手に馴染むと便利だね。

87 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 09:36:29 ]
ACL で、:zoom によるトレース結果ではなくて、
ソースのエラー発生箇所をそのまま出力させる事はできないですか?

88 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 09:43:11 ]
>>86 このクックブックはいいね〜。

89 名前:デフォルトの名無しさん [2007/06/16(土) 11:13:50 ]
任意の正実数 c,および,2 以上の任意の整数 m が仮引数として与えられたとき c の m 乗根
を計算する関数 root を,初期値を 1.0 かつ err を 0.1 としニュートン法を用いて定義したんですが、うまく作動しません。
>(root 5 5)とか入力します


(defun absolute (x)
(cond ((< x 0) (- 0 x))
((= x 0) 0)
((> x 0) x)))
(defun near (a b err)
(< (absolute (- a b)) err))
(defun betterpwr (x m c)
(+ (* (- 1 (/ 1.0 m)) x)
(/ (+ c 0.0)
(* m (mypwr x (- m 1))))))
(defun root-core (c m x err)
(if (near c (mypwr x m) err)
x
(root-core c m (betterpwr x m c) err)))
(defun root (c m)
(root-core c m 1.0 0.1))

間違っている点はありますか?

90 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 11:17:34 ]
なんかみにくいですねすいません。インデントがうまく反映されませんでした



91 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 11:26:06 ]
あ、解決しました
mypwr入れ忘れてた orz

92 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 11:50:30 ]
>>86
おお、ありがたい、これのローカル参照可能な版があればもっとありがたいです。

15MB,2300fileもあってwgetするのも気が引けるし。
なにより普段からIPリーチャブルじゃないので。






93 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 12:10:48 ]
>>84
どうも、では読んでみます。

94 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 12:44:06 ]
>>92
ttp://www.lispworks.com/downloads/documentation.html
Emacs+SLIMEという環境だけど、ポイント位置のシンボル拾って
hyperspecを引くコマンドもあって便利すぎます><

95 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 12:51:44 ]
>>92
ひょっとして手元にない人も多いのか? LispWorks や Allegro 入れると一緒に入って
ヘルプコマンドが引いてくれるんだよね。フリーの CL でも SLIME から引ける。
www.lispworks.com/documentation/common-lisp.html

lispuser.net で配布されてる clisp + slime のやつもローカルのを引くのが推奨みたいよ。
↓は附属の .emacs から抜粋。俺は Win じゃないんで試してないが、IE が起動するのかな?

(require 'hyperspec)
(setq common-lisp-hyperspec-root
(concat "file://" (expand-file-name "~/doc/HyperSpec/"))
common-lisp-hyperspec-symbol-table
(expand-file-name "~/doc/HyperSpec/Data/Map_Sym.txt"))

96 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 13:04:44 ]
>>83
岩波の Common Lisp 入門って ANSI 以前の CLtL の頃の本じゃなかったっけ?
一通り読んだら ANSI Common Lisp あたりに手を出すのが良いと思う。

97 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 01:02:16 ]
>>83
岩波 livejournal lisp でググって見て。
良い点と悪い点がかかれてるページに出くわすから。

98 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 12:50:59 ]
sbclを使っています。requireを使うと、標準出力にぞろぞろとメッセージが出ますが
あれを出さないようにはできないんでしょうか?sb-executableで実行形式にコンパイルすれば
でないのかなとか思ってやってみましたが、実行形式でも出ちゃいます。

99 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 15:00:18 ]
>>98
--noinform
を付けると出ないようになると思います
ttp://www.sbcl.org/manual/Command-Line-Options.html


100 名前:98 mailto:sage [2007/06/18(月) 21:59:33 ]
--noinformは付けてましたが、それでも出てしまいます・・・。




101 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 22:42:54 ]
ACL(フリーの奴)で、巨大なテキストファイル(数十MB)を調べているのですが、
遅くて困ってます。

with-open-file で開いて普通に read-line で読んでシェルのwlとかgrepみたいな
事をしているのですが、 perl の方が早いんです…コンパイルしてるのに…orz
何か良い方法ないですか?


102 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 23:11:48 ]
その遅いところだけ perl 使えばいいと思うが...。

103 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 23:12:29 ]
sbclに乗り換えるとかw
製品(の評価版)だとLispWorksが速かったような記憶がある(5年くらい前の話)

104 名前:101 mailto:sage [2007/06/18(月) 23:18:30 ]
>>102
perlより遅いって下手丸出しで何か悔しいんですが、、
perlはどんな技でテキスト処理を早くしてるんですかねぇ?
>>103
うーん。できればaclで済ませたいです。


105 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 23:18:51 ]
>>102
その思考に至るまでに、大抵の奴は宗教的言語熱に嵌るんだなあ。
塩だけで料理は出来ないのに、何でも塩焼きが一番みたいに考えるw

106 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 23:35:57 ]
俺は鯖の塩焼きより味噌煮の方が好きだな。

107 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 23:42:57 ]
Perl の正規表現エンジンは C でカリカリにチューニングされてると聞くけど、
Perl vs CL の対決なのではなくて、C vs CL の対決になってるんじゃないの。

108 名前:デフォルトの名無しさん mailto:sage [2007/06/19(火) 00:49:49 ]
無駄なIOとか、本質的でない部分で時間くってんじゃね?

109 名前:デフォルトの名無しさん mailto:sage [2007/06/19(火) 00:50:52 ]
とりあえず、どこがボトルネックが探るのが先決だねえ

110 名前:デフォルトの名無しさん mailto:sage [2007/06/19(火) 06:11:08 ]
正規表現エンジンと言えば、CL-PPCRE はどう?



111 名前:101 mailto:sage [2007/06/19(火) 07:23:13 ]
誤解を招きましたが正規表現の問題じゃなかったです。すみません。

調べかたがよく分かんないですが、perlの場合ディスクキャッシュが使えてて、
CLだと使えてないような気もしてきました。
プロファイルとっても大量に呼ばれる read-line そのものが時間食ってる感じです。


112 名前:デフォルトの名無しさん mailto:sage [2007/06/19(火) 07:36:42 ]
>>111
久しぶりに来たらなんか変な方向に進んでるな…。ディスクキャッシュは関係ないよ。

メモリ消費を比べればわかるが read-line は必ず「新しい文字列」を返すんだよ。
で、大量のテキストを読み込むと GC のコストがばかにならない。
read-sequence で一気に読んだり、同じバッファを使い回したりもできるが、
実は最新の ACL だとズバリその用途の read-line-into なんてのがある。
www.franz.com/support/tech_corner/read-line-variants-071406.lhtml

113 名前:デフォルトの名無しさん mailto:sage [2007/06/19(火) 10:00:14 ]
            _,,..r'''""~~`''ー-.、
            ,,.r,:-‐'''"""~~`ヽ、:;:;:\
           r"r          ゝ、:;:ヽ
   r‐-、   ,...,, |;;;;|       ,,.-‐-:、 ヾ;:;ゝ
   :i!  i!  |: : i! ヾ| r'"~~` :;: ::;",,-‐‐-  `r'^!
    !  i!.  |  ;| l|  ''"~~   、      i' |   グレアム見てる? イェーイ!
     i! ヽ |  | |    ,.:'"   、ヽ、   !,ノ
    ゝ  `-!  :| i!  .:;: '~~ー~~'" ゙ヾ : : ::|
   r'"~`ヾ、   i! i!   ,,-ェェI二エフフ : : :::ノ~|`T
  ,.ゝ、  r'""`ヽ、i! `:、   ー - '" :: : :/ ,/
  !、  `ヽ、ー、   ヽ‐''"`ヾ、.....,,,,_,,,,.-‐'",..-'"
   | \ i:" )     |   ~`'''ー---―''"~
   ヽ `'"     ノ

114 名前:101 mailto:sage [2007/06/19(火) 22:18:11 ]
>>112
read-sequence!ビンゴです。おかげで perl と同じくらいになりました。
実はread-sequenceには気づいていたのですがシーケンスは関係ないと
思い込んでいました。文字列もシーケンスでした‥‥
探したら役に立つ記事見つけました
ttp://www.emmett.ca/~sabetts/slurp.html
どうもありがとうございました。


115 名前:デフォルトの名無しさん mailto:sage [2007/06/20(水) 00:32:46 ]
>>114
君はいい子だからこれからも来るように

116 名前:デフォルトの名無しさん [2007/06/20(水) 01:12:52 ]
******恋のおまもり******

  これを見た人は,超超超超幸せもの☆☆

  @週間以内に好きな人に告白されるか、
■■■■■■■■■■■■■■■■■■
■■■■□□□■■■■□□□■■■■
■■■□□□□□■■□□□□□■■■
■■■□□□□□□□□□□□□■■■
■■■□□□□□□□□□□□□■■■
■■■□□□□□□□□□□□□■■■
■■■■□□□□□□□□□□■■■■
■■■■□□□□□□□□□□■■■■
■■■■■□□□□□□□□■■■■■
■■■■■■□□□□□□■■■■■■
■■■■■■■□□□□■■■■■■■
■■■■■■■■□□■■■■■■■■
■■■■■■■■■■■■■■■■■■

  好きな人とイイ事があるよ・・・・☆★

  コレを読んだら、1時間以内にどこかに貼る★★

数ゎあなたが好きな人への思いを込めて

117 名前:デフォルトの名無しさん mailto:sage [2007/06/20(水) 03:03:56 ]
>>116
好きな人がいない場合はどうすれば良いんでしょうか?
っーか、行動半径に妙齢の女性がいないんですけれども。

話は変わって質問です。
(defun reverse$ (lst)
(if (null lst) nil
(append (reverse$ (rest lst))
(list (first lst)))))

でリストの長さnがある程度長いとするとreverse$の計算時間がnの2乗に
比例すると本に書いてあって、
時間をT(n)として、
(rest lst)の長さは
n-1なので(reverse$ (rest lst))の計算時間はT(n-1),
(list (first lst))の時間は1,appendの時間はn-1となる。
T(0)=1とみなすと、
T(n)=T(0)+1+2+......+n=(n^2+n+2)/2,n=0,1,.....
と説明してあるのですが、いまいちピンと来ません。
どうしてこのreverse$の計算時間がリストの長さの2乗になるのでしょうか?

118 名前:デフォルトの名無しさん mailto:sage [2007/06/20(水) 03:24:42 ]
わかりやすい説明だと思うが、どこがピンと来ないのかね?

119 名前:デフォルトの名無しさん mailto:sage [2007/06/20(水) 08:25:12 ]
すいません、自分が数列の和の公式を理解してませんでした。
中学校に入ってやり直してきます。

120 名前:デフォルトの名無しさん mailto:sage [2007/06/20(水) 12:33:00 ]
中学からやり直しても得られるものは何もないぞ



121 名前:デフォルトの名無しさん mailto:sage [2007/06/20(水) 21:20:05 ]
>>120
自分の周りの過半数は女子だ。
それだけでもやり直す価値はあるぞ。

122 名前:デフォルトの名無しさん mailto:sage [2007/06/21(木) 23:45:04 ]
変な流れぶったぎってちょっとしたまとめ。

(let ((buf (make-string (file-length in))))
(read-sequence buf in)
...
デカい文字列をメモリ上に作って処理すれば、
acl の正規表現は perlに全然負けてないです。shiroさん疑って
ごめんなさい。regexp2(・∀・)イイ!!
きっとperlも一行ずつ処理しているように見せて、
裏でいろいろやってるんですね。perlなめてました。

でも、コマンドラインのwc -lより速い行数計算CLプログラムは、
作れませんでした。単純な処理だとやっぱりCには勝てないのでしょうか…。


123 名前:デフォルトの名無しさん mailto:sage [2007/06/22(金) 00:45:22 ]
勝つ必要があるの?どうせ不毛な議論になるからやめよう。

用途によって言語は使い分ける、以上。

124 名前:デフォルトの名無しさん mailto:sage [2007/06/22(金) 11:21:48 ]
Perl は昔から文字列の処理に強かったからなぁ。
CGI の言語として普及したのも文字列処理の強さのお陰。
HTML を処理するには簡単に文字列処理が出来なきゃならんし。

それにスクリプト言語の中でも Perl は割と処理速度に力入れてる方だし。

125 名前:デフォルトの名無しさん mailto:sage [2007/06/22(金) 11:42:38 ]
Perl より高速なスクリプト言語ってあるの?

126 名前:デフォルトの名無しさん mailto:sage [2007/06/22(金) 12:12:03 ]
あるよ

127 名前:デフォルトの名無しさん mailto:sage [2007/06/22(金) 14:05:42 ]
それはC#とゆうものです.............

128 名前:デフォルトの名無しさん [2007/06/26(火) 06:36:43 ]
reverseと同じ作用をする関数をreverseを使わずに作りたいのですが

(defun my-reverse (l)
(cond ((atom l) l)
(t (cons '()(list (my-reverse (cdr l)) (car l))))))

とやると

> (my-reverse '(a b (c d)))
(NIL (NIL (NIL NIL (C D)) B) A)

となってしまいます。
どうすればよいのでしょうか?
ちなみにLISPは本当に素人です…


129 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 08:55:00 ]
>>128
>>117

130 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 11:14:17 ]
>>129
盲点でした…
ありがとうございます



131 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 23:38:30 ]
occurと言う関数がtreeの中にitemが含まれる時Tを返すとすると、
(defun occur (item tree)
(if (atom tree)(eql item tree)
(if (occur item (first tree))t
(occur item (rest tree)))))
となるわけなんですが、
(eql item tree)が最終的にtを返すのであって
(occur item (first tree))でtが評価される事は無いですよねぇ。
ifが有るから便宜上tと有るだけですよねぇ?


132 名前:デフォルトの名無しさん mailto:sage [2007/06/29(金) 00:11:34 ]
まず落ちつけ。聞きたいことがよくわからん。
(eql item tree) が T を返すと (if (occur item (first tree)) T ...) の T が返るから
最終的に if の T が返ることもあるだろう。

133 名前:デフォルトの名無しさん mailto:sage [2007/06/29(金) 00:36:27 ]
ああ、分かった!
treeが分解されていって、
最終的に(eql item tree)でTが出て評価が終わり思ってたけれど、
再帰って数字だけじゃなくて、
深く降りて行ってTが返ってきてもTを返すんだ。
(語彙が少ないから適切に説明できない)

134 名前:デフォルトの名無しさん mailto:sage [2007/06/29(金) 00:40:59 ]
2番目のifを
(or (occur item (first tree)) (occur item (rest tree)))
にするとわかりやすいかな

135 名前:デフォルトの名無しさん [2007/06/29(金) 01:03:20 ]
例えば
>(setq a'(99 88 77 66 55))
となっていて
>(printlist a)
とすると
>( (1 99) (2 88) (3 77) (4 66) (5 55) )
と返すようにしたいんですが、うまくいきません。
どうすればいいでしょうか?
やっぱり再帰を使うんですよね?

136 名前:135 mailto:sage [2007/06/29(金) 01:14:13 ]
すいません、自分では
(defun printlist(s n)
(cond ((equal n 1) s)
(t (cons n (printlist (car s)(- n 1))))))

と作ってみたんですが、
> (printlist a 5)
とやってみると、エラーで99はリストではないと怒られてしまいます。

137 名前:デフォルトの名無しさん mailto:sage [2007/06/29(金) 01:19:53 ]
こんなもんかな
(defun printlist (s &optional (n 1))
 (if s (cons (list n (car s)) (printlist (cdr s) (1+ n)))))

138 名前:135 [2007/06/29(金) 02:13:03 ]
>>137
おお!
ありがとうございます!!

139 名前:デフォルトの名無しさん mailto:sage [2007/06/29(金) 03:33:07 ]
やっぱり再帰って Scheme のほうが向いてるんじゃないか。
反復を表現するためのドメイン特化言語 (DSL) LOOP を恐れずに使う。

CL-USER> (loop for e in '(99 88 77 66 55)
for i from 0
collect (list i e))
((1 99) (2 88) (3 77) (4 66) (5 55))


140 名前:デフォルトの名無しさん mailto:sage [2007/06/29(金) 06:07:05 ]
両方使えるのがCLの良い所。



141 名前:デフォルトの名無しさん mailto:sage [2007/06/29(金) 15:29:42 ]
doよりもloopの方を使うことが多い?

142 名前:デフォルトの名無しさん mailto:sage [2007/06/29(金) 16:26:34 ]
(defun color (fruit)
(case fruit
(apple 'red)
((banana lemon) 'yellow)
(peach 'pink)
(t "I don't know")))
と言う果物の名前を引数にとってその色を返す関数で、
(t "I don't know")の所でtが有るのはLispではNIL以外は何でも真だからですか?

143 名前:デフォルトの名無しさん mailto:sage [2007/06/29(金) 18:43:22 ]
>>141
個人的には loop は単純な無限ループ以外では使わない。知識がCLtL1で止まってるもんで。w

144 名前:142 mailto:sage [2007/06/30(土) 02:55:29 ]
すいません。
本当は
(defun color (fruit)
(case fruit
(apple 'red)
((banana lemon) 'yellow)
(peach 'pink)
(otherwise "I don't know")))
なんでしょうけれども、
最後の一行を
(t "I don't know")))にしてもOKだと説明してあって、
どうしてなのかな?と自分なりに考えた結論だったのですが、間違ってました?

145 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 05:14:03 ]
www.lisp.org/HyperSpec/Body/mac_casecm_ccasecm_ecase.html
ここを見る限りtとotherwiseを特別扱いしてるだけな気がする。

146 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 12:14:54 ]
>>141
do と loop は微妙に住み分けている。基本は do なんちゃら〜だけど、
以下の場合は loop を使う。とうか do より楽ができるパターンに使う。
A. collect を使いたいとき : DO だと push していって reverse だけど、このパターン用の DSL がこれ
B. ((x 1) (x 2)) みたいなパターンを for (id num) in ((x 1) (x 2) みたいな
C.

147 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 12:16:44 ]
あ、途中でおくっちゃった。 C. 以降は気分つーことで。

148 名前:142 mailto:sage [2007/06/30(土) 12:49:08 ]
>>145
特に意味はないのかなぁ。
本スレでも聞いてみますね。

149 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 23:53:48 ]
ファイル関係で解らないことがあります。
Lispworksではfile-directory-pをつかって渡したPATHがディレクトリかファイルか区別がつくようなのですが
sbclやclispではファイルとディレクトリの区別を付ける方法がわかりません。
HyperSpecを渡り歩いたのですがこのあたりの記述をさがせませんでした。

ファイルシステム関係は言語実装と別な領域の話で仕様は無いよと言うことになってしまうのでしょうか?


150 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 01:38:22 ]
まぁ、 Lisp は「ディレクトリ」って概念がないフィアルシステム上でも動いてきたからね…。
ファイルやディレクトリを扱うには Edi Weitz 氏の CL-FAD (File And Directory) が今は標準的。
元は Peter Seibel が Practical Common Lisp 書くときに用意したやつで、Edi 氏がパッケージにして公開してくれる。
で、件の処理はパッケージ内で以下のように定義されてる。pathname-name と pathname-type が無いものがディレクトリであると。
これで不自由はしてないよ。

(defun component-present-p (value)
"Helper function for DIRECTORY-PATHNAME-P which checks whether VALUE
is neither NIL nor the keyword :UNSPECIFIC."
(and value (not (eql value :unspecific))))

(defun directory-pathname-p (pathspec)
"Returns NIL if PATHSPEC \(a pathname designator) does not designate
a directory, PATHSPEC otherwise. It is irrelevant whether file or
directory designated by PATHSPEC does actually exist."
(and
(not (component-present-p (pathname-name pathspec)))
(not (component-present-p (pathname-type pathspec)))
pathspec))

ロード方法: SBCL なら cl-fad.tar.gz をダウンロードして展開後、
CL-USER> (load "cl-fad.asd")
CL-USER> (asdf:oos 'asdf:load-op :cl-fad)
CLISP なら ASDF も別途インストールしてくれ。



151 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 01:40:31 ]
フィアルシステムって何だよ。ファイルシステムです。ごめん。

152 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 06:14:20 ]
>>150
おはようございます、教わった関数とdirectory関数をつかってパスがディレクトリかどうか判定できるようになりました。
ありがとう。



153 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 07:34:09 ]
>>150
>>Lisp は「ディレクトリ」って概念がないファイルシステム

って、どんな感じなんでしょう?

全部、ひとつのディレクトリの中に収まっているようなイメージなんでしょうか?
ぜひ、教えてください。

154 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 15:50:59 ]
>>153
そう。一階層しかない。
Common Lispが制定された頃(20年以上前)はそういうOS(たとえばCP/M)が生き残っていたのじゃよ。

155 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 15:55:51 ]
だれか政治力のある人に CLtL3 を提案してほしい。GLSはもう興味無いのかな。

156 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 18:05:02 ]
>>155
何か案があるなら提案すりゃいいんじゃね。各ベンダとも独自の拡張を施してるわけだし。
で、なんで共通部分である ANSI CL の部分を変更したいんだ?
処理系の対応なんかでかなりのコストがかかるけど。

157 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 18:15:37 ]
>>156
そりゃ独自に似たような拡張やってるなら共通部分に入れたほうが良いでしょ。
コスト掛かるって意味がわからんけど、標準になればみんな対応するでしょ。

158 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 18:48:41 ]
よくわからん。何を標準化してほしいんだ?ただ改訂したい改訂したいといわれても…

159 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 18:50:48 ]
憲法論議みたいだな

160 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 18:53:58 ]
>>158
例えばちょっと上で出たディレクトリの話とか、多少時代遅れになってる部分はあると思う。
Unicodeの扱いなんかもベンダ独自でやってるけど、共通化すると便利ではないか?



161 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 19:05:35 ]
あーそりゃ便利だと思うけどね。その程度では規格制定のコストを払ってくれるところはないと思うよ…
Unicode 周りというか国際化対応にかんしてもまだ課題は多くて The Right Thing は見えないしね。
CLRFI clrfi.alu.org/ でどかんとブチ挙げるとか、ライブラリ書いて cliki あたりで公開してデファクト
目指すか、 CL-FAD みたいな事実上標準的なライブラリで我慢するか。

> コスト掛かるって意味がわからんけど、標準になればみんな対応するでしょ。
結構軽く考えてるな。まず R6RS の推移と主要処理系が対応するまでの過程を見てみると参考になると思う。


162 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 19:12:44 ]
>>161
まあ軽く考えてると言われればそうかもしれん。せめて R6RS みたいな話が Common Lisp にも
出てこないかな、という無責任な希望程度の話。議論するつもりは無いので、このくらいで。

163 名前:デフォルトの名無しさん [2007/07/01(日) 21:04:30 ]
karetta.jp/article/blog/ll-spirit/033840
これをCLで素朴にやってみたんですけど誰か添削してくれませんか。

(defvar *capacity* nil) ; int list
(defvar *goal-p* nil) ; int list -> bool

(defun room-of (n state) (- (nth n *capacity*) (nth n state)))
(defun lset (l n v) (cond ((= n 0) (cons (+ (first l) v) (rest l)))
                           (t (cons (first l) (lset (rest l) (- n 1) v)))))

; int list -> (int . int) -> int list
(defun move (state pair)
  (let* ((from (first pair))
        (to (rest pair))
        (m (min (room-of to state) (nth from state))))
    (lset (lset state from (- m)) to m)))

; int list -> (int . int) list
(defun all-moves (l)
  (remove-if #'(lambda (pair) (= (first pair) (rest pair)))
      (mapcan #'(lambda (x)
                (mapcar #'(lambda (y) (cons x y))
                        l))
              l)))
;続く

164 名前:デフォルトの名無しさん [2007/07/01(日) 21:05:18 ]
;続き
; int list -> int list list
(defun successors (state)
  (mapcar #'(lambda (x) (move state x)) (all-moves '(0 1 2))))

(defun solve-abura (a b c)
  (let* ((*capacity* (list a b c))
         (target-amount (/ a 2))
         (*goal-p* #'(lambda (state) (= (count target-amount state) 2)))
         (start (list a 0 0)))
    (abura (list start))))

(defun abura (goal-stack)
  (let ((state (first goal-stack)))
    (cond
      ((funcall *goal-p* state) (reverse goal-stack))
      ((member state (rest goal-stack) :test #'equal) nil)
      ((some #'(lambda (amt cap) (> amt cap)) state *capacity*) nil)
      (t (reduce
           #'(lambda (result new-goal-stack) (or result (abura new-goal-stack)))
           (mapcar #'(lambda (s) (cons s goal-stack)) (successors state))
           :initial-value nil)))))

;(trace abura)
(print (solve-abura 10 7 3))

165 名前:153 mailto:sage [2007/07/01(日) 22:32:38 ]
>>154
レス、どうもです。

ファイル操作に関連する苛立たしさ、
(cltl2の本、アンナに分厚いのに)
change directoryが無いとかは、
そういうことに起因してたんですか。

私が使っているlispのアプリの作者さんが、cd等の関数を、
処理系毎にaliasっぽく簡単な書き換えをしているのを見て、
なんでこんな基本的な関数も用意してくれないのかと思っていたのです。

「directoryの概念の無いファイルシステム」
とか言われちゃうと、仕方がないとも思えるけど、
ansi cl化する時、足してほしかったな。

166 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 23:16:49 ]
当時、UNIX ベースのシステムが主流になるとは保証できなかったからしょうがない。
大抵の言語ではファイルシステム関連の機能は規格というよりライブラリの領分だしね。

個人的には pathname は夢の残骸みたいな感があるね。構成要素は↓だけど、
pathname-device, pathname-directory, pathname-host, pathname-name, pathname-type, pathname-version
UNIX だと directory, name のみだよね(拡張子を type とみるかもしれない)。 Windows だと device, directory, name, type か。
当時の Lisp Machine はネットワークを備えていたから host なんてのがあるし、version なんてのも面白いよね。
バージョニングを備えていたファイルシステムが当時あったのかな?

167 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 23:29:14 ]
> バージョニングを備えていたファイルシステムが当時あったのかな?

VMS とかかな。

168 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 00:12:02 ]
TOPSにもあった気がする

169 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 21:53:37 ]
CommonLispでの外部ライブラリの使い方等について質問です。
htmlgenというライブラリをaptでインストールしましたが、このあと
どうやってそれを使えばいいのかが分かりません。

require? load?

ここらへんの知識が全くないのですが、
どこかに情報まとまっていたりしますか?

とりあえずaptでいっしょにインストールされたtest.clを読み込めるところまで
いきたいのですが・・・

170 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 23:07:16 ]
apt とか Debian いわれてもわからん。SBCL か?
(asdf:oos 'asdf:load-op :htmp-gen)
でコンパイル + ロード完了だ。だめなら、これの前に
(load "/path/to/somewhere/htmlgen.asd")
を実行しとくこと。



171 名前:デフォルトの名無しさん [2007/07/02(月) 23:15:39 ]
    ┌─10
 ┌─┼─20
 │  └─30
 │  ┌─40
─┼─┼─50
 │  └─60
 │  ┌─70
 └─┼─80
    └─90

を表す引数なしの関数tree定義して、

次に,car や cdr 等以外の何らかのコマンドや関数等を使って,tree から次のような要素を取り出すにはどうすればいいんですか?

> XXXXXX
10
> XXXXXX
20


172 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 00:41:36 ]
>>169
ubuntuかdebianだと思うが /usr/share/doc/cl-htmlgenとかにドキュメントが入る
んで (asdf:oos 'asdf:load-op :htmlgen)か(require :htmlgen)で使えるよ。
share/docにあんまり記述が無い奴(たまにある)だったら:htmlgenの部分は/usr/share/common-lisp/systemの中に入れたとおぼしきパッケージのasdファイルがあるから
他のパッケージでワケワカメになったら探すと良いよ。


全然関係ないけど、windowsとlinuxどっちもslime+emacs+sbclでかなり幸せになれました。
で、windowsでアプリ書くのにlispbuilder使ってますが結構しんどいです。(windowのレイアウトだけはポトペタにしたいです)
windowレイヤーだけ別にポトペタして、sbclで作ったロジックと結びつけたりするような手段って無いでしょうか?
あるいは製品版のlispworksとかだとできるのでしょうか?(aclは再配布コストを負担できないので除外してます)



173 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 00:51:19 ]
LispWorks の InterfaceBuilder か?一応ポトペタもどきだが、 CAPI ライブラリは宣言的なので手で書いたほうが楽だったりする。
GUI の速度がいらねーなら LTK でいいんじゃね。GTK 系でも Socket で通信する GUI があった気がする。
どんなアプリ作るの?

174 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 00:57:12 ]
>>171
宿題なら宿題とかけよ…。なんで宿題ですって正直に言えない奴が多いんだ。
宿題じゃない風を装いたいならもうちょっと日本語をなんとかしろよ…
まぁ、どうせ答え丸写しで小言なんか聞きやしないんだろうけどよぉ

(defun tree () '((10 20 30) (40 50 60) (70 80 90)))

> (caar (tree)) もしくは (first (first (tree))) もしくは (nth 0 (nth 0 (tree)))
10
> (cadar (tree)) もしくは (first (rest (first (tree)))) もしくは (nth 1 (nth 0 (tree)))
20


175 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 00:59:46 ]
>>174
おまえ、親切だなw

176 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 01:31:07 ]
>>173
任意のファイル開いて諸元の一部を表示して、入力欄の数値を使って解析して
結果を別の名前のファイルでしまうっていうタイプのよくある奴です。
入力欄に日本語のコメントつっこんだらLTKが毎回落ちるので orz

ATOK使ってるせいかもしれないけど。 


177 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 01:46:55 ]
>>176
lispuser.net のスクリーンショットでは LTK の日本語入力できていたようだけどなー。
文字コードの設定まちがってるとかない?日本語入れたいなら LispWorks も厳しいかもねぇ。
IME のインライン入力なんか対応してる気配ゼロです。





178 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 08:28:50 ]
>>177
おはようございます。
ご指摘の通りエンコードでした、cp1250だからラテンになってました。
lispuser.netとかの記事とltk.lisp本体を参考にして次のようなフック組んだらなんとかなりました。
(defun wish-enable-japanese ()
  (let* (( s (ltk:wish-stream ltk:*wish*))
   ( i (two-way-stream-input-stream s))
   ( o (two-way-stream-output-stream s))
   ( n (make-two-way-stream
    (sb-sys:make-fd-stream
    (sb-sys:fd-stream-fd i)
    :input t :external-format *CURRENTENCODE*)
    (sb-sys:make-fd-stream
    (sb-sys:fd-stream-fd o)
    :output t :external-format *CURRENTENCODE*))))
    (setf (ltk:wish-stream ltk:*wish*) n)))

(pushnew 'wish-enable-japanese ltk:*init-wish-hook*)

set-external-formatとか(setf (external-format is))とかで処理できるかと思ったのですがデキマセンでした。
ここで小一時間ほど時間を食ってしまいました(仕事に遅れるかと思ったです@通勤電車)
#slimeからだとutf-8でlispファイルダブルクリックだとsjisなのもなんとかしたいなぁ。


Lispworksですがpersonal版はちゃんとime制御されていましたのでそんなに心配はしてないのですが、いかんせん今の円ドルレートだと送料込みで16万超えるのでショボーンって感じです。
allegroは絶対安全なんですが、事業所内分のランタイムライセンス出せません(w




179 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 08:43:45 ]
うう、lispファイルダブルクリックだとエンコードが何になるのかわからないです > _ <
ltkの戻りはutf-8で食えばsbcl側で認識するんですが orz

コンパイル時のエンコードがどこかにあるのかな?



180 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 21:05:02 ]
(setf sb-impl::*default-external-format* :cp932)
ググリまくって該当する解見つけました、




181 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 17:02:03 ]
numberp とかの p は predicate の p ですか property の p ですか?
たぶんどっちもありかも知れませんが、
property の p だという記述を見つけて気になったもので。


182 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 17:05:39 ]
predicateに決まってるじゃん。number propertyじゃ意味わからん。






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<249KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef