トップページtech
981コメント353KB

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

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2009/02/18(水) 00:22:16
lispを触ってみたい入門者のQ&A
初心者のQ&A
本スレでは恥ずかしくて聞けない人のQ&A
本スレは高度すぎて割り込めない人のQ&A
linuxでなくてwindowsでやりたいんですが・・・Q&A
lispを使用してC#やJAVAの代替にするための方法(おまけ)

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

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

(list
(url http://pc8.2ch.net/test/read.cgi/tech/1101386936/l50 :part 1)
(url http://pc11.2ch.net/test/read.so/tech/1140012484/l50 :part 2)
(url http://pc11.2ch.net/test/read.so/tech/1181479267/l50 :part 3)
(url http://pc11.2ch.net/test/read.cgi/tech/1201402366/l50 :part 4)
(url http://pc11.2ch.net/test/read.cgi/tech/1215834213/l50 :part 5))

□テンプレート置き場□
ttp://wiki.fdiary.net/lisp/ (id:guest pass:cl)
0357デフォルトの名無しさん2009/06/26(金) 01:09:06
>>355
lispboxについてはよくわからないし、初心者に毛が生えたレベルだけど、
警告出たら、qなり、Ctrl-x oなりすればいいんじゃないの?
0358デフォルトの名無しさん2009/06/26(金) 06:16:54
消したいウィンドウのモードラインで右クリックしたら消える
0359デフォルトの名無しさん2009/06/26(金) 08:56:21
slime-compilation-finished 辺りを書き換えるか、
slime-compilation-finished-hook で警告を消せばいいんじゃないの?
slime はかなり読みやすいんだからこれくらい自分で探せよ
0360デフォルトの名無しさん2009/06/26(金) 20:09:01
破壊的リスト操作をする関数を非破壊的操作に変えたいんだがなにか良い方法はないかな?
関数でsetqはあまり良くないよね
0361デフォルトの名無しさん2009/06/26(金) 20:22:32
破壊的操作がされることを期待して書かれたコードがあったりしない?
大丈夫?
0362デフォルトの名無しさん2009/06/26(金) 20:44:06
(defun non-destructive-function (list)
  (destructive-function (copy-list list)))

3秒で書いたのでどうなっても知らない
0363デフォルトの名無しさん2009/06/27(土) 10:44:15
>>356
ありがとうございます。
ふだんxyzzyは使うんですが、emacsには慣れてなくて。

>>357-358
ありがとうございます。
それでうまくいきました。

>>359
サーセン、無理ッス。
0364デフォルトの名無しさん2009/06/27(土) 16:47:40
cond式で複数の値を返すってできる?
0365デフォルトの名無しさん2009/06/27(土) 17:26:20
>>364 values 使うだけちゃうの?

CL-USER> (cond (nil (values nil t))
(t (values t nil)))
T
NIL
CL-USER>
0366デフォルトの名無しさん2009/06/28(日) 02:27:58
再帰の利点って何ですか?
最適化でループになるのなら、初めからループで書けば良いと思うのですが
0367デフォルトの名無しさん2009/06/28(日) 02:36:56
それは、再帰が何か特別な物に見えている人(再帰を消化しきれていない人)の
発想じゃないかなぁ。
ある動作を素直に表現しようとした時に、それが再帰と呼ばれるものを使用している場合がある。
他のあらゆる技法、概念と同じだよ。
0368デフォルトの名無しさん2009/06/28(日) 03:07:08
>>366
再帰にすることで、構造が非常にはっきりする(場合がある)という利点はあるよ
ループのほうが速ければ、別に再帰にする必要なんかない
カルト宗教じゃないんだから
0369デフォルトの名無しさん2009/06/28(日) 03:17:10
再帰はイメージできるようになったんだけど、loopの構文ってどうやって覚えればいいの?
loop構文で出てくる単語を覚えられない。
読むのは、いじっていればなんとかわかるんだけどなあ。
0370デフォルトの名無しさん2009/06/28(日) 10:32:43
loopは、別に使えなくていいらしい。
構文の重箱の隅をつつくような使い方をすると、
ちゃんと動かなかったりするらしい。
…と初心者の聞きかじり。
0371デフォルトの名無しさん2009/06/28(日) 10:49:37
関数の引数に大域変数を渡すと、その大域変数に値を代入してくれる関数って作れる?
rplaca,rplacdを使わないで
0372デフォルトの名無しさん2009/06/28(日) 10:53:19
何を言っているのだお前は
0373デフォルトの名無しさん2009/06/28(日) 11:22:02
イミフ。そもそも大域変数って何か分かってんのか?
0374デフォルトの名無しさん2009/06/28(日) 11:23:03
>>372
(defun settest (x) (setq x 123))
で(settest y)としてもyに値を入れてくれないじゃん
どうすればいいの?
0375デフォルトの名無しさん2009/06/28(日) 11:24:23
つ マクロ
0376デフォルトの名無しさん2009/06/28(日) 11:33:36
>>374
関数に副作用持たすのはよくない傾向と共通認識があるからそもそも問題にならない
呼び出し側でsetfすればいい話
0377デフォルトの名無しさん2009/06/28(日) 11:43:12
(defun settest (x)
(setf (symbol-value x) 123))
(settest 'y)
0378デフォルトの名無しさん2009/06/28(日) 11:49:53
>>376
何を言っているのだお前は
0379デフォルトの名無しさん2009/06/28(日) 19:07:50
ttp://www.komaba.utmc.or.jp/~flatline/onlispjhtml/macros.html
まぁここでも見とけ
0380デフォルトの名無しさん2009/06/29(月) 18:06:35
マクロの質問なのですが.

(defvar *test*
'(("aaa" . "bbb")
("ccc" . "ddd")))

(defmacro build-toolbar (val)
`(progn
,@(loop for i in val collect
`(print ,(car i)))))

こういうマクロを書いて

(progn
(print "aaa")
(print "ccc"))

こうなることを期待したのですが.

(build-toolbar *test*)
とやると,The value *TEST* is not of type LIST.
と出てしまいます.
どうすればよいのでしょうか?.
ちなみに,,@(loop for i in *test* collect...とやるとうまくいきます.
0381デフォルトの名無しさん2009/06/29(月) 18:16:16
defvarで*test*が束縛されるのは実行時。
マクロが展開されるのはコンパイル時。
0382デフォルトの名無しさん2009/06/29(月) 18:18:31
>>381
それかーっ!
ありがとうございます
03833802009/06/29(月) 18:22:44
うーん,原因はわかったんだけど解決法がわからない...
そもそも定数値をマクロに渡すような手法は間違っているのだろうか...
0384デフォルトの名無しさん2009/06/29(月) 18:22:47
> ちなみに,,@(loop for i in *test* collect...とやるとうまくいきます.
てことは展開時に *test* はそのリストに束縛されてんだろう

(build-toolbar *test*)
のマクロ展開時に val が束縛されてるのは symbol *test* であって、その
値である '(("aaa" . "bbb") ...) ではないからじゃね?
0385デフォルトの名無しさん2009/06/29(月) 18:28:51
the value *TEST* だからそれだな。
0386デフォルトの名無しさん2009/06/29(月) 18:31:18
両方?
0387デフォルトの名無しさん2009/06/29(月) 20:23:11
>>380
(defmacro foo (val)
`(mapcan (lambda (x) (print (car x))) ,val))

(defmacro bar (val)
`(eval (cons 'progn (loop for i in ,val collect (list 'print (car i))))))
0388デフォルトの名無しさん2009/06/29(月) 23:25:17
>>380
(defvar *test* '(("aaa" . "bbb") ("ccc" . "ddd")))

(defun foo (val)
`(progn ,@(mapcar (lambda (x) `(print ,(car x))) val)))

(defmacro build-toolbar (val)
(let ((m (gensym)))
`(macrolet ((,m () (foo ,val)))
(,m))))
0389デフォルトの名無しさん2009/06/30(火) 01:35:37
なんでおまいらそんなにひねくれてるんだ
0390デフォルトの名無しさん2009/06/30(火) 07:48:27
>>380に書いてあることを素直にやればいいんだ。

> ちなみに,,@(loop for i in *test* collect...とやるとうまくいきます.

うまくいくマクロを定義するマクロを書く。
0391デフォルトの名無しさん2009/06/30(火) 08:35:02
>>381のような誤解もあるので書いておくことにする。
>>380の最後に書いてあるように、大域変数の値に実際にマクロの定義文内で
アクセスすることは可能。でもトップレベルスコープであるマクロの展開中は
大域変数にしかアクセスできないのでふつうは>>387-388のように書く。
0392デフォルトの名無しさん2009/06/30(火) 09:39:11
>>391のような誤解もあるので書いておくことにする。

http://www.lispworks.com/documentation/HyperSpec/Body/03_bc.htm
> Normally, the top level forms appearing in a file compiled with
> compile-file are evaluated only when the resulting compiled file is
> loaded, and not when the file is compiled.

コンパイル環境と実行環境が理解できていないんだろうな。
0393デフォルトの名無しさん2009/06/30(火) 16:58:27
あたしネカマだけど、マクロ展開とコンパイルを区別できない男の人って・・・
0394デフォルトの名無しさん2009/06/30(火) 17:18:39
>>380のdefvarとdefmacroがコンパイルしたい同じファイル内にあるならそうだけど、
そんなこと書いてないじゃん。質問がreplでは通るのにcompile-fileできません><なら
ともかく、>>381の回答は明らかに状況が判ってないだろ。
実際、compile-fileが評価される前に評価されたdefvarの値をマクロ定義内で参照してる
ファイルはコンパイルできる品
0395デフォルトの名無しさん2009/06/30(火) 17:22:42
clisp使ってるんですけどプログラムを走らせてる途中でメモリーが足りないというような
メッセージが出たんで一旦止めて

$ clisp -m 768KB program.fas

という具合に -m オプションをつけて走らせたんですけど、同じようにメモリーが足りないという
メッセージがでます。

ps でメモリーの使用量を調べたら30%も使ってませんでした。
これってclispのバグとかでしょうか?
0396デフォルトの名無しさん2009/06/30(火) 17:23:06
ネカマの振りして後から必死で言い訳か。まあ頑張れ。
0397デフォルトの名無しさん2009/06/30(火) 17:42:20
ついでに、たいていの処理系ではREPLで(defun ...)を評価しただけでコンパイルまで
されちゃうってことも知っておいてね☆
0398ネカマ2009/06/30(火) 17:48:06
あたし頑張る!!

トップレベルの式がコンパイルするときには評価されないとか 全 く 関係ないから
>ちなみに,,@(loop for i in *test* collect...とやるとうまくいきます.
と書いてあるんだから、すでに *test* は束縛されてることがあきらかなのに
トップレベルの式はコンパイル時に評価されないとかズレたこと言い出す >>392
は無能すぎ
質問に答える価値なし
たとえ defvar 式がトップレベルに書いてあるファイルをコンパイルしてても
元々束縛されてるものはちゃんと束縛されてますから
小学校からやりなおしてね

>>395
申し訳ないが、今は>>392で遊ぶのに必死で、あなたの質問に答える余裕がないことを
どうか許してもらいたい
0399デフォルトの名無しさん2009/06/30(火) 17:56:54
いつから幼稚園になったのこのスレ
0400デフォルトの名無しさん2009/06/30(火) 18:10:16
おれはむしろ一度たりとも小学校レベルにたどり着いたことがあるのか知りたい
0401デフォルトの名無しさん2009/06/30(火) 18:45:15
良く分からないんだけど、彼は何でこんなにヒートアップしてんの?
0402デフォルトの名無しさん2009/07/01(水) 01:35:25
WindowsXP上で、CLisp(2.47) + ActiveTcl(8.4) + ltk(0.91) を使い、
テキストボックスを表示させてキー入力すると固まってしまいます。
(ウィンドウが完全無反応になる)

要はltkを使いたい(CLでGUIアプリを作りたい)のですが、
1.上記組み合わせ(CLisp + ActiveTcl)で解決方法はありますか?
2.ない場合、上記現象がおきない処理系の組み合わせを教えてください
(AllegroCLとかLispWorksといった有償のパッケージは使わない方向で)
0403デフォルトの名無しさん2009/07/01(水) 03:26:13
LispWorks personal (無償)+ CAPIはだめなの?


関係ないかもしれんが、もしお商売の一環としてやるならフリーウェアを使うことでよけいに
手間がかかることの潜在的なコストというのも考えるべきだと思う。
0404デフォルトの名無しさん2009/07/01(水) 05:11:52
>>403
LispWorksは日本語のリテラルが入ったソースの扱いで困る
ACLは店頭で気軽に買えないので困る(通販でも買えないし)

>>402
文字コード関係の問題だと思った過去スレ4だかに同じような話が出てたよ
04054022009/07/01(水) 20:30:57
過去スレ3にあった文字コード関連の設定を行ってみましたがダメでした。
((defun wish-enable-japanese… や (setf sb-impl::…)といったもの)

CLispの代わりにSBCL(1.0.20)を使ってみると、固まらずに動きました。
Windows版のSBCLは不安定、といった感じの文章をみたことがあるので、
できれば避けたかったのですが。
0406デフォルトの名無しさん2009/07/02(木) 01:05:48
>>405
> ((defun wish-enable-japanese… や (setf sb-impl::…)といったもの)
CLISPつかってるのにsb-implを設定とな?
04074022009/07/03(金) 09:09:14
新規に別マシンにインストールしたところ、固まらずに動作しました。
狐につままれた感じです。OSの違いが関係あるのでしょうか???
(以前)Windows XP Home SP1
(今回)Windows XP Pro SP2

一応各モジュールのバージョンを書いておきます。
CLisp 2.47
ActiveTcl 8.4.15.0.280619
ltk 0.91
04084022009/07/03(金) 09:10:03
すいません、ageてしまいました
0409デフォルトの名無しさん2009/07/03(金) 14:52:52
>>406は無視か…
0410デフォルトの名無しさん2009/07/03(金) 15:03:00
多分難しくて理解できないんだろう
0411デフォルトの名無しさん2009/07/08(水) 08:11:01
LISPでネタプログラム作ろうぜ!まずは俺から。
CL-USER(1): ;; Setting (stream-external-format *terminal-io*) to :emacs-mule.
CL-USER(2): (defun ^o^ () '(^o^))
^O^
CL-USER(3): (^o^)
(^O^)
CL-USER(4):
0412デフォルトの名無しさん2009/07/14(火) 22:18:57
LispにJavaのURLクラスのようなものはありますか?

Webサイトを読み込みたいのですが
0413デフォルトの名無しさん2009/07/14(火) 22:44:58
Drakmaつかえ
0414デフォルトの名無しさん2009/07/14(火) 23:03:44
>>413
レスありがとうです。
やっぱりライブラリがあるんですね。
0415デフォルトの名無しさん2009/07/15(水) 08:20:33
format関数の値を返さないようにする方法ってある?
値を返さない組み込み関数があるといいんだけど。
0416デフォルトの名無しさん2009/07/15(水) 09:01:40
>>415
意味がわかりません
関数は必ず値を返します
elispでいうignore関数みたいなものが欲しいって事?
0417デフォルトの名無しさん2009/07/15(水) 09:59:18
(defun my-format (stream format &rest args)
(apply #'format stream format args)
(values))
0418デフォルトの名無しさん2009/07/15(水) 10:01:52
;; 書き忘れ: 値を返さないことが嬉しいってどういう場合なのか聞いてみたい
0419デフォルトの名無しさん2009/07/17(金) 05:29:14
>>418
こっそり変化かぁ。おもいっきり副作用じゃないの。
たぶん言語的なものじゃなくて、機械語に変換される際の高速化に影響する場合
といったものだと思うよ。それも処理系依存だから、特殊な条件がかさなるよ。
0420デフォルトの名無しさん2009/07/17(金) 12:20:20
formatって何が返るんだっけ
まあ関数型言語だし、何も考えずとも最適化されとるよ
0421デフォルトの名無しさん2009/07/17(金) 22:03:26
nilとか返すよ
(do ((n 1 (* n 2)))((print (format (< n 1000) "~A" n))))
0422デフォルトの名無しさん2009/08/01(土) 21:15:00
yaclmlを使ってcgiを作ろうと思うのですが
(require 'asdf)
(asdf:oos 'asdf:load-op :yaclml)
をしたときに
; loading system definition ...
などと出力されますよね?
この情報?の出力をやめさせたいときは、どうすればいいのでしょうか?
0423デフォルトの名無しさん2009/08/03(月) 10:05:30
ch-whoじゃだめなの?
0424デフォルトの名無しさん2009/08/04(火) 04:47:53
>>423
cl-whoでやりたいことはすべてできそうです。ありがとうございました。
0425デフォルトの名無しさん2009/08/05(水) 03:27:16
>>422
CommonLispでcgiって遅くない?
動作は速いんだけど、起動してロードする時間かかりすぎた気がする。
結局その時はHTTPサーバとかも全部Lispにしたんだけど、なんか速くなる方法あるんですか?
コンパイルしといても時間かかるでしょ?
ECLとかでスタンドアローンにするのかな?

gaucheとかだとCGI速いんだけど、やっぱCLのほうが使いやすいからなー。
実用的速度で使える方法があるなら知りたい。
0426デフォルトの名無しさん2009/08/05(水) 03:49:43
>>91
の言っている事って、C++では普通関数アダプタ(bind2stみたいなので)使って解決するもんだよ。

template<typename T, typename F>
void update(T& obj, F func)
{
func(&obj);
}

Foo foo;
Bar bar;

update(foo, mem_fun(&Foo::update));
update(bar, bind2nd(mem_fun(&Bar::update), true));

なんで、CLOSでも同じ事すれば万事解決じゃないかな?
C++はマルチパラダイムなんで、普通にCLOSと同じ事をしているってことだね。
0427デフォルトの名無しさん2009/08/05(水) 07:49:38
起動してロードする時間が少ないのはclispってどこかに書いてあった
0428デフォルトの名無しさん2009/08/05(水) 08:37:44
>>425
fastCGI 的なことをするしかないと思う。
mod_lisp はあんまりメンテされてないという噂も。
0429デフォルトの名無しさん2009/08/05(水) 08:52:38
普通はdumpするから起動したら既にロードし終わってるんじゃないの?
0430デフォルトの名無しさん2009/08/05(水) 09:21:26
>>429
その時間がかかるのには違いない罠。
0431デフォルトの名無しさん2009/08/05(水) 12:10:39
>>429
なんだかんだで大きなcore読まないとならんでしょ
短いcgiならfastcgi使うのがいい、システムが大きくなりそうならHunchentootとか
0432高崎佳子2009/08/11(火) 00:12:02
「実践 Common Lisp」を買いました。
また分からないことがありましたら質問にきます。
0433デフォルトの名無しさん2009/08/11(火) 01:04:00
買った報告なんていらねぇよ。
値段や表紙のデザイン程度でもなんか感想くらい書けよ。
0434デフォルトの名無しさん2009/08/11(火) 02:52:59
何を実践するのか判らないね
0435デフォルトの名無しさん2009/08/11(火) 19:04:24
>>434
http://pds.exblog.jp/pds/1/200509/27/48/d0063748_1623587.jpg
0436デフォルトの名無しさん2009/08/17(月) 19:56:21
FreeBSD 7.2-RELEASE-p2 で Allegro CL 8.1 Free Express Edition を使おうとしています。
http://www.franz.com/downloads/clp/downloadから指定されたファイルを落として
http://www.franz.com/support/documentation/8.1/doc/installation.htm#express-inst-linfbsd
に従って解凍し、
% ./newlicense
したのですが、
/libexec/ld-elf.so.1: Shared object "libpthread.so.2" not found, required by "newlicense"
と言われてしまいます。どうしたらインストールを完了できるでしょうか。
0437デフォルトの名無しさん2009/08/17(月) 20:19:51
>>436
pthread 入れろ
0438デフォルトの名無しさん2009/08/17(月) 21:29:50
>>436
/etc/libmap.conf を作って
libpthread.so.2 libthr.so
とか, 書き込むと幸せになれるかも知れない

だめだったら, あきらめろ
04394382009/08/17(月) 21:37:56
>>436
追加 ${PORT}/misc/compat6x をいれるってのもありかもしれない
それでもだめだったら本当にあきらめるしかないっぽいな
04404362009/08/17(月) 21:48:04
misc/compat*をインストールしたところうまくいきました
ありがとうございます
0441デフォルトの名無しさん2009/08/17(月) 23:35:36
> pthread 入れろ
libpthread.* は *BSD には無条件でインストールされるはずなのに
どんな意味で言ってるんだろうか?
0442デフォルトの名無しさん2009/08/19(水) 11:26:15
Common LispでSRFI-*の関数が使いたい時、一つ一つ移植してオレオレライブラリに追加してるんだけど、
これって非効率すぎるよね?皆さんどうしてるの?
0443デフォルトの名無しさん2009/08/19(水) 18:43:12
そんな時はない
0444デフォルトの名無しさん2009/08/19(水) 21:33:30
Windows環境でいちばんお勧めな処理系ってなんでしょ?
0445デフォルトの名無しさん2009/08/19(水) 21:55:09
手頃なとこでclispでいいんでないかい
0446デフォルトの名無しさん2009/08/19(水) 22:44:49
>>445
ありがとう。やはりclispが妥当ですか。
0447デフォルトの名無しさん2009/08/20(木) 04:24:24
Windows上でThread使える環境ってACLしかないのかな?
0448デフォルトの名無しさん2009/08/20(木) 06:54:54
どうしてそう思ったのかな?
0449デフォルトの名無しさん2009/08/20(木) 09:46:43
clispとsbclはどっちもサポートされてなくてションボリしてるだけなんだ

0450デフォルトの名無しさん2009/08/20(木) 10:09:27
>>442
commonlispの上でschemeを動かす
こんなのclerなら簡単だよね?
0451デフォルトの名無しさん2009/08/21(金) 00:07:17
>>448
clozuer clが該当したけどXP64bit版でMeadowからslime経由で64bitのCCLを実行すると落ちるんだよね
32bit版のCCLは起動自体拒否されちゃうし
ちなみにThreadさえ使わないならSBCLは凄く使いやすいのだけど、hunchentootで遊ぼうとかするとモウダメポ


ACL店売りしてくんろ >> Franz
0452デフォルトの名無しさん2009/08/21(金) 00:26:31
aclってクソ高かったような
0453デフォルトの名無しさん2009/08/21(金) 16:23:08
aclダウンロード販売汁
0454デフォルトの名無しさん2009/08/21(金) 17:52:20
+, -, incfみたいな既に定義されているオペレーターをオーバーライド
するのってどうやったらよいのでしょう.

vectorクラスを定義しておいて,+オペレーターの引数にvectorクラスが
渡されたら,自分が定義した処理を行うみたいな...

C++でいうoperatorみたなのをやりたいんですが...
教えてください
0455デフォルトの名無しさん2009/08/21(金) 18:42:21
>>454
汎関数ならオーバーライド的なことはできるけど、
+はただの関数だから無理では。
C++と違って+はオペレーターじゃないぞ。
0456デフォルトの名無しさん2009/08/21(金) 18:43:14
>>455
ちなみに汎関数(これって自分が定義する関数ってことですよね?)
どうするんでしょう??
■ このスレッドは過去ログ倉庫に格納されています