【入門】Common Lisp その7【質問よろず】
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2010/04/04(日) 17:37:47初心者の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)
(url http://pc12.2ch.net/test/read.cgi/tech/1234884136/l50 :part 6))
□テンプレート置き場□
ttp://wiki.fdiary.net/lisp/ (id:guest pass:cl)
0153デフォルトの名無しさん
2010/06/16(水) 23:10:41動的型なのに
0154デフォルトの名無しさん
2010/06/16(水) 23:49:570155デフォルトの名無しさん
2010/06/17(木) 00:12:45>letは値に名前を付ける。setqはその名前に結び付けられた値を書き換える。
このあたり抽象的すぎて理解できていない。メモリ上のデータが両者でどう違
うか分かるまでは分かったような気にならない人間だからこういう説明は結構
辛い。説明が悪いといっているのではなくアセンブリ言語から入った人は多少
はこういう感覚を持っていると思う。
>>150
> 対話型の学習には向いていない
いえいえそんなことはありません。>>134以来皆さんのレスのおかげで随分
学習が進んでいます。あらためてお礼を申し上げます。この程度ならlisperが
違和感無く見られるソースを書けるようになっていると思います。
>>151
レスサンクス。
>まず、データを読み込むときに、16に足りない分はnil辺りで埋めておけば、
これだとlengthで位置がとれる(今やってみた)のでそちらの方が簡単かと。
>>152
これを書くときはwebを見てコピペしたみたいだ。自分の参考書2冊ともこん
な書き方をしてなかった。なぜアレなのかは想像もつかないがこれでなぜ動
いているのかの方がもっと不思議。
0156デフォルトの名無しさん
2010/06/17(木) 03:22:50letはxを1として、コードを実行する。setqはそこから見えるxの値を1に書き換える。
舞台裏まで知りたいなら、処理系のコードでも読んでください。
あと、どうも誤解させた気がするけど、>>151で言ってるnilでのパディングは、
(defun hex-dump (dat sep)
(unless (endp dat)
(let ((c (car dat))
(sep (if sep sep '("-" " " " " " "))))
(format t "~a~a"
(if c (car sep) " ")
(if c (format nil "~2,'0x" c) " "))
(hex-dump (cdr dat) (cdr sep)))))
こういう意味。これなら、不足バイト分後から空白で埋める必要ないから。
0157デフォルトの名無しさん
2010/06/17(木) 03:39:21どうぞ、disassemble関数(ANSI標準)で心ゆくまで納得してください。
0158デフォルトの名無しさん
2010/06/17(木) 07:32:27英語だけど平易だし斜め読みでいい。
ttp://www.cs.umd.edu/~nau/cmsc421/norvig-lisp-style.pdf
lisp にも、他の言語と全く同じく、良いスタイルがあるんだ。
0159デフォルトの名無しさん
2010/06/17(木) 15:56:09すげぇ。lisperってこんなん普通に書いちゃうわけですね... orz
sep に渡す引数って、使いきっちゃうと nil 渡したときのデフォルトが使われ始めるけど
これを最初に渡した sep で繰り替えしたいときはどうするのが一番スマートですか?
リーダーマクロ使って循環リストを引数に渡す、ってのは思いつきましたけど
lisperならフツウどうするんですか?
0160デフォルトの名無しさん
2010/06/17(木) 17:55:50letとsetqの違いを理解できないのは私がアホなだけで説明する人のせいではあり
ません。
もともとは再帰関数で制御変数みたいなのをを持って回るのがカッコ悪いのでは
ないかという疑問だったのです。listを持って回るのは再帰的構造をしているので
違和感はないのですが渡すのが一つで済むならそちらがいいのではないかと思
ったわけで好みの問題だと思います。
>>157
サンクス gclでやってみたけど違いはsetqではグローバル変数を作ってそれに値
を入れるということでいいのだろうか?そこしか違いが分からないがもしそうだとす
れば気持ち悪いソースを書いていたんだと思う。
0161デフォルトの名無しさん
2010/06/17(木) 18:08:110162デフォルトの名無しさん
2010/06/17(木) 18:08:550163デフォルトの名無しさん
2010/06/17(木) 18:43:17ってか
0164デフォルトの名無しさん
2010/06/17(木) 20:48:36そんなんだわ。愛してるよ。
0165デフォルトの名無しさん
2010/06/18(金) 01:34:40要はひとつのサイクルを持ち回すことができれば良いので、
(defun f (l n)
(loop repeat n
with cycle = l
for y = l then (if (cdr y) (cdr y) cycle)
do (format t "~a" (car y))))
こういうノリでloopを使って邪悪に書きました。(f '(+ - - -) 50)みたいに呼んでください。
再帰で書きたいなら、defunをletで囲んでレキシカル変数にサイクルを保存したり、
毎度サイクルを丸ごと渡したり、labelsで関数内関数を作ってそちらを再帰したり、
ネタっぽい方法しか思い付かなかったので、普通に循環リスト使うのが良いと思います。楽だし。
0166デフォルトの名無しさん
2010/06/18(金) 01:37:39(defun f (l n)
(loop repeat n
for y = l then (if (cdr y) (cdr y) l)
do (format t "~a" (car y))))
で。
0167デフォルトの名無しさん
2010/06/18(金) 02:21:03必要な状態を持って回るのは普通だと思う。不要な物まで持ってく必要はないけど。
再帰の定石を知りたいなら、Schemeのコードが参考になるんじゃないかと。
CLerは普通loopとかdoとか使うし。
setqは、ローカル変数の宣言次第でまた違うけど、件のコードだとまさにそう。
0168デフォルトの名無しさん
2010/06/18(金) 20:35:40サンクス 関数のなかでグローバル変数を作れてしまうのに逆に驚いてしまった。
皆さんのおかげで最初の一歩を踏み出す準備ができました。とくにソースを示して
くれた人、どれも示唆に富んでいました。ありがとうございました。
0169デフォルトの名無しさん
2010/06/20(日) 22:19:55そして何故 Lisper は printf じゃないのかを垣間見た気がする。format に比べたら printf はおもちゃだ。
Lisp っぽくはないから諸派あるらしいけど、printf系しか知らなかったから新鮮。
というわけで >>143 を練習で書き換えてみた。
(defun dump (addr l16)
(format t "~10,'0x : ~{~3@{~:[ ~;~:*~2,'0x~]~^ ~}~1@{~:[ ~;~:*~2,'0x~]~^-~}~} : ~{~c~}~%"
addr l16 (mapcar #'(lambda (c) (if c (if (<= 32 c 126) (code-char c) #\.) #\ )) l16)))
区切りを - と space で切り替えるのに、3回、1回でそれぞれ回してるのが気になるけどどうにかならない?
0170デフォルトの名無しさん
2010/06/20(日) 22:26:180171デフォルトの名無しさん
2010/06/20(日) 23:30:58CLも使うけど、元々SchemerだからCLのformatには付いて行けないw
0172デフォルトの名無しさん
2010/06/21(月) 20:16:160173デフォルトの名無しさん
2010/06/21(月) 22:52:13formatterマクロを通してどんな関数に変換されてるのか想像しながら書くと楽しいんじゃないか。
~Rとか~@Rみたいなのはどうかと思うけど、年に2回くらい感謝する時があるから困る
0174デフォルトの名無しさん
2010/06/21(月) 23:24:33shiroさんは変態という名の紳士なんだね…
0175デフォルトの名無しさん
2010/06/22(火) 15:44:14GIMPのScript-fuを勉強してるのですけど
while が出てくるんですよ
でも、勉強用にインストールした DrScheme 上で、
言語選択でR5RSにして
while を使おうとしても「そんなのねえよ」と言われてしまう
たぶん、GIMP上では while が独自に実装されてるんでしょうけど
R5RSでは while が無いということは…
while でループをするのは、
Lisp系の言語にとって「筋が悪い」ことなのでしょうか?
できるだけ再帰でループしたほうが「筋がいい」のでしょうか?
Lisp系の中で、while の扱い・立場がよくわかりません
0176デフォルトの名無しさん
2010/06/22(火) 20:56:32Lisp 的には、再帰的な処理は再帰で書き、繰り返し的な処理はループで書く
というのが筋がいいと思う。Lisp の利点は再帰を使う事ではなく、問題に
合わせて自然にプログラムを書ける事だよ。
ちなみに Scheme のスレは↓こっち。
Lisp Scheme Part30
http://pc12.2ch.net/test/read.cgi/tech/1270897776/
0177デフォルトの名無しさん
2010/06/22(火) 22:52:18変態の称号授与
0178デフォルトの名無しさん
2010/06/23(水) 00:28:21知らない人が見たら罵倒でも
CLerには称号なんだよな〜
なんでこんなとんがった言語扱いなんだろう、こんなにも平べったいのに
0179デフォルトの名無しさん
2010/06/23(水) 09:26:57最小限必要な機能の中にはないってことだと思う。
R5RS は言語コアで何でも解決しようっていうものじゃないから、
規格にあるか無いかは筋の良さとはあまり関係がない。
while くらいなら自前で書いても大した手間じゃないから、
それほどポータビリティが損なわれるわけでもない。
while で書くのが自然だと思うなら while で書けばいい。
0180デフォルトの名無しさん
2010/06/23(水) 12:08:410181デフォルトの名無しさん
2010/06/23(水) 15:18:53(最小の?) lisp からのブートストラップで CommonLisp を構築、っていう方向性の実装はありますか?
0182デフォルトの名無しさん
2010/06/23(水) 21:44:27shiro さんの format じゃないけど, 普通見るだろ, manual を?
# まぁ unix の man はすりへらなからなぁ
# ls のオプション全部覚えてる人っているのかな?
0183デフォルトの名無しさん
2010/06/23(水) 23:35:56SBCL とか Clozure とか。
最小の Lisp からブートストラップと言うより、既存の CL 処理系を使って
ブートストラップする感じだけど、ANSI で標準化されている言語だから
最小に拘る必要も無いのよね。C のコードは少ないから、まあ見てみなよ。
0184デフォルトの名無しさん
2010/06/24(木) 01:42:56ttp://trac.clozure.com/ccl/ticket/696
WindowsでClozure CL使ってる人、やっと来たぜー。
SLIME使ってると良く固まる不具合が解決した。
これで1.4からバージョンアップできる。
0185デフォルトの名無しさん
2010/06/24(木) 14:55:19CLtLを紙で見てないけど…
0186デフォルトの名無しさん
2010/06/24(木) 15:00:410187デフォルトの名無しさん
2010/06/24(木) 15:52:580188デフォルトの名無しさん
2010/06/24(木) 16:48:030189デフォルトの名無しさん
2010/06/24(木) 17:00:030190デフォルトの名無しさん
2010/06/24(木) 17:08:410191デフォルトの名無しさん
2010/06/24(木) 21:03:260192デフォルトの名無しさん
2010/06/24(木) 21:08:130193デフォルトの名無しさん
2010/06/24(木) 21:09:38あっただと?
まだ俺の部屋にあるぜ。
0194デフォルトの名無しさん
2010/06/25(金) 19:44:04(let ((prev `|.|))
(defun see (symb)
(let ((pair (assoc symb (gethash prev *words*))))
(if (null pair)
(push (cons symb 1) (gethash prev *words*))
(incf (cdr pair))))
(setf prev symb)))
参照: http://lib.store.yahoo.net/lib/paulgraham/acl2.lisp
の (prev `|.|) の ` はどういう意味があるんでしょうか?
0195デフォルトの名無しさん
2010/06/25(金) 21:03:01出現順単語表のルートでは?
0196デフォルトの名無しさん
2010/06/25(金) 21:24:250197デフォルトの名無しさん
2010/06/25(金) 22:01:10タイピングがはるかに楽だったという事に気付いてorzってなったと見た
0198デフォルトの名無しさん
2010/06/28(月) 12:27:470199デフォルトの名無しさん
2010/06/29(火) 07:08:060200デフォルトの名無しさん
2010/07/01(木) 00:13:20与えられた数と演算子から、リストを狭めるfilter関数を作れと言われています。
例えば(list 3 7 4 1 6)に対して、数字5と演算子>=が与えられれば、リストの中から
5以上の要素だけを抜き出した(list 7 6)を返す、というものです。ここで、
(define (reduce op base L)
(cond
[(empty? L) base]
[else (op (first L)
(reduce op base (rest L)))])) というreduce関数を使えと指示がありました。
reduce関数の挙動はLに(list 1 2 3)を入れれば(op 1 (op 2 (op 3 base)))となる感じです。
そこで私は局所関数fを用いて以下のように定義しました。
(define (filter rel_op L t)
(local ((define (f n L)
(cond
[(rel_op n t) (cons n L)]
[else L]))))
(reduce f empty L)) ……(☆)
これに対して (filter >= (list 3 7 4 1 6) 5) と実行すると、
filter関数の挙動は、(f 3 (f 7 (f 4 (f 1 (f 6 empty)))))となるので、あとは関数fに従って(list 7 6)が
返ってくる筈なのですが、(☆)の行で、関数に対して無駄な部分がある というメッセージと共に
エラーが出ます。何処が間違っているのか、ご教授頂けないでしょうか。
0201デフォルトの名無しさん
2010/07/01(木) 00:22:36ここはSchemeスレじゃNEEEEE!!
というか、Schemeだと関数内関数は、
(define (f x)
(define (aux x)
...)
...)
みたいに普通に入れ子でdefineで定義できるぞ。
というか、そのlocalはどこから出てきた。
0202デフォルトの名無しさん
2010/07/01(木) 00:25:57学校で局所関数を用いる時はlocalを使って上のように書く、と教わったもので…
0203デフォルトの名無しさん
2010/07/01(木) 00:29:04R5RS
ttp://people.csail.mit.edu/jaffer/r5rsj_7.html#SEC47
R6RS
ttp://practical-scheme.net/wiliki/wiliki.cgi?R6RS:%E7%BF%BB%E8%A8%B3:R6RS:11.2%20Definitions
R6RSの方はちょっと読み辛いので、<body>の定義に注意して良く読んで欲しい。
で、本来質問すべき妥当なスレは、
Lisp Scheme Part30
http://pc12.2ch.net/test/read.cgi/tech/1270897776/
0204デフォルトの名無しさん
2010/07/01(木) 00:31:17処理系(コンパイラあるいはインタプリタ)はどれ?
0205デフォルトの名無しさん
2010/07/01(木) 00:40:07DrSchemeです。
0206デフォルトの名無しさん
2010/07/01(木) 00:44:53それlocal文の外でf使ってるからだよ。
(reduce ...)の前の閉じ括弧ひとつ消して。
で、マニュアルをちゃんと読むんだ。
マニュアル
ttp://docs.racket-lang.org/reference/local.html
限りなくここの大学と思われる参考資料
ttp://www.db.is.kyushu-u.ac.jp/rinkou/scheme/kougi15/Slide02.html
0207デフォルトの名無しさん
2010/07/01(木) 00:53:28>local式内で定義された変数、関数などは、そのlocal式の中でのみ有効
本当ですね…括弧閉じの位置が違うせいで、fがlocal外に出ていました…。
解決することが出来ました。本当に有り難うございました。
ちなみにどうして大学バレたし
0208デフォルトの名無しさん
2010/07/01(木) 00:56:52次Schemeの質問ここでしたら、Common Lispに改宗な。
国内でScheme教えてて、DrScheme使ってて、独自拡張のlocal文教えてる所なんて、
超レアなんだから、ググったら一発。
0209デフォルトの名無しさん
2010/07/01(木) 12:43:250210デフォルトの名無しさん
2010/07/01(木) 19:49:29宿題丸投げじゃなくて悩んで書いた事がわかるときはLispスレって妙に親切だよね
あとやっぱりCommonLisp単独でのネタはなかなか来ないからってのもあるのかもね
0211デフォルトの名無しさん
2010/07/04(日) 12:18:590212デフォルトの名無しさん
2010/07/05(月) 11:24:31Lispの処理系ばっか増えてライブラリー作りを誰もしないからな
0213デフォルトの名無しさん
2010/07/17(土) 05:11:38http://groups.google.co.uk/group/qilang/browse_thread/thread/569ab9260e635041
去年あたり、(CLから)Clojureへの移植も議題にあがってたのね。
http://groups.google.co.uk/group/qilang/web/qi-core-and-ports
Shen http://www.lambdassociates.org/shen.htm
Qi II http://lispuser.net/commonlisp/qi.html
0214デフォルトの名無しさん
2010/07/20(火) 07:30:13サーバにsbcl等の処理系入れて、コンパイルしたfaslファイルをおいてcronからコマンドでって感じでしょうか?
0215デフォルトの名無しさん
2010/07/20(火) 09:35:59sb-ext:save-lisp-and-dieで実行バイナリ作れば良いよ。
0216デフォルトの名無しさん
2010/07/20(火) 21:56:19repl上でcron作れるからrepl抜ける必要がないみたい。
0217デフォルトの名無しさん
2010/07/21(水) 23:33:52>>214 じゃないんだが感謝。
cron のまがいのものを、必要に迫られて作ってる最中。
day of month で carry が出るときの day of week の処理が、とてもめんどっちい
0218デフォルトの名無しさん
2010/07/22(木) 11:50:35継続とdelayの出番
0219デフォルトの名無しさん
2010/07/22(木) 20:03:36cron は、時系列処理じゃないことに留意
# 簡単な例
m 月と n 月の x1, x2 日と毎週 y1曜日とy2曜日に処理する
m と n が連続してればいいけど, してなかった場合, 処理を実行すべき
y? 曜日ってどうやって決定する?
0220デフォルトの名無しさん
2010/07/25(日) 04:56:15サンクスです。規制されてて書き込めませんでした。
cl-cron なんてのもあるんですね。
0221デフォルトの名無しさん
2010/07/25(日) 11:20:04結構Lisp向きのデータ構造だと思うんだが。
0222デフォルトの名無しさん
2010/07/26(月) 08:52:26を、昨日は lambdassociates.org に接続できなかったけど今日はOKだた。
たまぁに接続できなくなるのはなんでだろ。
0223デフォルトの名無しさん
2010/07/27(火) 08:30:310224デフォルトの名無しさん
2010/07/27(火) 10:28:51これからweb検索するのがえらくめんどくさい事になりそうでやだなぁ
0225デフォルトの名無しさん
2010/07/27(火) 12:07:35それに映ってるLISPのロゴ入ったノートPCがほしい
0226デフォルトの名無しさん
2010/07/27(火) 12:45:55こりゃだめだわ 流行らない
0227デフォルトの名無しさん
2010/07/27(火) 16:02:220228デフォルトの名無しさん
2010/07/27(火) 16:05:400229デフォルトの名無しさん
2010/07/27(火) 16:23:570230デフォルトの名無しさん
2010/07/27(火) 16:41:400231デフォルトの名無しさん
2010/07/27(火) 17:00:020232デフォルトの名無しさん
2010/07/27(火) 17:42:230233デフォルトの名無しさん
2010/07/27(火) 18:48:46このスレにはそんな人が多いと信じていた。
0234デフォルトの名無しさん
2010/07/27(火) 19:40:47しかしSchemeスレよりこっちのほうが否定的でないのには驚いた
0235デフォルトの名無しさん
2010/07/27(火) 21:12:55nilじゃなきゃ大丈夫だからじゃね?
0236デフォルトの名無しさん
2010/07/27(火) 23:53:30split-sequenceもkmrcl:delimited-string-to-list もダメぽでした。
0237デフォルトの名無しさん
2010/07/28(水) 01:08:11何でも取り込むのがCL流。
0238デフォルトの名無しさん
2010/07/28(水) 07:48:02asdf::split
0239デフォルトの名無しさん
2010/07/28(水) 07:49:430240デフォルトの名無しさん
2010/07/28(水) 09:50:15cl-ppcreのsplitどう?
0241デフォルトの名無しさん
2010/07/28(水) 19:09:39阿澄 「coffee-p?」
片岡 「tea.」
0242デフォルトの名無しさん
2010/07/28(水) 22:37:040243デフォルトの名無しさん
2010/07/28(水) 23:27:43それだったら俺もほしいかも
0244デフォルトの名無しさん
2010/07/28(水) 23:49:07おぉ、サンクスです!できました!
参考までに教えていただきたいんですが、こういうのってどうやって調べてるんですか?
0245デフォルトの名無しさん
2010/07/29(木) 00:52:17次に、マッチングする関数を提供するなら、それを使った操作も一緒に提供するだろうと、
cl-ppcre見に行ったらビンゴだった。
普段は、逆引きCommonLispやThe Common Lisp Cookbookを見たり、
適当なキーワードでググったりしてる。
0246デフォルトの名無しさん
2010/07/29(木) 01:28:12; loading system definition from /root/.sbcl/systems/jp.asd into
; #<PACKAGE "ASDF0">
; registering #<SYSTEM :JP> as JP
; registering #<SYSTEM :JP-TEST> as JP-TEST
こういうヤツ。
0247デフォルトの名無しさん
2010/07/29(木) 08:06:180248デフォルトの名無しさん
2010/07/29(木) 22:44:00240じゃないけど、asdf-install や cl-build でありったけライブラリ入れておいて、
その状態のコアイメージ作成する。
で自分の欲しい機能や関数をM-x slime-aproposで検索して探すのがいいんじゃないかな。
0249デフォルトの名無しさん
2010/07/30(金) 05:47:45http://pc11.2ch.net/test/read.cgi/prog/1280205933/
0250デフォルトの名無しさん
2010/08/03(火) 12:17:17> Over the next period Carl will be going over the instruction set wrt
> its suitability for the JVM/CLR/DVM and the Android system
> and will be leading a lot of the development of Shen.
Qi IIの次は、共通VM上に移るのか?・・・
0251デフォルトの名無しさん
2010/08/04(水) 23:08:35CLに実装して、その先は、Clojure over JVM/CLR/DVM で動くようにするのか。
0252デフォルトの名無しさん
2010/08/05(木) 12:28:03復刊決定だって
すげーな
けど、なんで?Lisp
■ このスレッドは過去ログ倉庫に格納されています