1read 100read
2013年17プログラム71: 【入門】Common Lisp その10【質問よろず】 (299) TOP カテ一覧 スレ一覧 2ch元 削除依頼
proce55ing プログラミングアート全般 (700)
HSPだって (193)
【魔法】リリカル☆Lisp【言語】 (218)
Smalltalk総合 Squeak Pharo (104)
Subversion r14 (694)
くだすれFORTRAN(超初心者用)その6 (240)

【入門】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元 削除依頼
【アンチ】関数型言語は使えない【玩具】 2 (498)
【分散型バージョン管理】 Mercurial 2【hg】 (244)
datファイルを共有するP2Pソフト o2on 17dat (482)
関数型プログラミング言語Haskell Part23 (480)
pythonがこの先生きのこるには (753)
COBOL?極めてやんよ シュッシュ!! (146)
--log9.info------------------
CSKA Moscow 本田圭佑 part1132 (1001)
性格が良さそうなサッカー選手 (431)
逮捕目前 進藤容疑者専用スレ  (820)
Manchester United 香川真司 part 942 (1001)
ふたたび、しおらしくなってきた日本サッカー1 (106)
Olympique☆★オリンピック・リヨン 22★☆Lyonnais (295)
本田圭佑が検索してそうな言葉 Part2 (351)
クリロナVSベイルVSネイマールVSエルシャーラウィ (169)
☆★フランスリーグ LIGUE 1★☆Part13 (685)
韓国サッカー総合5 (620)
毎日Rーしてそうなサッカー選手 (894)
SV Werder Bremen 17 (397)
宮市>>>J2宇佐美 どうしてこうなった? (266)
香川>>>>>>>>アザールだった件wwwwww (660)
【マンユー】Manchester United【527】 (177)
*** El Submarino Amarillo Villarreal CF 17 *** (357)
--log55.com------------------
【江上光治】池田高校の記憶☆part2☆【水野雄仁】
コロナによる東京五輪延期決定で選手権大会中止確定へ
山形(笑)だけで1000を目指すスレ
長崎県の高校野球 92
常総学院Part93
東京民国代表はなぜ日本の高校スポーツファンに認められないのか?
【打倒】中越文理以外の新潟応援スレ3【仁哉】
大阪人を必死に応援する山形県民