14/10/02 19:33:45.19 Qypu3DYD
common lispって柔軟だけどかゆい所に手が届かない所が多いね
大抵はalexandriaとかkmrclとかcl-ppcreとかsplit-sequenceとか使えばなんとかなるけど
ライブラリが散らばるのが気になる
alexandriaとかkmrclをベースに自分だけが使う一つの巨大なライブラリを作って足りない部分を追加していく方がいいのかな
32:デフォルトの名無しさん
14/10/06 01:52:15.38 6XAAReg7
名前空間みたいに、分けられる概念は分けるのが正義。Scheme はたぶん間違っている。
その意味では CL も副作用を分けなかったのは失敗だった。
33:デフォルトの名無しさん
14/10/06 02:40:17.27 wbFS47kT
目が腐った
34:デフォルトの名無しさん
14/10/07 00:42:24.02 1sqcCb/K
プログラム書いるとオレオレマクロとかオレオレ関数ができてくると思うんだけど、みんなこれどこに置いてるの
35:デフォルトの名無しさん
14/10/07 00:45:00.37 nz5dcB15
sbclでコンパイルに数秒かかってて
(incf v)
(incf v)
...
をn回繰り返す式を
を(incf v n)にしたらコンパイルが一瞬で終わるようになった
最適化すごい
36:デフォルトの名無しさん
14/10/07 00:46:27.10 nz5dcB15
最初は今書いてるプログラムソースと同じディレクトリに置いて間を見計らって
~/.sbcl/の中に置いて起動時にloadするようにしてる
37:デフォルトの名無しさん
14/10/07 02:44:00.62 OarL+A4W
>>34
1. オレオレだと思っていてもalexandriaの中を探すと大抵のものはある.それを使う.
2. なければ,オレオレライブラリでもasdfで読めるようにしておく.quickproject使えば手間もかからん.
初期化ファイルで読み込ませるのはbad practice.
38:デフォルトの名無しさん
14/10/07 15:39:11.06 QLizEra8
ローカルプロジェクトはasdの設定とか面倒そうでやってなかったけど
quickproject使えば自動で生成されるんだな
前より楽になったしもっと早めに調べておけばよかった
39:デフォルトの名無しさん
14/10/07 19:50:29.81 1sqcCb/K
>>37
やっぱそんな感じなんですかね
一つのore-xandriaにいろいろ詰め込んでquicklispのlocal-projectに置いてるだけだったので、整理しようかなと思ってたんですが
参考になりました
40:デフォルトの名無しさん
14/10/07 20:34:41.77 /bWACu+C
(defun fn1 (str)
(print str))
どなたか教えて下さい。
上の様な関数fn1を最適化、型宣言をして下の様な、
(defun fn2 (str)
(declare (optimize (speed 3)(debug 0)(safety 0)))
(declare (string str))
(the string (print str)))
関数fn2になりました。
マクロを使って下のfn3の様にしたいのですが
可能でしょうか。教えて下さい。
(defun fn3 (str)
(high-speed)
(var-string str)
(the-print str))
41:デフォルトの名無しさん
14/10/07 21:26:20.95 WZBCV0KR
declareをhigh-speedやvar-stringマクロで表すのは無理
コードウォークするか別のアプローチを取るしかない
42:デフォルトの名無しさん
14/10/07 21:27:43.76 WZBCV0KR
書き込んだ後で思い出したけどリードマクロならdeclareに展開しても大丈夫だった
43:デフォルトの名無しさん
14/10/07 23:54:28.45 1sqcCb/K
(defmacro defun-opt (name args &body body)
(let ((vars (mapcar #'cadr args)))
`(defun ,name ,vars
(declare (optimize (speed 3) (debug 0) (safety 0)))
(declare ,@args)
,@body)))
(defun-opt fn ((string str))
(the string (print str)))
こんなんじゃだめなの?かなりてきとーに書いたけど
44:デフォルトの名無しさん
14/10/08 03:05:44.37 TuLw9ECs
>>40
CommonLispだから最適化しなくちゃならないとかマクロ使わなくちゃならないというのはむしろ間違い。
書く手間を減らしたいということなら、変数に最適化設定を入れて#.するってことが多いかな。
quicklispで公開されてるライブラリ入手してdeclareでgrepして読んでみると良いよ。
(defvar *normal-optimize* (optimize (speed 1) (debug 3) (safety 3)))
(defvar *full-optimize* (optimize (speed 3) (debug 0) (safety 0)))
(defun fn2 (str)
(declare #.*full-optimize*)
(declare (string str))
(print str)
str)
45:デフォルトの名無しさん
14/10/08 16:33:49.70 sWEVGgQw
型宣言とか最適化宣言って最初からつけといた方がいい?
後からつけるのは面倒そうだけど最初からつけるのも面倒だし
46:デフォルトの名無しさん
14/10/08 17:24:24.76 fEubzyH3
>>45
コンパイラにチューニングの肝を教える為のシステムだろう?
とりあえず動くコード書いてって言うREPL大好きな人なら後からだし、設計から最適化を含む人なら最初から入れるだけじゃないの?
あんまり難しく考えるとはげちゃうぞ
47:デフォルトの名無しさん
14/10/08 17:37:35.42 WnZHVY78
最初から入れる方向で設計する方が
あとあと抜本的大改造しなくてすみそうな
48:デフォルトの名無しさん
14/10/08 17:43:22.35 sWEVGgQw
> あとあと抜本的大改造しなくてすみそうな
やっぱり最初から宣言書いといた方が楽かな
はげるのは困るし
49:デフォルトの名無しさん
14/10/08 17:52:50.07 WnZHVY78
っていうか
人に聞いて決めるようじゃだめじゃないか?
自分で判断、どう判断しようか、その方針で作っていくうちにその良し悪しを知るのも勉強
50:デフォルトの名無しさん
14/10/08 17:53:20.23 WnZHVY78
×どう判断しようか
○どう判断しようが
51:40です。
14/10/08 21:03:00.62 kqWBLcYL
40です。
みなさま、ありがとうございます。
特に41さま、42さま、43さま、44さま、
具体例を示していただいて、大変勉強になりました。
また45からの「最初か後か」の議論。
参考にいたします。
ちなみに私は、正解を探る技量が自身に無いと考えていて
ひと通り書いて速度が気になれば「後から」改変する
方法でやっています。
これだと、とりあえず必要な目先の事だけに集中できて
コードのスッキリ感が保てると思うので。