1read 100read
2013年17プログラム71: 【入門】Common Lisp その10【質問よろず】 (299)
TOP カテ一覧 スレ一覧 2ch元 削除依頼 ▼
【分散型バージョン管理】 Mercurial 2【hg】 (244)
機械語なら俺に質問しろ!その2 (216)
【魔法】リリカル☆Lisp【言語】 (218)
ニートの俺が何か開発して食いつなぐスレ (979)
【SICP】計算機プログラムの構造と解釈 Part3 (553)
Access VBA 質問スレ Part1 (163)
【入門】Common Lisp その10【質問よろず】
1 :2013/02/20 〜 最終レス :2013/09/22 Lisp Schemeスレでは恥ずかしくて聞けないようなことを質問したり、 Lisp Schemeスレの話題は高度すぎて気後れする人が話しあったり。 それ以外でもCommon Lispについての話題なら歓迎します。 ま、ゆっくりやりましょう。 「いいものの本質は、いかなる時代においても変わらない」byパワーズ ■前スレ 【入門】Common Lisp その9【質問よろず】 http://toro.2ch.net/test/read.cgi/tech/1330888006/ ■Wiki http://wiki.fdiary.net/lisp/ (id:guest pass:cl) http://cl.cddddr.org/ http://tips.lisp-users.org/common-lisp/
2 : < `∀´>ニダー
3 : 初心者です
4 : 小心者です
5 : >>3 そうか
6 : 404 Blog Not Found:(笑) - 書評 - Land of Lisp http://blog.livedoor.jp/dankogai/archives/51854832.html
7 : NetwalkerにCL乗せたいなぁ ポケットサイズのlispマシン欲しい
8 : >>7 Netwalkerは普通のlinuxマシンじゃないの ? Vaio Pとかいろいろ買ったけど Macbook Airが一番無難で可搬性の高いUnix(lispの動くプラットフォーム) なんじゃないかと現状思う。 AndroidがLinuxだと思ってNECのLife Touch Note買ったけど shellなくてわろた
9 : 8はNetwalkerは普通のLinuxだからCommon Lispは簡単に インストールできるんじゃないの ?という意味で書きました。 わかりにくい書き方ですみません
10 : common lispの入門にon lispを読んでるんだけどしらない関数ばかりで入門には向いてない気がしてきた 他に系統的に学べるサイトはないかな
11 : 本ってどの言語にしてもそこそこ自力で何か書けるレベルで読まないとあんまり続かない気がする
12 : practical common lispをさっと読んでからCLtL2を読み始めるとよいと思う
13 : 英語読めないから本買わないと駄目なのか 結構値がはるしキツいな
14 : ちょっと前最初のほうだけ英語で読んでみたけど そこまで難しい英語じゃなかったので 読もうと思えば読めるレベル
15 : >>11 その点手続型言語は基本的な文法をちょろっとやれば そこそこ自力で書き始められて、壁にぶち当たったら本を読んで、 とできるけど、lispはそれが難しかった
16 : 他にもともと別の手続き型言語を知ってたとかではなくて?
17 : 最初はcar、cdrとか再帰だけで色々練習問題解いてたけど それだけでも色々できて面白かったけどなあ
18 : >>15 手続き型・・・小学校で習う表記に似てるからじゃね?
19 : おれはPAIPを勧めるがなぁ。 あと、lisp をできるようになりたいだけなら日本語版でもいい。でも、凄いエンジニアになりたいのなら、英語力は必須だよ。 逆に考えればlispと英語が同時に学べるチャンスだ。
20 : >>10 xyzzy Lisp Programming http://www.geocities.jp/m_hiroi/xyzzy_lisp.html
21 : >>20 やっぱりこれがいいのか 読んでみる、ありがとう
22 : 緑のナマモノ本、Amazonで発売日に在庫切れか でもまさか予約分しか入荷して無かったってオチじゃないよな
23 : そんなもんじゃない?発売当日に在庫ありになってないのは珍しくない 予約してた人は今日届くのかな
24 : 予約してたけど届くには月曜…
25 : 新宿の紀伊国屋とかに行けばあるかな。 しかし正直コードのある本は電子書籍で出してほしい。
26 : emacs + slime の環境なんですが C-c C-d h と同じことを他のライブラリでやれるようにするものってありませんかね?
27 : 木のそれぞれの値を2倍にする関数を教えてください。。。 (mapcar #'(lambda (x) (* 2 x)) '((1 2) 3)) 的な。
28 : 初心者の俺が練習がてら書いてみた 破壊的変更よく知らないので戻り値で返す (defun two-times-every-node(tree) (cond ((null tree) tree) ((atom tree) (* tree 2)) (t (cons (two-times-by-node (car tree)) (two-times-by-node (cdr tree)))))) (print (two-times-every-node '(1 (2 5 (10 30)) 3)))
29 : 再帰で呼び出す関数名が間違ったままだった・・・ (defun two-times-every-node(tree) (cond ((null tree) tree) ((atom tree) (* tree 2)) (t (cons (two-times-every-node (car tree)) (two-times-every-node (cdr tree)))))) (print (two-times-every-node '(1 (2 5 (10 30)) 3)))
30 : >>26 ドキュメント方面で共通の仕組みがdocstringくらいしかないから、 C-c C-d dくらいしかないと思う。CCLだとdocstring表示されんけど。 それ以上が欲しいならレッツ自作。 >>27 自分が知る限りない。レッツ自作。
31 : MaximaがLispで書かれていると聞いてちょっと感動した
32 : >>27 初心者の俺も練習がてら書いてみた。 (defun 2bai-2bai (node) (if (consp node) (mapcar #'2bai-2bai node) (* node 2))) (2bai-2bai '(1 (2 5 (10 30)) 3))
33 : >>27 (defun f (x) (if (listp x) (mapcar #'f x) (* 2 x))) (mapcar #'f '((1 2) 3))
34 : なるほどmapcarで再帰するなんて方法があるのか・・・
35 : > mapcarで再帰する 定石だと思うぞ
36 : mapcarとかreduceとか既存のものを利用していかに楽するかを考えるんだ。 働きたくないでござる。早くニートになりたい。
37 : 他人のソースを殆ど見ないので全然定石を知らないなあ
38 : >>29 ,30,32,33 ありがとうございます! mapcarで再帰は自分も知らなかったので眼から鱗です。
39 : よくある木の再帰だと思うけど
40 : マクロとかXMLとかの処理を書くときに嫌ってほど出て来るな。
41 : sbclのwindows fork版ライセンスについて質問します https://github.com/akovalenko/sbcl-win32-threads/wiki ここで入手できるバイナリと自作のlispソースを一緒に配布するとき、 どのようなライセンスにしなければならないのでしょうか sbcl自体は public domain + BSD-style licenses のようですが…
42 : Land of Lisp原著持ってたから立ち読みで済ませるつもりだったのだけど リストリテラルを書きかえるのはよくないって注に書いてあって ドキっとしたのでついレジに持っていってしまった あと訳した人が元ヤンキーである可能性が微レ存
43 : はぁ?Shiroさんだぞ?
44 : >>41 昔書いたやつどぞー。責任は持てんので、あくまでも参考程度に。 http://cl.cddddr.org/index.cgi?%E8%89%AF%E3%81%8F%E3%81%82%E3%82%8B%E8%B3%AA%E5%95%8F#H-1z3jsjcugixm7 ちなみに、他のライブラリを使ってそれを同梱する場合、 そっちのライセンスにも注意。特にGPL。
45 : >>44 ありがとうございます。わかりました。
46 : slimeのC-M-,に割り当てられているslime-previous-locationとはどういう関数なのでしょうか? 説明には "Go to the previous location, depending on context. When displaying XREF information, this goes to the previous reference." と在るのですがprevious locationというのが何を指しているのか分かりません。 どなたかお教えくださいm( _ _ )m
47 : (setq parameter '(`(,a ,b) `(,c ,d) `(,e ,f))) というリストがあったとして `(let (,@parameter)) ; とすると ;; (let (`(,A ,B) `(,C ,D) `(,E ,F))) になりますが(分かる) `(let hoge `(let (,,@parameter))) ; とすると ;; (LET HOGE ;; `(LET ((,A ,B) (,C ,D) (,E ,F)) ;; )) ;という風に前者と違って`が消えたものが挿入されるのは何故なのでしょうか?
48 : 無駄がない形に最適化してくれてるんじゃないの。知らんけど。
49 : >>47 仕様はコレ。 http://www.lispworks.com/documentation/HyperSpec/Body/02_df.htm 処理系は好きに最適化してよいそうです。
50 : >>48 ,49 ありがとうございます。`(`(,A ,B))が`((,A ,B))と等価なのですね。 しかし``(,,A ,,B)と`(,A ,B)は等価ではないのですね。 以下のマクロを読み解こうとしてドツボにはまっていました。難しい! (defmacro once-only ((&rest names) &body body) (let ((gensyms (loop for n in names collect (gensym)))) `(let (,@(loop for g in gensyms collect `(,g (gensym)))) `(let (,,@(loop for g in gensyms for n in names collect ``(,,g ,,n))) ,(let (,@(loop for n in names for g in gensyms collect `(,n ,g))) ,@body)))))
51 : `(`(,a))は`((,a))と等価じゃなくね? (let ((a "hoge")) (list 'ほら `((,a)) `(`(,a)))) ;=> (ほら (("hoge")) (`(,A))) ``(,,@parameter)が `(`(,A ,B) `(,C ,D) `(,E ,F))にならずに `((,A ,B) (,C ,D) (,E ,F))になるのってどうなんだろう。 そのコードは後者の挙動を前提にしているような。
52 : わけがわからないよ
53 : CCL 1.9出たで。 公式 http://ccl.clozure.com/ リリースノート訳 http://qiita.com/items/968166dde6a820ebb97e
54 : java等のようにクラスの中にメソッドを定義する オブジェクト指向ができるlispのライブラリってあるんですかね? defclass class-name ({superclass-name}*) ({slot-specifier}*) ({method-specifier}*) みたいに定義して(method object)で呼び出せるようなの pclには(send object 'foo)になるのが嫌だから今の形になったとあるけど (foo object)で呼び出せるようにするのって不可能だったんですかね? sendが嫌だというなら(slot-value object 'foo)だってsendと似たようなもんだと思うんですけど..
55 : >defclass class-name ({superclass-name}*) ({slot-specifier}*) ({method-specifier}*) ここまで決まってたら10分ぐらいでマクロ作れそうだな。 sendが残ったままだったら、slot-valueを使う時に(send object 'slot-value 'foo)としなければいけない。 sendはメソッド呼び出しで、slot-valueはあくまでアクセスするためのメソッド。 pclにはsendが残ったままだったら、 (mapcar #'foo '(obj-a obj-b obj-c))としたい時に (mapcar #'(lambda (x) (send x 'foo)) '(obj-a obj-b obj-c))としなければいけず、 これではLISPの力を発揮しきれないという様な事が書いてあった気がする。
56 : Javaのようにクラスの中でメソッドを定義するマクロを作りました (defmacro my-defclass (class-name superclasses slots methods) `(progn (defclass ,class-name ,superclasses ,slots) ,@(mapcar #'(lambda (method-spec) (destructuring-bind (method-name args &rest body) method-spec `(defmethod ,method-name ((this ,class-name) ,@args) ,@body))) methods))) (my-defclass person () ((name :initarg :name) (age :initarg :age :accessor age)) ((greet (your-name) (format nil "Hello, ~a! my name is ~a." your-name (slot-value this 'name))) (birthday () (incf (slot-value this 'age))))) (setf taro (make-instance 'person :name "Yamada Tarou" :age 20)) (slot-value taro 'name) ;=>"Yamada Tarou" (greet taro "hoge") ;=> "Hello, hoge! my name is Yamada Tarou." (slot-value taro 'age) ;=> 20 (age taro) ;=> 20 ↑と同じ (:accessor ageとしたから使える) (progn (birthday taro) (birthday taro) (age taro)) ;=> 22
57 : 先輩方すげっwww 簡単にできちゃうのか。。 なんでこういう方向でいかないんですかね? 今のoop慣れした世代にはこっちの方が親近感あるから とっつきやすいと思うんだけど
58 : マクロは大勢で共同作業するときには C++ のテンプレート並みに諸刃の刃ぁぁぁ なんです
59 : 諸刃の剣っていいたかったのか?
60 : テンプレよりもオペレータオーバロードによくたとえられる気がするけど
61 : 何の蓄積もないところからってことになると統制がとれないだろうけど、 デファクトスタンダードになりうるクラス指向ライブラリがあれば、それなりに使う人もいるんじゃね?
62 : フィボナッチ数列を行列のべき乗で求めるやつ書いてみたら なかなかあほっぽくなっとるからかっちょよく書いとくれ doはなんか物騒だったので使えんかった xyzzyで動かしちょる (defun fibv (n) (let ((a 1)(b 1) (c 1) (d 0) (a2 1) (b2 1) (c2 1) (d2 0) (t1 0)(t2 0)(t3 0)(t4 0)) (while (> n 0) (setq t1 (+ (* a2 a) (* b2 c))) (setq t2 (+ (* a2 b) (* b2 d))) (setq t3 (+ (* c2 a) (* d2 c))) (setq t4 (+ (* c2 b) (* d2 d))) (setq a2 t1) (setq b2 t2) (setq c2 t3) (setq d2 t4) (setq n (- n 1))) d2)) 参考 http://itpro.nikkeibp.co.jp/article/COLUMN/20061010/250176/
63 : >>62 再帰を使わずに書きたいのね、多分 こんな感じだろうか。 (defun fib (n) (loop with (a b c d) = '(1 1 1 0) for (a2 b2 c2 d2) = '(1 1 1 0) then (list (+ (* a2 a) (* b2 c)) (+ (* a2 b) (* b2 d)) (+ (* c2 a) (* d2 c)) (+ (* c2 b) (* d2 d))) repeat n finally (return d2)))
64 : CLはマルチパラダイム言語というが、 いったんCLOSの機能を使い出すと副作用でまくりで 関数プログラミングとの共存など不可能のように思える。
65 : 純粋関数型パラダイムはちょっと特殊だからなぁ
66 : >>65 式と文が別物ってところに山ほど違和感がある >いわゆる普通の言語 # 高級アセンブラの C は除く
67 : その C だって、GCC なら ({ ... }) で囲めばなんでも式になるぞw そもそも、代入が式だし。
68 : > GCC なら ({ ... }) で囲めばなんでも式 いや、それは極論だし
69 : H
70 : land of lisp まだ来ねー
71 : 昔のDOSの表計算アプリみたいな画面を REPLで実現してくれるライブラリってない?
72 : >>71 *curses.so あたりを ffi すればいいのではあるまいか?
73 : cl-ncursesっていうのを見つけた ありがとう
74 : CLOSで名前の衝突に気を使うのがかったるい たとえば、パッケージA,Bを別々に定義して、その中でそれぞれクラスA, Bを定義、 そのクラスをパッケージαで使う、とか考えた時に、 ;; まずAを定義して (defpackage :A (:use :cl) (:export :attr-of)) (in-package :A) (defclass A () ((attr :reader attr-of))) ;; 次にBを定義 (defpackage :B (:use :cl) (:export :attr-of)) (in-package :B) (defclass B () ((attr :reader attr-of))) ;; αで2つを一緒に使おうとすると、名前が衝突して落ちる (defpackage :child-alpha (:use :cl :A :B)) A-attr, B-attr, とかいうアクセサはオブジェクト指向的じゃないから嫌だけど、 attr-ofにすると、先にアクセサ用パッケージでシンボルを用意するのもダルい。 いっそパッケージを、アクセサ、クラス、総称関数の3つだけにしたらいいのかね。 お前らはどうやってんの?
75 : read-lineで入力を求める際に 初期値として任意の値をセットしておくことはできませんか?
76 : >>75 どこかのユーティリティライブラリにありそうですけど、 自分の使ってるものには見当たらなかったので書いてみました。 こういう感じので良いですか? http://paste.lisp.org/+2WZC
77 : >>74 自分ならだるさを許容するかパッケージプリフィックスで手を打つと思う。
78 : >>76 ありがとうございます。 やりたいことは初期値をセットしておいてその一部を書き換えてread-lineさせる という動作なので、"default value"が表示されてる状態にしたいのです。
79 : これに対するマクロor関数を作っていただけますか? 以下のnthを1まとめにしようとしています 2時間粘っても上手く行きません・・・ (nth 6 (nth 3 (nth 4 (nth 8 (xmls:parse (drakma:http-request *sample-xml*)))))) (nth 3 (nth 2 (nth 4 (nth 8 (xmls:parse (drakma:http-request *sample-xml*))))))
80 : (defmacro nnnnnnth (obj &rest indices) (reduce (lambda (a i) `(nth ,i ,a)) indices :initial-value obj)) (macroexpand '(nnnnnnth hoge 1 2 3 4)) ; => (NTH 4 (NTH 3 (NTH 2 (NTH 1 HOGE)))) 希望と合ってる?
81 : なぜこんなことをしているのかというと、XMLからデータを取ってこようとしているからです 厚かましいお願いですが、XMLで属性からデータを取得できるやり方も教えていただけないでしょうか
82 : >>80 完璧です!ありがとうございます 畏れ入りました 自分のレベルがあまりに低いからかもしれませんが なぜこんな短時間でマクロを考えつけるのでしょうか? やっぱり経験ですか?
83 : >>78 自分はあまりその辺りに詳しくないのですが、おそらく端末制御の領分になると思います。 難易度がかなり上がりますが、それでもその方式にこだわりがあるのなら、 >>72-73 で挙がっている情報を調べてみると手がかりが掴めるかもしれません。
84 : >>79 XMLのツリーを操作するときにリストとして直に扱うのはあまりお勧めしません。 (nth 6 ...)や(caddddr ...)のようなコードでは何をやっているのかさっぱり分かりません。 XMLSなら (let ((xmls (xmls:parse "<element attribute=\"value\">text</element>"))) (xmls:xmlrep-attrib-value "attribute" *xmls*)) のようにすれば要素の値を取得できます。既存のアクセサを使ったり、 自分でアクセサを作って利用することを強くお勧めします。 また、XMLSはリストの使用を全面に押し出したプロダクトなので、初心者には向きません。 エラーハンドリングも簡略化されているため、コードを追えないと原因も探れません。 慣れないうちはClosure XMLでDOMやSTP、XPathを使った方が良いと思います。
85 : 何も考えず(ql:quickload "xpath")したら ttp://common-lisp.net/project/plexippus-xpath/examples.html これ入ったのでこれ使うといいと思う。依存関係でClosure XMLも入るし
86 : >>84 >>85 なるほど。勉強になります。 それらを踏まえ、もう一度作りなおしてみます。 ご教授ありがとうございました!
87 : 逆引きCommonLispに結構例が載ってるんで、参考にどうぞ。 こういう例が欲しいとか、そういうのがあったら教えて下さい。 http://tips.lisp-users.org/common-lisp/index.cgi?XML%E3%83%8F%E3%83%B3%E3%83%89%E3%83%AA%E3%83%B3%E3%82%B0
88 : >>87 ありがとうございます。早速ブックマークに登録しました。
89 : >>78 ,83 ncurses に libform ってのがくっついてて, こいつの set_field_buffer() とかをffiして使えば何とかなるのかな? 後は自前で作りこむくらいしか思いつかない
90 : >>83 ,89 ヒントありがとうございます! その辺をslimeのcontribあたりと合わせて見てみます。
91 : 一定の出力を最後にまとめて文字列として返したいのですが、どういう風にすればいいのでしょうか 今は↓のように文字列をconcatenateで連結させていますが、formatのnilの部分をストリームに変えて出来ないものかと思っています (concatenate 'string (format nil "テスト") (format nil "bar") )
92 : (defun mkstr (&rest args) (with-output-to-string (s) (dolist (a args) (princ a s)))) こういうこと?
93 : それです!ありがとうございました
94 : thunkってどういうときに使うんですか?
95 : 感謝したとき
96 : thanks!
97 : >>94 めちゃくちゃ大雑把に言えば 「今評価しないで後で評価されるかも知れない式」 全般のことじゃね?
98 : CLOSあんま好きじゃない派の人って やっぱ構造体使うんですか?それともリスト?
99 : 両方使ってる気がします。
100read 1read 1read 100read TOP カテ一覧 スレ一覧 2ch元 削除依頼 ▲
Java⇔RDBのMapping-Frameworkを語るスレ Vol.5 (959)
今まで見た中で一番すげーコメント (584)
Rubyについて Part48 (890)
七行プログラミング part6 (383)
Git 6 (556)
Java系スクリプト言語Groovy (880)
--log9.info------------------
■□■ ハンブルク・バレエ団 ■□■ (674)
イナバウアーつまらない@ダンス板 (113)
京都のバレエ教室 (378)
沖縄アクターズ (527)
奥野凛 (324)
スーパーバレエレッスン@NHK教育 Part3 (346)
〜Danil.。.* ☆ダニール・シムキン☆*.。. Simkin〜 (707)
♪ヤスミンのDance♪ (611)
群馬のバレエ教室 (475)
サルサを語るスレ☆神戸編☆ (610)
帯広のバレエ教室に関係するスレ (709)
Shall We Dance? (103)
池袋ミュージカル学院&ダンスセンター【2】 (849)
写真 (108)
日本の劇場 Part2 (709)
★バトントワリングのこと教えて!2本目★ (345)
--log55.com------------------
【DMM/角川】艦隊これくしょん〜艦これ〜6675隻目
【マッキー】 天音&無治療系10 【ワクワク・バカボン】
【新蘭】工藤新一(コナン)×毛利蘭アンチスレ2
ユチョン
安倍晋三&安倍信者アンチスレ5
輝き顔文字スレ★20
☆★★★ 松本潤&井上真央 149考察スレ ★★★★
しまむら連呼厨が最高裁を連呼し続けるスレ