【入門】Common Lisp その10【質問よろず】at TECH
【入門】Common Lisp その10【質問よろず】 - 暇つぶし2ch1:デフォルトの名無しさん
13/02/20 15:31:16.00
Lisp Schemeスレでは恥ずかしくて聞けないようなことを質問したり、
Lisp Schemeスレの話題は高度すぎて気後れする人が話しあったり。
それ以外でもCommon Lispについての話題なら歓迎します。

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

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

■前スレ
【入門】Common Lisp その9【質問よろず】
スレリンク(tech板)

■Wiki
URLリンク(wiki.fdiary.net) (id:guest pass:cl)
URLリンク(cl.cddddr.org)
URLリンク(tips.lisp-users.org)

2:デフォルトの名無しさん
13/02/21 00:11:50.65
< `∀´>ニダー

3:デフォルトの名無しさん
13/02/21 01:11:18.80
初心者です

4:デフォルトの名無しさん
13/02/21 01:15:25.68
小心者です

5:デフォルトの名無しさん
13/02/21 01:21:09.62
>>3
そうか

6:デフォルトの名無しさん
13/02/21 05:59:51.54
404 Blog Not Found:(笑) - 書評 - Land of Lisp
URLリンク(blog.livedoor.jp)

7:デフォルトの名無しさん
13/02/21 10:06:46.88
NetwalkerにCL乗せたいなぁ
ポケットサイズのlispマシン欲しい

8:デフォルトの名無しさん
13/02/21 22:59:55.53
>>7
Netwalkerは普通のlinuxマシンじゃないの ?

Vaio Pとかいろいろ買ったけど
Macbook Airが一番無難で可搬性の高いUnix(lispの動くプラットフォーム)
なんじゃないかと現状思う。

AndroidがLinuxだと思ってNECのLife Touch Note買ったけど
shellなくてわろた

9:8
13/02/21 23:02:51.05
8はNetwalkerは普通のLinuxだからCommon Lispは簡単に
インストールできるんじゃないの ?という意味で書きました。

わかりにくい書き方ですみません

10:デフォルトの名無しさん
13/02/21 23:18:26.42
common lispの入門にon lispを読んでるんだけどしらない関数ばかりで入門には向いてない気がしてきた
他に系統的に学べるサイトはないかな

11:デフォルトの名無しさん
13/02/21 23:34:49.50
本ってどの言語にしてもそこそこ自力で何か書けるレベルで読まないとあんまり続かない気がする

12:デフォルトの名無しさん
13/02/21 23:50:39.13
practical common lispをさっと読んでからCLtL2を読み始めるとよいと思う

13:デフォルトの名無しさん
13/02/22 00:15:08.83
英語読めないから本買わないと駄目なのか
結構値がはるしキツいな

14:デフォルトの名無しさん
13/02/22 00:19:45.76
ちょっと前最初のほうだけ英語で読んでみたけど
そこまで難しい英語じゃなかったので
読もうと思えば読めるレベル

15:デフォルトの名無しさん
13/02/22 17:29:22.11
>>11
その点手続型言語は基本的な文法をちょろっとやれば
そこそこ自力で書き始められて、壁にぶち当たったら本を読んで、
とできるけど、lispはそれが難しかった

16:デフォルトの名無しさん
13/02/22 17:57:40.92
他にもともと別の手続き型言語を知ってたとかではなくて?

17:デフォルトの名無しさん
13/02/23 00:31:27.17
最初はcar、cdrとか再帰だけで色々練習問題解いてたけど
それだけでも色々できて面白かったけどなあ

18:デフォルトの名無しさん
13/02/23 01:57:48.09
>>15
手続き型・・・小学校で習う表記に似てるからじゃね?

19:デフォルトの名無しさん
13/02/23 02:10:07.98
おれはPAIPを勧めるがなぁ。
あと、lisp をできるようになりたいだけなら日本語版でもいい。でも、凄いエンジニアになりたいのなら、英語力は必須だよ。
逆に考えればlispと英語が同時に学べるチャンスだ。

20:デフォルトの名無しさん
13/02/23 13:34:08.23
>>10
xyzzy Lisp Programming
URLリンク(www.geocities.jp)

21:10
13/02/23 13:58:28.39
>>20
やっぱりこれがいいのか
読んでみる、ありがとう

22:デフォルトの名無しさん
13/02/23 16:08:30.02
緑のナマモノ本、Amazonで発売日に在庫切れか
でもまさか予約分しか入荷して無かったってオチじゃないよな

23:デフォルトの名無しさん
13/02/23 16:23:40.08
そんなもんじゃない?発売当日に在庫ありになってないのは珍しくない
予約してた人は今日届くのかな

24:デフォルトの名無しさん
13/02/23 22:55:28.84
予約してたけど届くには月曜…

25:デフォルトの名無しさん
13/02/24 04:01:59.03
新宿の紀伊国屋とかに行けばあるかな。
しかし正直コードのある本は電子書籍で出してほしい。

26:デフォルトの名無しさん
13/02/24 12:05:25.33
emacs + slime の環境なんですが
C-c C-d h と同じことを他のライブラリでやれるようにするものってありませんかね?

27:デフォルトの名無しさん
13/02/24 13:14:51.50
木のそれぞれの値を2倍にする関数を教えてください。。。
(mapcar #'(lambda (x) (* 2 x)) '((1 2) 3))
的な。

28:デフォルトの名無しさん
13/02/24 13:31:22.34
初心者の俺が練習がてら書いてみた
破壊的変更よく知らないので戻り値で返す

(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:デフォルトの名無しさん
13/02/24 13:32:25.79
再帰で呼び出す関数名が間違ったままだった・・・
(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:デフォルトの名無しさん
13/02/24 13:37:49.63
>>26
ドキュメント方面で共通の仕組みがdocstringくらいしかないから、
C-c C-d dくらいしかないと思う。CCLだとdocstring表示されんけど。
それ以上が欲しいならレッツ自作。

>>27
自分が知る限りない。レッツ自作。

31:デフォルトの名無しさん
13/02/24 13:39:36.10
MaximaがLispで書かれていると聞いてちょっと感動した

32:デフォルトの名無しさん
13/02/24 14:05:07.09
>>27
初心者の俺も練習がてら書いてみた。

(defun 2bai-2bai (node)
(if (consp node)
(mapcar #'2bai-2bai node)
(* node 2)))

(2bai-2bai '(1 (2 5 (10 30)) 3))

33:デフォルトの名無しさん
13/02/24 14:06:54.35
>>27
(defun f (x)
(if (listp x)
(mapcar #'f x)
(* 2 x)))

(mapcar #'f '((1 2) 3))

34:デフォルトの名無しさん
13/02/24 14:11:53.35
なるほどmapcarで再帰するなんて方法があるのか・・・

35:デフォルトの名無しさん
13/02/24 14:14:36.81
> mapcarで再帰する
定石だと思うぞ

36:デフォルトの名無しさん
13/02/24 14:25:29.92
mapcarとかreduceとか既存のものを利用していかに楽するかを考えるんだ。
働きたくないでござる。早くニートになりたい。

37:デフォルトの名無しさん
13/02/24 14:41:47.35
他人のソースを殆ど見ないので全然定石を知らないなあ

38:デフォルトの名無しさん
13/02/24 19:38:17.41
>>29,30,32,33
ありがとうございます!
mapcarで再帰は自分も知らなかったので眼から鱗です。

39:デフォルトの名無しさん
13/02/24 23:38:24.35
よくある木の再帰だと思うけど

40:デフォルトの名無しさん
13/02/25 00:23:46.97
マクロとかXMLとかの処理を書くときに嫌ってほど出て来るな。

41:デフォルトの名無しさん
13/02/26 01:44:26.04
sbclのwindows fork版ライセンスについて質問します
URLリンク(github.com)
ここで入手できるバイナリと自作のlispソースを一緒に配布するとき、
どのようなライセンスにしなければならないのでしょうか
sbcl自体は public domain + BSD-style licenses のようですが…

42:デフォルトの名無しさん
13/02/26 18:17:17.01
Land of Lisp原著持ってたから立ち読みで済ませるつもりだったのだけど
リストリテラルを書きかえるのはよくないって注に書いてあって
ドキっとしたのでついレジに持っていってしまった

あと訳した人が元ヤンキーである可能性が微レ存

43:デフォルトの名無しさん
13/02/26 22:13:22.48
はぁ?Shiroさんだぞ?

44:デフォルトの名無しさん
13/02/28 00:35:27.69
>>41
昔書いたやつどぞー。責任は持てんので、あくまでも参考程度に。

URLリンク(cl.cddddr.org)

ちなみに、他のライブラリを使ってそれを同梱する場合、
そっちのライセンスにも注意。特にGPL。

45:41
13/02/28 01:27:01.72
>>44
ありがとうございます。わかりました。

46:デフォルトの名無しさん
13/02/28 16:16:19.02
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:デフォルトの名無しさん
13/03/02 20:48:54.59
(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:デフォルトの名無しさん
13/03/02 22:43:19.36
無駄がない形に最適化してくれてるんじゃないの。知らんけど。

49:デフォルトの名無しさん
13/03/02 23:11:53.84
>>47
仕様はコレ。
URLリンク(www.lispworks.com)
処理系は好きに最適化してよいそうです。

50:デフォルトの名無しさん
13/03/02 23:29:30.98
>>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:デフォルトの名無しさん
13/03/02 23:49:09.29
`(`(,a))は`((,a))と等価じゃなくね?

(let ((a "hoge"))
(list 'ほら `((,a)) `(`(,a))))
;=> (ほら (("hoge")) (`(,A)))

``(,,@parameter)が
`(`(,A ,B) `(,C ,D) `(,E ,F))にならずに
`((,A ,B) (,C ,D) (,E ,F))になるのってどうなんだろう。
そのコードは後者の挙動を前提にしているような。

52:デフォルトの名無しさん
13/03/07 15:54:02.64
わけがわからないよ

53:デフォルトの名無しさん
13/03/09 23:17:33.27
CCL 1.9出たで。

公式
URLリンク(ccl.clozure.com)

リリースノート訳
URLリンク(qiita.com)

54:デフォルトの名無しさん
13/03/11 21:57:44.02
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:デフォルトの名無しさん
13/03/11 22:48:48.12
>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:ハツネツ
13/03/11 23:21:23.65
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:デフォルトの名無しさん
13/03/12 20:49:01.00
先輩方すげっwww
簡単にできちゃうのか。。
なんでこういう方向でいかないんですかね?
今のoop慣れした世代にはこっちの方が親近感あるから
とっつきやすいと思うんだけど

58:デフォルトの名無しさん
13/03/12 20:55:24.88
マクロは大勢で共同作業するときには C++ のテンプレート並みに諸刃の刃ぁぁぁ
なんです

59:デフォルトの名無しさん
13/03/12 21:00:59.93
諸刃の剣っていいたかったのか?

60:デフォルトの名無しさん
13/03/12 21:31:28.50
テンプレよりもオペレータオーバロードによくたとえられる気がするけど

61:はちみつ餃子 ◆8X2XSCHEME
13/03/12 21:47:58.30
何の蓄積もないところからってことになると統制がとれないだろうけど、
デファクトスタンダードになりうるクラス指向ライブラリがあれば、それなりに使う人もいるんじゃね?

62:デフォルトの名無しさん
13/03/14 00:43:41.46
フィボナッチ数列を行列のべき乗で求めるやつ書いてみたら
なかなかあほっぽくなっとるからかっちょよく書いとくれ
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))

参考
URLリンク(itpro.nikkeibp.co.jp)

63:デフォルトの名無しさん
13/03/14 02:42:13.88
>>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:デフォルトの名無しさん
13/03/14 14:33:24.70
CLはマルチパラダイム言語というが、
いったんCLOSの機能を使い出すと副作用でまくりで
関数プログラミングとの共存など不可能のように思える。

65:デフォルトの名無しさん
13/03/14 14:37:36.56
純粋関数型パラダイムはちょっと特殊だからなぁ

66:デフォルトの名無しさん
13/03/14 21:10:25.24
>>65
式と文が別物ってところに山ほど違和感がある >いわゆる普通の言語
# 高級アセンブラの C は除く

67:デフォルトの名無しさん
13/03/14 21:47:43.67
その C だって、GCC なら ({ ... }) で囲めばなんでも式になるぞw
そもそも、代入が式だし。

68:デフォルトの名無しさん
13/03/14 22:12:50.89
> GCC なら ({ ... }) で囲めばなんでも式
いや、それは極論だし

69:デフォルトの名無しさん
13/03/14 22:47:11.34
H

70:デフォルトの名無しさん
13/03/15 19:38:17.80
land of lisp まだ来ねー

71:デフォルトの名無しさん
13/03/15 21:24:32.91
昔のDOSの表計算アプリみたいな画面を
REPLで実現してくれるライブラリってない?

72:デフォルトの名無しさん
13/03/16 00:51:53.81
>>71
*curses.so あたりを ffi すればいいのではあるまいか?

73:デフォルトの名無しさん
13/03/16 09:18:52.30
cl-ncursesっていうのを見つけた
ありがとう

74:デフォルトの名無しさん
13/03/16 14:14:13.11
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:デフォルトの名無しさん
13/03/16 17:08:50.04
read-lineで入力を求める際に
初期値として任意の値をセットしておくことはできませんか?

76:デフォルトの名無しさん
13/03/16 19:16:56.09
>>75
どこかのユーティリティライブラリにありそうですけど、
自分の使ってるものには見当たらなかったので書いてみました。
こういう感じので良いですか?

URLリンク(paste.lisp.org)

77:デフォルトの名無しさん
13/03/16 19:42:23.35
>>74
自分ならだるさを許容するかパッケージプリフィックスで手を打つと思う。

78:デフォルトの名無しさん
13/03/16 21:33:03.10
>>76
ありがとうございます。
やりたいことは初期値をセットしておいてその一部を書き換えてread-lineさせる
という動作なので、"default value"が表示されてる状態にしたいのです。

79:デフォルトの名無しさん
13/03/16 21:49:19.62
これに対するマクロ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:デフォルトの名無しさん
13/03/16 21:59:27.44
(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:デフォルトの名無しさん
13/03/16 21:59:43.71
なぜこんなことをしているのかというと、XMLからデータを取ってこようとしているからです

厚かましいお願いですが、XMLで属性からデータを取得できるやり方も教えていただけないでしょうか

82:デフォルトの名無しさん
13/03/16 22:07:48.91
>>80
完璧です!ありがとうございます
畏れ入りました

自分のレベルがあまりに低いからかもしれませんが
なぜこんな短時間でマクロを考えつけるのでしょうか?
やっぱり経験ですか?

83:デフォルトの名無しさん
13/03/16 22:16:15.56
>>78
自分はあまりその辺りに詳しくないのですが、おそらく端末制御の領分になると思います。
難易度がかなり上がりますが、それでもその方式にこだわりがあるのなら、
>>72-73で挙がっている情報を調べてみると手がかりが掴めるかもしれません。

84:デフォルトの名無しさん
13/03/16 22:44:43.37
>>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:デフォルトの名無しさん
13/03/16 22:53:51.01
何も考えず(ql:quickload "xpath")したら
URLリンク(common-lisp.net)
これ入ったのでこれ使うといいと思う。依存関係でClosure XMLも入るし

86:デフォルトの名無しさん
13/03/16 23:06:11.04
>>84
>>85
なるほど。勉強になります。
それらを踏まえ、もう一度作りなおしてみます。

ご教授ありがとうございました!

87:デフォルトの名無しさん
13/03/16 23:25:06.33
逆引きCommonLispに結構例が載ってるんで、参考にどうぞ。
こういう例が欲しいとか、そういうのがあったら教えて下さい。

URLリンク(tips.lisp-users.org)

88:デフォルトの名無しさん
13/03/16 23:34:39.24
>>87
ありがとうございます。早速ブックマークに登録しました。

89:デフォルトの名無しさん
13/03/17 07:44:14.36
>>78,83
ncurses に libform ってのがくっついてて,
こいつの set_field_buffer() とかをffiして使えば何とかなるのかな?
後は自前で作りこむくらいしか思いつかない

90:デフォルトの名無しさん
13/03/17 09:20:40.67
>>83,89
ヒントありがとうございます!
その辺をslimeのcontribあたりと合わせて見てみます。

91:デフォルトの名無しさん
13/03/17 18:46:12.79
一定の出力を最後にまとめて文字列として返したいのですが、どういう風にすればいいのでしょうか
今は↓のように文字列をconcatenateで連結させていますが、formatのnilの部分をストリームに変えて出来ないものかと思っています
(concatenate 'string
(format nil "テスト")
(format nil "bar")
)

92:デフォルトの名無しさん
13/03/17 19:03:55.87
(defun mkstr (&rest args)
 (with-output-to-string (s)
 (dolist (a args) (princ a s))))
こういうこと?

93:デフォルトの名無しさん
13/03/18 09:45:42.47
それです!ありがとうございました

94:デフォルトの名無しさん
13/03/18 18:07:16.64
thunkってどういうときに使うんですか?

95:デフォルトの名無しさん
13/03/18 18:41:36.92
感謝したとき

96:デフォルトの名無しさん
13/03/18 18:49:13.61
thanks!

97:デフォルトの名無しさん
13/03/18 21:46:13.46
>>94
めちゃくちゃ大雑把に言えば
「今評価しないで後で評価されるかも知れない式」
全般のことじゃね?

98:デフォルトの名無しさん
13/03/18 23:14:34.67
CLOSあんま好きじゃない派の人って
やっぱ構造体使うんですか?それともリスト?

99:デフォルトの名無しさん
13/03/19 00:32:11.47
両方使ってる気がします。

100:デフォルトの名無しさん
13/03/20 15:00:45.68
質問です。

value に格納されている文字列

"hogehoge 'abc' 1112 'def'999 'ghi'"
でクオーテーションで囲まれている部分を$(数字) で置き換えて
"hogehoge $(0) 1112 $(1)999 $(2)"
という風にしたいのですが

"hogehoge $(0) 1112 $(0)999 $(0)"
となってしまいうまくいきません

(let* (
(value "hogehoge 'abc' 1112 'def'999 'ghi'")
(pattern "\\('[^']*'\\)")
(eval-value value)
)
(setq eval-value (replace-regexp-in-string pattern (format "$(%d)" 0) eval-value nil nil 1))
(setq eval-value (replace-regexp-in-string pattern (format "$(%d)" 1) eval-value nil nil 1))
(setq eval-value (replace-regexp-in-string pattern (format "$(%d)" 2) eval-value nil nil 1))
)
1回目のreplace~で全て$(0)になってしまい、引数が↓のときとおなじ結果になってしまいます。
(replace-regexp-in-string pattern (format "$(%d)" 0) eval-value)

これってどうすればいいんでしょうか?

101:デフォルトの名無しさん
13/03/20 15:36:30.88
>>100
それEmacs Lispだと思うんで、Emacsのスレで聞いてください。

てーか、そういうときはM-x describe-functionで関数を調べてみてください。
"Replace all matches for REGEXP with REP in STRING."って書いてます。

102:デフォルトの名無しさん
13/03/23 01:58:05.19
list*とconsは全く同じものですか?

103:デフォルトの名無しさん
13/03/23 02:31:29.01
consは2引数やで

104:デフォルトの名無しさん
13/03/23 09:47:49.14
たしかにそうでした

105:デフォルトの名無しさん
13/04/07 23:35:25.85
みなさんは作った実行ファイルの大きさとか気にならないですか?

106:デフォルトの名無しさん
13/04/08 04:27:40.74
>>105
なんで気になるの?
自分はMegademoで4Kとか64Kでも作らない限り気にもしないけど

107:デフォルトの名無しさん
13/04/08 16:44:33.11
>>105
16G とか 32G の主記憶が当たり前の時代に, 組み込み物とか >>106 のような
用途でもない限り, 実行ファイルの大きさとか気にしてもしょうがないじゃん.
組み込み物だって, 1G とか 2G の主記憶積んだやつあるのに...

108:デフォルトの名無しさん
13/04/08 17:12:57.85
コンパイラが吐き出す実行ファイルの大きさよりも、実行時のメモリ消費量のほうが気になります。

109:1/2
13/04/09 01:33:46.19
型宣言を入れたのに何故か高速化されなくて困ってます。
(setf d (make-array '(1000 1000) :element-type 'double-float :initial-element 1.0d0))
という2次元配列の合計を求める関数なんですが、
(defun sum-d (a)
(let ((sum 0))
(dotimes (r 1000) (dotimes (c 1000) (incf sum (aref a r c)))) sum))

これに型宣言を以下のように入れてみました。
(defun sum-d-opt (a)
(declare (type (simple-array double-float (1000 1000)) a))
(let ((sum 0.0d0))
(declare (type double-float sum))
(dotimes (r 1000) (dotimes (c 1000) (incf sum (aref a r c)))) sum))

110:2/2
13/04/09 01:47:29.07
コンパイル&実行結果


CL-USER> (time (sum-d d))
took 49,000 microseconds (0.049000 seconds) to run.
32,000,064 bytes of memory allocated.
1000000.0D0
CL-USER> (time (sum-d-opt d))
took 50,000 microseconds (0.050000 seconds) to run.
32,000,064 bytes of memory allocated.
1000000.0D0


高速化どころか遅くなってます・・
どなたか原因がわかる方おしえていただけますでしょうか?
使っている処理系はClozure CL 1.9です。

111:デフォルトの名無しさん
13/04/09 05:17:12.18
>>110 コンパイラが賢くないとしか言えないんだが...
disassemle すると, 型宣言した方はsse命令を使おうとして,
そのための準備コードが増えて遅くなってるように見える
(手元にあるのは 1.7 だけど....)

112:デフォルトの名無しさん
13/04/09 23:28:54.53
うちだと、

 (SUM-D D)
 took 140 milliseconds (0.140 seconds) to run.

 (SUM-D-OPT D)
 took 79 milliseconds (0.079 seconds) to run.

前にSBCLの開発者が数値計算のベンチマーク取ってたけど、
CCLはあまり成績が良くなかった。ABCLのが速いくらいだったような。
速度が重要な場面ではSBCL使った方が良いと思う。

ついでに型推論とかもSBCLみたいに頑張らないから、
theとかdeclareとか無駄にいっぱい付けないと駄目だったはず。

あと、基本的な確認で申し訳ないけど、最適化宣言は大丈夫?
実行時型チェックとか外すのに条件があったりするけども。

URLリンク(accomplish-nothing.blogspot.jp)

113:デフォルトの名無しさん
13/04/10 00:52:01.96
URLリンク(permalink.gmane.org)
GSoC2013
ガチリストになってて面白いけど、どれぐらい応募あるのかな。

114:109
13/04/10 01:29:29.92
>>111
>>112

どうもありがとうございます。
確かにdisassembleするとSSE2のaddsdが使われてました。
型宣言することでgenericな + 演算子がネイティブの機械語命令に
最適化されたとしても、必ずしも高速化されるとは限らないんですね。
なお、最適化宣言は
(declare (optimize (speed 3) (debug 0) (safety 0)))
を入れてますが、あってもなくても速度は変わりませんでした。

ちなみに、SBCL(1.1.4)で試してみたところ劇的に高速化されました。

CL-USER> (time (sum-d d))
0.097 seconds of real time
CL-USER> (time (sum-d-opt d))
0.004 seconds of real time

Windows環境なので、比較的安定らしいClozure CLを使ってましたが、
doubleの数値計算を多用する場合はSBCLの方がいいかもしれませんね・・

115:デフォルトの名無しさん
13/04/10 06:43:55.10
>>114
> doubleの数値計算を多用する場合はSBCLの方がいいかもしれませんね・・

CCLの結果
CL-USER> (time (sum-d d))
(SUM-D D) took 58,927 microseconds (0.058927 seconds) to run
CL-USER> (time (sum-d-opt d))
(SUM-D-OPT D) took 46,165 microseconds (0.046165 seconds) to run

SBCL(1.1.6)の結果
CL-USER> (time (sum-d d))
Evaluation took:
0.028 seconds of real time
0.027940 seconds of total run time (0.027940 user, 0.000000 system)
CL-USER> (time (sum-d-opt d))
Evaluation took:
0.001 seconds of real time
0.001564 seconds of total run time (0.001465 user, 0.000099 system)

116:デフォルトの名無しさん
13/04/11 00:22:31.41
>>114
ごめん。SBCL開発者じゃなくておにぎりの人だった。

URLリンク(cl.cddddr.org)

一応Nikodemus Siivolaのこんなんもあるけど。

URLリンク(random-state.net)

ここ一年くらいでSBCLもWindowsの対応が劇的に改善されたから、
特に理由がなければSBCLで良いんじゃないかなー、と思う。
CCLも過去にWindowsでの結構クリティカルなバグとかもあったし、
個人的には安定してる印象は持ってない。

117:デフォルトの名無しさん
13/04/26 20:42:23.25
(A B C D E) のcadddrがDになるのは何故ですか?

118:デフォルトの名無しさん
13/04/26 20:44:58.23
(car (cdr (cdr (cdr '(A B C D E))))
(car (cdr (cdr '(B C D E))))
(car (cdr '(C D E)))
(car '(D E))
D

119:デフォルトの名無しさん
13/04/26 20:55:17.77
cdrのcdrのcdrのcarだから
逆順に読めばいい

120:デフォルトの名無しさん
13/04/26 22:39:28.61
カドゥドゥドゥラァ

121:デフォルトの名無しさん
13/04/28 13:39:23.14
コマンドラインから
$ sbcl --script sample.lisp

と実行するとき、sample.lispの中の
quicklispたちは別ファイルに分けたりするべきなのですか?

あまりプロジェクトに関わったりしたことないので
ファイル配置の勘所がわからないです

122:デフォルトの名無しさん
13/04/28 13:58:00.87
Quicklispたちっていうのは(ql:quickload :foo)みたいな式のこと?
sample.lispの中っていう表現が良く分からないです。

QuicklispはLinuxでのAPTみたいなパッケージ管理システムだから、
自分でそのパッケージを同梱して配布する必要はないですよ。

$ cat
(ql:quickload :alexandria)
(alexandria:define-constant +foo+ "foo" :test #'equal)
$ sbcl --script sample.lisp

って感じなら、Quicklispを導入してる環境で実行すると、
自動的にAlexandriaをダウンロードしてコンパイルしてくれるので。

123:デフォルトの名無しさん
13/04/28 14:18:27.25
あと、自分が見てきた中では、

* 必要なライブラリは事前にQuicklispや手動でインストールしておくことが前提
* 必要なライブラリの読み込みはASDFで依存関係を定義して利用

という形のプロダクトが多かったです。

作っているのがライブラリならそのままASDF経由で利用してもらって、
アプリケーションならC言語のmain的なトップレベルの関数を用意しておいて、
REPLから呼び出したり、実行形式にしたコアイメージのトップレベルに指定したり、
スクリプトから(asdf:load-system :foo)とか(ql:quickload :foo)で読み込み、
トップレベルの関数を呼び出し、って感じじゃないでしょうか。

この辺り、Common Lispでは色々方法があって、全部説明すると長くなるので、
どんな感じの運用をしたいか書いてくれると回答をもらいやすいかも。

124:デフォルトの名無しさん
13/04/28 15:09:47.84
>>122

とても理解できました

例えば、sample.lispが定期的にDBのバックアップを作るスクリプトだとして
(ql:quickload 'cl-dbi)が必要だとします
sbcl --script sample.lisp

をcronに登録するとき、sample.lispの先頭には
(load "~/.sbclrc)
(ql:quickload 'cl-dbi)
を書いておくのは自然なんでしょうか?

125:デフォルトの名無しさん
13/04/28 15:22:31.24
>>123

ASDFファイル(sample.asd)に、実行時に必要になるライブラリを
明記しておくのが多いということでしょうか?

126:デフォルトの名無しさん
13/04/28 17:56:12.85
>>124
スクリプトでは自然だと思います。

>>125
プロジェクトという言葉があったり、ファイル構成を気にしてらしたので、
一定以上の規模のソフトウェアも作りたいのかも、と思い、追記しました。
スクリプト用途ならASDFに対応する必要はないです。

ASDFに対応すると便利なのは、ソフトウェアのビルドに手順が必要だったり、
書いたソフトウェアを配布したいときです。ビルド用にcompile-fileするスクリプトを書いたり、
マクロを使うときにeval-whenで:comple-toplevel指定したりって面倒じゃないですか。
そういうときに利用するとその辺りを良きに計らってくれるので楽です。
makeとかrakeとかmvnとかantとかその辺に該当します。

127:デフォルトの名無しさん
13/04/28 23:01:16.97
>>126
とてもよくわかりました

ありがとうございました!

128:デフォルトの名無しさん
13/05/09 20:17:14.37
ブラウザゲーム作りたいです(´・ω・`)

129:デフォルトの名無しさん
13/05/09 22:15:46.82
ゲーム内部のバックエンド部分なら問題なく書けると思うから頑張れ。
ユーザインターフェイス(画面周りとか操作周りとか)は、
多分JavaScriptの力を借りることになる。

130:デフォルトの名無しさん
13/05/09 22:47:45.81
Common Lisp から JavaScript のコードを生成するとかどうよ。

131:デフォルトの名無しさん
13/05/11 20:15:46.77
>>130 parenscript の話?

132:デフォルトの名無しさん
13/05/24 11:45:04.97
ついでにnode.jsも使わせて

133:デフォルトの名無しさん
13/05/29 02:04:18.66
lispをjavascriptに変換してからv8で動かしたら
stalinより高速なんじゃないのかな

134:デフォルトの名無しさん
13/05/29 03:05:21.97
事前に型付けしまくってAOTコンパイルで頑張るCommon Lispと
実行時情報を元にJITコンパイラが頑張るJavaScriptだと、
アプローチ的にはむしろ対極にある気がするけど

135:デフォルトの名無しさん
13/05/29 04:19:34.86
v8はプロファイラで速度のボトルネック探してから
そこだけ型推論かけてNativeにコンパイルするそうだ

136:はちみつ餃子 ◆8X2XSCHEME
13/05/29 12:08:35.87
asm.js は Common Lisp 的アプローチって言えるんじゃね。

>>133
JavaScript って毎回ソースコードを読込むところからスタートして実行するところまでやらなきゃならないから、
コンパイル・最適化が実行時間に含まれるわけで、あまり気合入れた最適化も出来ないんだよな。
つまり、めいっぱい頑張って最適化すればいいわけじゃなくて、
全体として一番よくなるほどほどのところを目指すトレードオフの見極めが重要な JS は
Common Lisp とは目標が違うから高速化のために組合わせるのはうまくない気がする。

137:デフォルトの名無しさん
13/05/29 12:15:29.28
asm.jsはrabbit compiler的だよ。
部分言語である小さいcore言語を設定してて。

それからJITは気合入れたい所に目一杯気合入れることが可能なフレームワークです。
実行時プロファイルが使えるので。

138:デフォルトの名無しさん
13/06/07 01:56:27.51
何でもいいので仕事くだされ
twitter.com/g000001

139:デフォルトの名無しさん
13/06/07 01:59:19.02
PHPでよければ

140:デフォルトの名無しさん
13/06/08 21:18:23.73
(A B C D)は
なんで (A . (B . (C . D))) じゃなく (A . (B . (C . (D . nil)))) なの?最後の nil は何なの?

141:デフォルトの名無しさん
13/06/08 21:32:26.56
長さ0のリスト

142:デフォルトの名無しさん
13/06/08 21:33:48.63
nilはなにもないことを表す特殊な記号
() と書くこともある

143:デフォルトの名無しさん
13/06/08 21:36:06.91
乳首じゃないからな

144:デフォルトの名無しさん
13/06/08 21:59:34.33
コンスセルはcar部とcdr部とで構成されており
cdr部に別のコンスセルを入れることでリストを構成する
また、そのようなコンスセルの連鎖がリストであるので
cdr部にリストを入れることでリストを構成する、とも言える・・・①
(C . D)においてcdr部に入っているのはコンスセルではなく、D。これはシンボルである
これに対して(D . nil)はcdr部がnilなのだけれど、
このnilが空リストである()と同義なので、①の定義に基づき(D . nil)はリストである
補足すると
(A . (B . (C . D)))のcdr部は(B . (C . D))
(B . (C . D))のcdr部は(C . D)、ではなく((C . D))が入り
((C . D))のcdr部はnil、car部が(C . D)となる

とか適当なことを言ってみる

145:デフォルトの名無しさん
13/06/08 22:00:19.42
いや、nilそのものの意味を訊いてるわけじゃなくてdana

146:デフォルトの名無しさん
13/06/08 22:04:11.74
(A . (B . (C . (D . nil)))) →  (A . (B . (C . (D . ()))))

ということだ

147:144
13/06/08 22:05:18.70
ああ、全然ちがう!!
恥ずかしくて死にそう・・・orz

148:デフォルトの名無しさん
13/06/08 22:09:38.51
最後がなぜnilなのかは、リストの定義がそうだからとしか言いようがない。

149:144
13/06/08 22:10:00.86
(B (C . D))と勘違いしてた><

150:デフォルトの名無しさん
13/06/08 22:13:52.89
(A B) は (A . B) であり (A . (B . nil)) ではない
(A B C) は (A . (B . (C . nil))) であり (A . (B . C)) ではない
(A B C D) は (A . (B . (C . (D . nil)))) であり (A . (B . (C . D))) ではない

151:デフォルトの名無しさん
13/06/08 22:15:29.66
3つ以上並んだやつの略記リストは最後はnil

152:デフォルトの名無しさん
13/06/08 22:20:23.30
Lispは難解だな

153:デフォルトの名無しさん
13/06/08 22:33:31.41
(A . (B . C)) は A と (B . C) の2つで構成されるリストと解釈される つまり略式は (A (B C)) となってしまう
(A . (B . (C . nil))) は A と B と C と nil の4つで構成されるリストと解釈される

154:デフォルトの名無しさん
13/06/08 22:37:08.95
同様に (A . (B . (C . D))) は (A B (C D)) のことになる (A B C D)にはならない

155:デフォルトの名無しさん
13/06/08 22:38:31.42
(A) => (A . nil)
で、
(A (B C)) => (A . ((B . (C . nil)) . nil))
であってる?

156:デフォルトの名無しさん
13/06/08 22:41:43.13
>>154
違う
×  (A B (C D))
○ (A (B (C D)))

(A B (C D)) は (A . (B . ((C . D) . nil)))

157:デフォルトの名無しさん
13/06/08 22:43:29.82
なんだかオラ混乱してきたぞ

158:155
13/06/08 22:46:45.98
>>151,153,154
は違うように思う。
(A . (B . (C . D))) は (A B C . D)

159:デフォルトの名無しさん
13/06/08 22:49:35.87
厳密なS式なんて時代遅れ

160:デフォルトの名無しさん
13/06/08 22:59:16.31
Lisp (programming language) - Wikipedia, the free encyclopedia
URLリンク(en.wikipedia.org)(programming_language)#S-expressions_represent_lists

S-expressions represent lists

Parenthesized S-expressions represent linked list structures.
There are several ways to represent the same list as an S-expression.
A cons can be written in dotted-pair notation as (a . b), where a is the car and b the cdr.
A longer proper list might be written (a . (b . (c . (d . nil)))) in dotted-pair notation.
This is conventionally abbreviated as (a b c d) in list notation.
An improper list may be written in a combination of the two ? as (a b c . d) for the list of three conses whose last cdr is d (i.e., the list (a . (b . (c . d))) in fully specified form).

161:デフォルトの名無しさん
13/06/08 23:37:09.68
>>150
(a b)は(a . (b . nil)) だよ。
(a . b)はあくまで(a . b)だ。
そもそも(a)が(a . nil)なのに、要素数が2のときだけ例外になんかせんよ。

162:デフォルトの名無しさん
13/06/09 00:58:48.17
(A B)と(A . B)は別物ってことか

163:デフォルトの名無しさん
13/06/09 01:09:24.59
lispの論文読めば分かる

Recursive Functions of Symbolic Expressions
URLリンク(www-formal.stanford.edu)

164:デフォルトの名無しさん
13/06/09 01:26:29.46
リストとは2つの値のペアのことであり、3つ以上は無い

165:デフォルトの名無しさん
13/06/09 06:42:57.75
盛り上がっているのかと思ったらパルプンテかかってる。

166:デフォルトの名無しさん
13/06/09 12:02:22.61
(A . (B . (C . D)))
(A . (B . (C . (D . nil))))
それぞれについて一要素づつ表示する関数でも書いてみたら?
どっちが便利か?
どっちを採用したくなるか?

167:デフォルトの名無しさん
13/07/03 NY:AN:NY.AN
CFFIの使い方解かりやすい日本語サイトか
簡単な例など何方か教えていただけますか?

168:デフォルトの名無しさん
13/07/03 NY:AN:NY.AN
>>167
CFFI - Common LISP users jp
cl.cddddr.org/index.cgi?CFFI

169:デフォルトの名無しさん
13/07/03 NY:AN:NY.AN
>>168
ありがとございます。

170:デフォルトの名無しさん
13/07/09 NY:AN:NY.AN
On Lispのtrec関数が単なる遅延評価の言い換えなだけな件

171:デフォルトの名無しさん
13/07/09 NY:AN:NY.AN
そうか。

172:デフォルトの名無しさん
13/07/12 NY:AN:NY.AN
Lisp in Summer Projectsに参加してる方、いますか?

173:デフォルトの名無しさん
13/07/17 NY:AN:NY.AN
日本語版のLet Over Lambdaは難しくて読めないっていうか、
読んでるとだんだんイライラしてくる。

174:デフォルトの名無しさん
13/07/17 NY:AN:NY.AN
気合で読んだぜ

175:デフォルトの名無しさん
13/07/17 NY:AN:NY.AN
そうか。

176:デフォルトの名無しさん
13/07/17 NY:AN:NY.AN
CLOSあったらいらないよね
plamdaとか
>Let Over Lambda

177:デフォルトの名無しさん
13/07/17 NY:AN:NY.AN
まあマクロの使用例ってところじゃねーの

178:デフォルトの名無しさん
13/07/18 NY:AN:NY.AN
it this self
もうアナフォリックマクロに使えそうな名前が残ってない

179:デフォルトの名無しさん
13/07/18 NY:AN:NY.AN
下のunwind-protectのプロテクト節の部分で、ストリーム sはきちんと閉じられるでしょうか?
それとも、変数lazyが他の値に再束縛され、sがガーベジコレクトされるまで開いたままなのでしょうか?

180:デフォルトの名無しさん
13/07/18 NY:AN:NY.AN
CL-USER> (let ((s (make-string-output-stream)))
(unwind-protect
(progn
(format s "When the stream s is closed?")
(lambda () (get-output-stream-string s)))
(close s)))
=> #<CLOSURE (LAMBDA () :IN #:DROP-THRU-TAG-1) {100B8FA80B}>

CL-USER> (defparameter lazy *)

... ;いろいろやる

CL-USER> (funcall lazy)
=> "When the stream s is closed?"
CL-USER> (funcall lazy)
=> ""

181:デフォルトの名無しさん
13/07/19 NY:AN:NY.AN
そのコードだと unwind-protect から抜けた時点で close されるよ。
(close s) の直前に (format t "closed") とか入れればわかると思う。

close 済み string output stream に
get-output-stream-string したときの動作は undefined 。
処理系によっては string output stream を close しても何もおこらない。

182:デフォルトの名無しさん
13/07/20 NY:AN:NY.AN
ありがとうございました。
もやもやがすっきりしました(:-D)

183:デフォルトの名無しさん
13/07/20 NY:AN:NY.AN
:-(

184:デフォルトの名無しさん
13/07/20 NY:AN:NY.AN
:-(8-D)

185:デフォルトの名無しさん
13/07/31 NY:AN:NY.AN
common lisp処理系はエラー時に行番号を教えてくれないんだけどどうやってエラー箇所を特定すればいいの?

186:デフォルトの名無しさん
13/07/31 NY:AN:NY.AN
あやしげなとこにprint・・・

187:はちみつ餃子 ◆8X2XSCHEME
13/07/31 NY:AN:NY.AN
処理系によってはデバッグモードに突入したりするんじゃないの。
処理系によって賢い機能がある場合もあると思うので、もうちょっと詳細を書くとよいかも。

マクロがあると「行番号」で表すのが難しかったりするんだよね。
マクロ定義の方が間違ってるかもしれないし、
そのマクロ定義もマクロで生成されてるかもしんない。
エラーが発生したときにどこを示していいんだか処理系には判断付けるのが難しい。

188:デフォルトの名無しさん
13/08/01 NY:AN:NY.AN
clispとかsbclの話なんだけどちょっとした失敗なのに行を教えてくれないせいで無駄に時間食うんだよ
行番号はマクロ展開後でいいと思うんだけど何が駄目なのかな
C言語もそうだし自作処理系でもそうやったけど特に不都合はなかったな

189:デフォルトの名無しさん
13/08/01 NY:AN:NY.AN
自分が言いたいのはなにかいい方法があれば教えてくださいってことね

190:デフォルトの名無しさん
13/08/01 NY:AN:NY.AN
>>188
slime 使えば?
エラーが起こった箇所のソースに色けて
^N とか ^P でその場所にカーソルが飛んで
該当エラーの内容も表示してくれるぞ

191:デフォルトの名無しさん
13/08/01 NY:AN:NY.AN
>>188
slime 使えば?
エラーが起こった箇所のソースに色けて
^N とか ^P でその場所にカーソルが飛んで
該当エラーの内容も表示してくれるぞ

192:デフォルトの名無しさん
13/08/01 NY:AN:NY.AN
それはslime-compile-defunでコンパイルした時のことなの?
自分はslime-eval-defunで評価してそれをreplから実行してたんだけど
それよりコンパイルしたほうがいいのかな

193:デフォルトの名無しさん
13/08/02 NY:AN:NY.AN
関数コンパイルするタイミングでコードの位置覚えてくれるんで、
編集中やデバッグ中に定義してる位置にジャンプしたりできる。

てーか、マクロ展開後の行番号とか教えられたりしても途方に暮れるだけだと思うな。
Seriesとか試せば分かるけど、とんでもない行数に展開されることとかあるし。

行番号なくてもスタックトレースあるからそれでコンディション発生した関数は分かる。
あとは適当な位置にbreakつっこんで止めたり、printで出力したりすりゃ結構すぐ分かるよ。

194:デフォルトの名無しさん
13/08/02 NY:AN:NY.AN
>>187
処理系によっては、じゃなくて、Common Lispは規格でデバッガの存在が要求されてる。
ブレークポイントとかステップ実行とかディスアセンブラとかも同様。

195:はちみつ餃子 ◆8X2XSCHEME
13/08/02 NY:AN:NY.AN
>>194
存在が要求されてるのは知ってたけど、
挙動がどの程度細かく規定されてるのかは知らなんだ。
ステップ実行まであるのか。 CL さんマジかっけー。

196:デフォルトの名無しさん
13/08/03 NY:AN:NY.AN
common lisp
slimeいれておおすごいと思った所で熱が覚めて辞めてしまい1年ほど経過

マクロとか使いこなせると楽しいんだろうけれど、何かそのために面白い題材とか無いものか

197:デフォルトの名無しさん
13/08/04 NY:AN:NY.AN
何も言わずにOn Lispを読み通せ

198:デフォルトの名無しさん
13/08/04 NY:AN:NY.AN
プログラミングのために本読むの嫌いだけど読むか・・

199:デフォルトの名無しさん
13/08/04 NY:AN:NY.AN
ふつーにwebアプリ作るといいよ。動的に変更できるのが面白い。

200:デフォルトの名無しさん
13/08/05 NY:AN:NY.AN
lispbox入れて始めてみたんだが、
コンパイルして関数を実行したら日本語が文字化けする
普通にslimeに直に入力したら日本語でも出力されるのに
こんな状況
i.imgur.com/A0pGoRn.png

201:デフォルトの名無しさん
13/08/05 NY:AN:NY.AN
Shift JIS を使うのは情弱

202:デフォルトの名無しさん
13/08/06 NY:AN:NY.AN
Allegro CLをEmacsからfi:common-lispで使っても日本語が文字化けする
なんでだろう

203:デフォルトの名無しさん
13/08/07 NY:AN:NY.AN
URLリンク(jp.franz.com)
ここら辺は読んだ?

204:デフォルトの名無しさん
13/08/07 NY:AN:NY.AN
>>203
直接alispを起動して日本語のシンボルや文字列を扱うのは問題ないんだ

205:デフォルトの名無しさん
13/08/07 NY:AN:NY.AN
URLリンク(fast-uploader.com)
こんな感じ

206:デフォルトの名無しさん
13/08/07 NY:AN:NY.AN
URLリンク(www.geocities.co.jp)
設定はこんな感じなの?

207:デフォルトの名無しさん
13/08/07 NY:AN:NY.AN
>>206
うん 一番下のset-buffer-process-coding-systemが怪しくて消したりしたけど
起動した時のメッセージが微妙に変わったくらいだった

208:デフォルトの名無しさん
13/08/07 NY:AN:NY.AN
;;; Note: The emacs-mule external-format, used to transmit international (non-ascii) characters for the emacs-lisp interface, is not being loaded due to lack of heap space in this
;;; Lisp session.
起動した時にこんなメッセージ出るんだけど英語苦手でよくわからん
なんかexpress版だとヒープ領域の制限で日本語化は無理とかかな

209:デフォルトの名無しさん
13/08/07 NY:AN:NY.AN
clojureのREPL使っている人がいて
分からない関数carがあったら
(doc car)としてポンポン調べていたのですが
common lispにはこういう関数ありませんか?

210:デフォルトの名無しさん
13/08/07 NY:AN:NY.AN
(documentation 'car 'function)

SLIME使ってたらキー操作でHyperSpec引ける

211:デフォルトの名無しさん
13/08/08 NY:AN:NY.AN
>>210
2画面で片方ブラウザにしてるんだけど、新規タブでばんばん開いちゃうのやめる方法ないかしら

212:デフォルトの名無しさん
13/08/08 NY:AN:NY.AN
firefoxみたいに引数で新規タブかどうか指定できるブラウザ使うか、w3使うか。

213:デフォルトの名無しさん
13/08/11 NY:AN:NY.AN
(setq x 1 y 2 z 3)
(defun arg-test (x y z) (eval '(list x y z)))
(arg-test 4 5 6)

;=>(1 2 3)

どうしてレキシカル変数はevalの中から見えないのですか?

214:デフォルトの名無しさん
13/08/11 NY:AN:NY.AN
evalは一番外の環境を使って評価するんじゃなかったっけ

215:デフォルトの名無しさん
13/08/11 NY:AN:NY.AN
>>213
HyperSpec のevalのとこに書いてるよ
何故そうなってるか、という質問だとおれは答え難いなぁ。そんなものだ、と思って使ってた。詳しい人解説ヨロシク

216:はちみつ餃子 ◆8X2XSCHEME
13/08/11 NY:AN:NY.AN
前スレの 407 から 414 あたりで同じような話題が出てるよ。

217:213
13/08/12 NY:AN:NY.AN
>>214,215,216
ありがとうございます。
前スレ見ました。最適化をしやすくするためにローカル環境を使わないようですね。
ちょうど去年の今頃の自分のレスでした。

(ICFPの時だ(そして今も))

218:デフォルトの名無しさん
13/08/12 NY:AN:NY.AN
なんだと?

219:デフォルトの名無しさん
13/08/12 NY:AN:NY.AN
お前は相変わらず成長しないな

220:デフォルトの名無しさん
13/08/12 NY:AN:NY.AN
ワロタ
そんなことあるもんなんだな

221:デフォルトの名無しさん
13/08/13 NY:AN:NY.AN
eval はあんまり使ったことないな

222:デフォルトの名無しさん
13/08/16 NY:AN:NY.AN
(find-if (lambda (lst) (find-if #'oddp lst)) '((2 4 6 8) (2 1 3)))
;=> (2 1 3)

ここで1を返すにはどう書くのがよいでしょうか?

223:222
13/08/16 NY:AN:NY.AN
(defun trec (rec &optional (base #'identity))
  (labels
    ((self (tree)
       (if (atom tree) (if (functionp base) (funcall base tree) base)
           (funcall rec tree
                    #'(lambda () (self (car tree)))
                    #'(lambda () (if (cdr tree) (self (cdr tree))))))))
    #'self))

224:222
13/08/16 NY:AN:NY.AN
(defun find-if-rec (fn lst)
  (funcall (trec
            #'(lambda (obj left right) (or (funcall left) (funcall right)))
            #'(lambda (leaf) (and (funcall fn leaf) leaf)))
           lst)

(find-if-rec #'oddp '((2 4 6 8) (2 1 3)))
;=> 1

出来ました

225:デフォルトの名無しさん
13/08/16 NY:AN:NY.AN
いきなりそっちにいくのか(困惑)

226:222
13/08/16 NY:AN:NY.AN
そっち、とはもっと単純な方法があったということでしょうか

227:デフォルトの名無しさん
13/08/16 NY:AN:NY.AN
素直に書くと(まあいっしょだけど)初学者的にはたぶんこうなるだろうと思ってたけど
(defun find-if-rec (fn tree)
(cond
((null tree) nil)
((atom tree) (when (funcall fn tree) tree))
(t (or (find-if-rec fn (car tree))
(find-if-rec fn (cdr tree))))))

いきなり抽象度がひとつ上のtrecが出てきたので

228:デフォルトの名無しさん
13/08/20 NY:AN:NY.AN
ちょっとお尋ねします。arrayの一部を新たにarrayを作らずに切り出すことってできないんでしょうか?
新たにnewしないで、もとのarrayを直接参照するsubseqを探しているんですが、そういったものはないんでしょうか?

229:デフォルトの名無しさん
13/08/20 NY:AN:NY.AN
元のリストが(0 1 2 3 4)だったとして、これはデータ構造を正確に表すと
(0 . (1 . (2 . (3 . (4 . nil)))))となっている。
(setq lst (list 0 1 2 3 4))
(subseq lst 1 4)
とすると
(1 2 3)が帰ってくるが、このデータ構造は
(1 . (2 . (3 . nil)))である。
この構造は元の構造に含まれていないため、切り出すということができない。

230:デフォルトの名無しさん
13/08/20 NY:AN:NY.AN
と書いてみたがarrayの話か・・

231:デフォルトの名無しさん
13/08/20 NY:AN:NY.AN
あれ~?

232:デフォルトの名無しさん
13/08/20 NY:AN:NY.AN
>>230
レスありがとうございます。そうなんです、arrayの話なんです。

>>231
(^^;

とりあえず、自己解決しました。
displaced-arrayでいけそうです。make-arrayのオプションとは、盲点でした。

233:デフォルトの名無しさん
13/08/21 NY:AN:NY.AN
緑のモンスターの本買いました。
コーディングは適当なエディタに書いてclispにペースト実行ってやってるんですが、もっといいやり方ないですか?
Emacsにslime?がいいのですかね?

234:デフォルトの名無しさん
13/08/22 NY:AN:NY.AN
鉄板→emacs&slime

235:デフォルトの名無しさん
13/08/22 NY:AN:NY.AN
>>233
slime の環境は quicklisp というライブラリ管理ツールを使って簡単にできるよ

236:デフォルトの名無しさん
13/08/22 NY:AN:NY.AN
>>234
おお、やっぱりこの組み合わせが1番なんですね。
本読んでると特にそのあたりの記載がなくて、最初はTerminalからclisp立ち上げて直に長文コード打ってました。(コピペで、ですが)
emacsでコード書いて保存してslimeで実行って感じがデファクトなんでしょうか?

>>235
quicklisp初めて知りました。これは管理が楽になりそうでいいですね。
私の環境はMacなのでbrewでclisp入れてますが、slime使うなら管理も含めてquicklispがいいですね。移行します。
ご教示ありがとうございました。

237:デフォルトの名無しさん
13/08/23 NY:AN:NY.AN
(defun add (x y)
(+ x y))←ここでctrl+xを押し、ctrl+eを押すと関数が定義される

(add 8 5)←ここでctrl+xを押し、ctrl+eを押すと13が表示される

書きながらどんどん実行していく。

238:236
13/08/23 NY:AN:NY.AN
>>237
便利過ぎて鼻血が出ました。
これでLisp本がさくさく進められます!!ありがとうございました!

239:デフォルトの名無しさん
13/08/23 NY:AN:NY.AN
sbcl 1.0.55.0でquicklispからcxml-stpを使おうとしたんだけど、
次がコンパイルできないんですが同じ症状の人いますか?

(eval-when (:compile-toplevel :load-toplevel :execute)
(ql:quickload :cxml-stp))

240:デフォルトの名無しさん
13/09/02 23:22:36.07
CommonLisp初心者なんですけど
Clojureの->みたいのを実装したいのですがどうやったら綺麗に書けますか?

想定してる動作としては
(-> '(10 20 30) (mapcar #'1+ _) car 1+)
;; => 12

書いてみたのですがあと一段階…
(defmacro -> (&amp;body forms)
``(let* ,(mapcar #'(lambda (f) (if (symbolp f) (list '_ (list f '_)) (list '_ f))) ',forms)
_))
;; => (LET* ((_ '(10 20 30)) (_ (MAPCAR #'1+ _)) (_ (CAR _)) (_ (1+ _))) _)

241:デフォルトの名無しさん
13/09/03 00:16:45.86
(defun build-> (forms)
(reduce (lambda (acc form)
(if (listp form)
`(,(car form) ,acc ,@(cdr form))
(list form acc)))
(cdr forms)
:initial-value (car forms)))

(defmacro -> (&body forms)
`(progn ,(build-> forms)))

間違ってたらめんご

242:デフォルトの名無しさん
13/09/03 00:25:33.20
マクロ部分はこっちに直して
(defmacro -> (&body forms)
(build-> forms))

243:デフォルトの名無しさん
13/09/03 00:40:36.25
>>241
thx. やっぱ愚直に書くべきなのかな

M.Hiroi's Home Pageに載ってるlet*の実装を参考にして
書き直したら一応解けたかも?
(defmacro -> (&body forms)
(let ((_ (if (symbolp (car forms)) (list (car forms) '_) (car forms))))
(if (null (cdr forms))
`(let ((_ ,_)) _)
`(let ((_ ,_)) (-> ,@(cdr forms))))))

244:デフォルトの名無しさん
13/09/03 00:56:02.27
挿入する場所を選べんのかそれならこうだ
(defun build-> (forms)
(reduce (lambda (acc form)
(if (listp form)
(substitute acc '_ form)
(list form acc)))
(cdr forms)
:initial-value (car forms)))

245:デフォルトの名無しさん
13/09/03 20:23:25.95
githubのclojure/src/clj/clojure/core.cljにある->のソースを参考にしたら、こんなんなった。
(defmacro -> (x &amp;body forms)
(cond ((null forms)
x)
((null (cdr forms))
(let ((first (car forms)))
(if (consp first)
`(,(car first) ,x ,@(cdr first))
`(,first ,x))))
(t
`(-> (-> ,x ,(car forms)) ,@(cdr forms)))))

246:デフォルトの名無しさん
13/09/03 20:26:17.89
->>は、こんなんなった。
(defmacro ->> (x &body forms)
(cond ((null forms)
x)
((null (cdr forms))
(let ((first (car forms)))
(if (consp first)
`(,(car first) ,@(cdr first) ,x)
`(,first ,x))))
(t
`(->> (->> ,x ,(car forms)) ,@(cdr forms)))))

247:デフォルトの名無しさん
13/09/03 22:44:20.74
>>222
大分おそくなったちゃったけど、こんなのはどうだろう。

(some (lambda (lst) (find-if #'oddp lst)) '((2 4 6 8) (2 1 3)))
=> 1

248:デフォルトの名無しさん
13/09/05 21:25:01.23
someとfind-ifって同じ?

249:デフォルトの名無しさん
13/09/05 22:44:31.71
ざっくり言うと、find-ifはpredが非nilとなる`要素'を返す。
一方、someはpredが非nilとなる要素が存在したら、`非nil'を返す。

(find-if #'oddp '(2 4 6 1 8)) => 1
(some #'oddp '(2 4 6 1 8)) => T

250:デフォルトの名無しさん
13/09/07 23:29:00.66
Maximaで黄金比を計算しようと思って
(%i1) cf((1+sqrt(5))/2), cflength=3;
と入力したら
(%o1) [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2]
と表示されてしまいます。
これって最後は1にならなきゃおかしいですよね。
バグですか?

251:デフォルトの名無しさん
13/09/08 11:06:49.39
>>250
仕様です。
その式、マニュアルにそのまま出てます。
URLリンク(maxima.sourceforge.net)

252:デフォルトの名無しさん
13/09/08 15:22:56.42
仕様というか、例としてはそうなっているけど、なぜ2にしているかの理由は書いてないんじゃね?

253:デフォルトの名無しさん
13/09/11 04:26:19.84
clojureのthreading macroってquicklispにあったりしませんか?
threadなどで検索をかけてもこれといってひっかかるものがありません

254:デフォルトの名無しさん
13/09/11 08:01:21.21
>>253
threading macroって -> と ->> のことでいいのかな。
それなら以下のパッケージに含まれているようです。

quickdocs.org/cl-arrows/
quickdocs.org/backports/

255:デフォルトの名無しさん
13/09/11 23:19:11.68
>>254
ありがとうございます
clojureと挙動が少し違いましたがcl-arrowsが使えそうです
backportsも試してみたかったのですがquickloadがコケるのであきらめました

256:デフォルトの名無しさん
13/09/12 22:08:33.23
quickutilにも、->と ->>があったらいいな。

257:デフォルトの名無しさん
13/09/13 01:42:41.16
CLにclojureの#()やschemeのcutのようなものってありますか?

258:デフォルトの名無しさん
13/09/13 05:38:54.24
Lisperはこの世のごみ屑
今すぐ消えるべし

259:デフォルトの名無しさん
13/09/13 07:32:11.22
>>258
俺は特定のLisperにネタミがあるがおまえは一体何が原因でそんなことを言ってるんだ?

260:デフォルトの名無しさん
13/09/13 07:59:09.35
そういうbotなんだよ

261:デフォルトの名無しさん
13/09/13 19:03:33.23
>>257
CLの規格には無いけれど、
ユーティリティライブラリの ARNESI に SHARPL-READER というリーダーマクロがあります。

common-lisp.net/project/bese/docs/arnesi/html/api/function_005FIT.BESE.ARNESI_003A_003ASHARPL-READER.html

こんな風に使うみたい。

(arnesi:enable-sharp-l-syntax)
(mapcar #L(* !1 !2) '(1 2 3) '(4 5 6)) ;=> (4 10 18)

262:デフォルトの名無しさん
13/09/13 20:58:10.94
>>259
ああいう人は心の病気なんだから専門家に丸投げして関わらない方がいいとおもうなー

263:デフォルトの名無しさん
13/09/14 14:56:52.03
>>261
さんくす!

しかしこういうのが外部にしかないということはCL書く人は毎回lambdaを書くということなんでしょうか

264:デフォルトの名無しさん
13/09/14 17:51:46.45
Land of Lispの最難関はどう考えても環境構築

265:デフォルトの名無しさん
13/09/14 22:34:58.88
Win8+CLISP+emacs+SLIMEでやってる人っていますか?
CLISPとemacsのインストール後emacsのsite-lisp(?)フォルダにslimeをリネームしてコピーまではしたもののその後がわかりません。
ユーザーフォルダの奥の方にあるinit.elがWindowsではemacsの設定として扱われる、ということまでは調べました。

266:デフォルトの名無しさん
13/09/14 23:05:11.94
そのレベルで詰まってるなら
lisp box使ってみたら?
URLリンク(common-lisp.net)
win8で動くかわからないけどね

267:デフォルトの名無しさん
13/09/15 02:44:41.82
double-float の simple-vector が作れないのは何で?
ついでに float の simple-vector に
double-float の値、例えば 0.0d0 を代入できてしまうのは何で?

268:デフォルトの名無しさん
13/09/15 03:05:52.70
(make-array 3 :element-type 'double-float)
で作れるけど

double-floatはfloatのsubtypeだから
(subtypep 'double-float 'float)
(subtypep 'single-float 'float)
(subtypep 'double-float 'single-float)
(typep 1.0 'float)
(typep 1d0 'float)
(typep 1.0 'double-float)
(typep 1d0 'single-float)

269:デフォルトの名無しさん
13/09/15 10:44:55.93
gaucheとguileの違うところを教えてください。

270:はちみつ餃子 ◆8X2XSCHEME
13/09/15 11:02:18.21
>>269
ここは Common Lisp スレだよ。

271:デフォルトの名無しさん
13/09/15 12:38:54.81
* (type-of (make-array 3 :element-type 'double-float))
=> (SIMPLE-ARRAY DOUBLE-FLOAT (3))

* (type-of (make-array 3 :element-type t))
=> (SIMPLE-VECTOR 3)
* (type-of (make-array 3 :element-type t :initial-element 0.0d0))
=> (SIMPLE-VECTOR 3)
* (type-of (apply #'vector '(1 1.0d0 "42" #p"tmp.lisp")))
=> (SIMPLE-VECTOR 4)

272:デフォルトの名無しさん
13/09/15 12:47:28.34
sbclとcclでは上のようになりました。
しかし、clispでは
[1]> (type-of (make-array 3 :element-type 'double-float))
(SIMPLE-VECTOR 3)
となります。
一体全体どうゆうこったい??

273:デフォルトの名無しさん
13/09/15 13:07:50.90
型指定の類は最適化のヒントでしかないから、処理系によっては無視される。
clisp はあんまり最適化してくれない処理系。

274:267
13/09/15 13:25:28.67
ええと sbcl だと

(describe (make-array 3 :element-type 'double-float))
=>
#(0.0d0 0.0d0 0.0d0)
[simple specialized vector]

で simple vector でないみたいで

(svref (make-array 3 :element-type 'double-float) 1)

でエラーになってしまう。大量の代入をすると float なら cと遜色ないんだけども。
double-float だと2-3倍時間がかかるので気になっている

つまるところ >>273 が答えってことかな

275:デフォルトの名無しさん
13/09/15 13:30:14.10
>>272
要素型が t (任意のオブジェクト) 以外の simple-vector は存在しません。

> The type of a vector that is not displaced to another array, has no fill
> pointer, is not expressly adjustable and is able to hold elements of any
> type is a subtype of type simple-vector.
URLリンク(clhs.lisp.se)

要素型が特定されていると simple-vector の定義を満たしません (SBCL, CCLの場合)。

CLISPでは :element-type 'double-float という型情報は無視されて、要素型が t の
ベクタが作られています(理由は>>273の通り)。なので type-of は (SIMPLE-VECTOR 3)
を返しますが、「要素型が double-float の simple-vector」が作られているわけで
はありません。

CLISP> (array-element-type (make-array 3 :element-type 'double-float))
;=> T
SBCL> (array-element-type (make-array 3 :element-type 'double-float))
;=> DOUBLE-FLOAT

276:デフォルトの名無しさん
13/09/15 15:27:22.95
ありがとうございます!
simple-vectorと型要素の関係がすっきりしました。
clispがあまり最適化してくれない、というのも勉強になりました。

277:デフォルトの名無しさん
13/09/15 16:04:58.89
macroを勉強したいんですがon lispとlolがやはり定番なんでしょうか?

278:デフォルトの名無しさん
13/09/15 16:25:38.78
LOLでは「マクロを構築する上で、良いリファレンスやチュートリアルはほとんどない。Paul GrahamのOn Lispはその例外の1つである。」って書いてあるね

279:デフォルトの名無しさん
13/09/15 19:59:38.09
>>274
> でエラーになってしまう。大量の代入をすると float なら cと遜色ないんだけども。
> double-float だと2-3倍時間がかかるので気になっている
ここん所, 今一, 意味不明だけど解決したのかな?

# (declare (optimize (spped 3) (safty 0) (debug 0))) とかやれば
# 真面目なコンパイラなら (aref foo bar) は inline 展開なんじゃね?

280:デフォルトの名無しさん
13/09/16 19:11:10.11
>>266
動きました、ありがとうございます。
これでいちいちTerminalに一文字も間違えないように打つことから解放されました。
Land of Lisp もサクサク進められそうです。

ところでこのlispboxはClozureという処理系を利用していると書いてありましたが、CLISPと何か違いはあるのでしょうか?
Land of LispではCLISPを前提としているので。

281:デフォルトの名無しさん
13/09/17 01:09:39.63
common lispで名前空間にユーザー側で別名をつける機能ってありますか?
clojureみたいに
(require 'alexandria :as 'alex)
alex:alist-plist
のように機能を探してます。

>>280
land of lispの範囲だと少なくともサーバのソケット周りが違うんじゃないかな、clisp使うか、ningleとかusocket使ってサーバ書き直すとかしなきゃいけないじゃない
本持ってないけど、サンプルコード感じだと他はclosure clでも動くんじゃない?

282:デフォルトの名無しさん
13/09/17 06:55:03.39
>>281
そういう機能は無いけど、rename-package と package-nicknames を使えば
定義済のパッケージにあとから別名を追加できます。
(package-names の戻り値のリストに新しい名前を cons したものを rename-package の第三引数にする)。

逆引きCommon Lispに書いてみたので宜しければどうぞ。
URLリンク(tips.lisp-users.org)

283:デフォルトの名無しさん
13/09/17 09:01:55.23
>>282
ありがとうございます。
例示していただいたコードをSBCLで使うと、
sb-ext:symbol-package-locked-errorで怒られるのでちょっと変更しました。

(defun add-nickname% (nickname package)
(rename-package package
package
(cons nickname (package-nicknames package))))

(defun add-nickname (nickname package)
(sb-ext:unlock-package package)
(unwind-protect (add-nickname% nickname package)
(sb-ext:lock-package package)))
----------------------------

* (package-nicknames :alexandria)
-> ()
* (package-nicknames (add-nickname :al :alexandria))
-> ("AL")

284:デフォルトの名無しさん
13/09/17 17:59:12.85
>>283
ありゃ。確認不足でしたすみません。

次のような記事もありましたが、壊れていて動きませんでした。
こちらはリーダーマクロで実現しようとされているようです。

common-lisp - Common LispでClojure-likeなnicknameを使いたい話 - Qiita [キータ]
URLリンク(qiita.com)
URLリンク(gist.github.com)

処理系依存ですが、SBCLには add-package-local-nickname という関数がありますね。
URLリンク(www.sbcl.org)

285:デフォルトの名無しさん
13/09/17 19:02:41.80
Lisperはこの世のごみ屑
早く死滅せよ

286:デフォルトの名無しさん
13/09/18 00:56:24.36
cl-annotと組み合わせてadd-nicknameを使ってみます。
(cl-annot:enable-annot-syntax)

(cl-annot:defannotation nickname (nick quickload-form)
(:arity 2 :inline t)
`(add-nickname ,nick (car ,quickload-form)))

@nickname :al
(ql:quickload :alexandria)

287:デフォルトの名無しさん
13/09/19 15:57:45.95
cl-dbiでtimestamp型が読み込めないよう

288:デフォルトの名無しさん
13/09/19 16:32:48.74
common lisp の room 関数は 結果を標準出力に出力しますが、標準出力ではなく変数にセットすることは可能でしょうか?

289:デフォルトの名無しさん
13/09/19 17:26:51.97
>>288
そういう場合 *standard-output* を文字列出力ストリームに一時的に差し替えてやれば、
標準出力への書き込みを文字列として取得できます。

(let ((*standard-output* (make-string-output-stream)))
(room)
(get-output-stream-string *standard-output*))

with-output-to-string マクロを使って簡潔に:

(with-output-to-string (*standard-output*) (room))

290:デフォルトの名無しさん
13/09/19 19:38:15.34
>>284
おかげさまで取得できました。

ありがとうございました。

291:デフォルトの名無しさん
13/09/19 19:39:46.57
>>289
番号まちがえました。

おかげさまで取得できました。

ありがとうございました。

292:デフォルトの名無しさん
13/09/20 20:43:58.30
Linuxで環境構築したらclisp,emacs,slimeをインストールするだけで終わった
Land of LispからLispを始める人は絶対Linuxでやるべきかと

293:デフォルトの名無しさん
13/09/20 21:49:57.07
graphvizとかも必要になるから断然Linuxのがいいよ

294:デフォルトの名無しさん
13/09/21 00:29:53.35
LispプログラマはMacよりLinuxなイメージ。
とはいえ現実にはアプリを走らせる環境と同じOSで開発するのが一番リスク少ないんだが。

295:デフォルトの名無しさん
13/09/21 14:39:52.68
land of lispを読んで環境構築しようと思ったらいつのまにかinit.elを一日中いじっていた
何をいっているかわからねえと思うが

296:はちみつ餃子 ◆8X2XSCHEME
13/09/21 15:20:00.33
よくあること。

297:デフォルトの名無しさん
13/09/21 17:28:12.20
環境構築は断然 Linux か Mac がお勧め
Win なら、VMWare Player 入れて Linux の OS から入れなおしても
充分お釣りがくるよ

298:デフォルトの名無しさん
13/09/21 17:28:38.62
今CLでマルチスレッドをやろうとしたらBordeaux-threadsなんだろうか。
ちなみに処理系はSBCL on Linux

299:デフォルトの名無しさん
13/09/22 10:52:36.33
SBCL 専用でいいんだったら, SBCL のスレッド直接使えばいいと思う

300:デフォルトの名無しさん
13/09/27 01:54:59.83
cygwin導入すらばいいだけだろ

301:デフォルトの名無しさん
13/09/27 03:39:33.10
こんなところでスラバヤ殿下に会えるとは…

302:デフォルトの名無しさん
13/10/02 17:59:30.81
clhsとcltl2の関係ってどうなってんの?教えて偉い人

303:デフォルトの名無しさん
13/10/02 19:22:06.05
clhs は正式標準で, cltl2 は標準になる前に出版されて,
cltl2 出版後の改定が反映されてないだけだと認識してるが...

304:デフォルトの名無しさん
13/10/02 21:03:41.63
横から口を挟んで申し訳ないのだけれどclhsって何ですか?

305:デフォルトの名無しさん
13/10/02 21:17:00.15
Common Lisp Hyper Sex

306:デフォルトの名無しさん
13/10/03 07:40:05.40
>>302
WikiのX3J13(URLリンク(en.wikipedia.org))の中に、まんま
Relation to "Common Lisp the Language"
という項目の説明があります。

307:デフォルトの名無しさん
13/10/03 07:53:32.13
clhshs

308:デフォルトの名無しさん
13/10/03 19:40:18.49
>>306
ありがとうございます読んでみます

309:304
13/10/03 22:50:20.33
なるほど Common Lisp HyperSpecのことでしたか

310:デフォルトの名無しさん
13/10/05 13:20:12.60
Wikipedia を Wiki と略しちゃう男の人って…

311:デフォルトの名無しさん
13/10/09 18:34:02.84
質問させてください。

「Land of LIsp」で最近Common Lispをはじめました。
この本の中で除算について以下のような記述がありました。
↓↓↓↓↓↓↓↓↓↓↓↓
4を6で割ると、答えは少数0.66666…じゃないかと思うかもしれない。
除算関数はかわりに、有理数を返すんだ。

(省略)

引数に浮動小数点が含まれていると、結果は異なったものになる。
>(/ 4.0 6)
0.6666667

先に述べたように、小数点を含んだ数(4.0)は計算を汚染し、結果も少数になるんだ。
↑↑↑↑↑↑↑↑↑↑↑↑

引数に浮動小数点が含まれている際の除算の挙動は理解できたのですが、
最終行の「小数点を含んだ数(4.0)は計算を汚染し」の
「汚染」の意味がよくわかりません。

プログラミングにおいて「汚染」とはどのような意味で使われているのでしょうか?

312:デフォルトの名無しさん
13/10/09 18:40:03.24
>>311
Land of Lispは読んでなくて手元にCommon Lispはないけど...

(/ 4 6) = 2/3
は正確な値だけど
(/ 4.0 6) = 0.66666....
は何らかの丸めの入る近似値

有理数で計算しているうちは正確な値で結果が得られるけど
少数が混じると近似値になってしまうということではなかろうかと存じます。

313:312
13/10/09 18:49:23.69
読み返したら、あまり、回答になっていなかったか。

ここでいう「汚染」というのは、上記のこれ以降近似値という
質の低いデータになってしまうということだけど、
確立されたプログラミングの専門用語ではないと思う。

Webプログラムとかでデータにユーザが入れた値が入る等
安心して使えず、そのデータから派生したデータを使う場合
セキュリティに気をつけなくてはいけないデータになることを
汚染という使い方をしたのを見たことがある。

314:デフォルトの名無しさん
13/10/09 18:55:09.68
>>311
浮動小数点数のいろんな問題を含めて汚染といっているのだろうけど、
代表的なもののひとつに桁落ちというのがあって、
(x+1/N)という実数をN回足し合わせれば必ず(N*x+1)になると期待してしまうけど、
浮動小数点数の場合、xとNがそれぞれ大きい場合にはN*xになってしまう場合があったりする。
Cなんかで数値計算をやる場合には、浮動小数点演算の特性を頭に叩き込むのがまず基本だけど、
Lispの場合は有理数が使えるんだから、速度を気にしない場面では有理数を使うべきってことではなかろうか。

315:デフォルトの名無しさん
13/10/09 19:05:48.69
有理数と浮動小数点を計算すると浮動小数点になる
全部が有理数なら計算結果も有理数で得られるが、たったの1個でも浮動小数点が混ざっていると、計算結果は浮動小数点になってしまう
安全な食材の中に、たった1つでも有毒なものが混ざっていると、結果できた料理は有毒なものになってしまう様に喩えて、汚染とかいう

316:311
13/10/09 20:34:03.34
>>312, 313
ありがとうございます。
>少数が混じると近似値に~
正確な値を清浄ととらえた上で、近似値を"汚染"と表現しているのですね。

「汚染」というのは、確立されたプログラミングの専門用語ではなく、
文脈によってニュアンスが変わると把握できました。

>>314
ありがとうございます。
>桁落ち
なるほど。桁落ちにより誤差が発生することがあるので"汚染"と表現しているのですね。
ためになります。

>>315
ありがとうございます。
>安全な食材の中に、たった1つでも有毒なものが混ざっていると~
この比喩で、納得できました。

このように考えると、313さんが教えてくれた
「Webプログラムとかで~」という用法とも、大きなズレは感じませんね。

"汚染"というのは、正しい状態を前提として不正な状態になることをいうのかなと
みなさんにいただいた内容をもとに自分なりに結論してみました。

また、何かあったら質問させてください。ありがとうございました。

317:デフォルトの名無しさん
13/10/10 00:40:52.84
汚染っていうのはヘンだろ。

318:デフォルトの名無しさん
13/10/10 00:43:25.30
値が誤差に汚され染められる

319:デフォルトの名無しさん
13/10/10 00:48:22.98
英語の contamination なんだろうけど。

純粋だったものが汚されるってニュアンスかな。

320:デフォルトの名無しさん
13/10/10 00:48:56.48
変かどうかは分からないけど、>>315の言うような意味だと思うよ。
少しでも混ざると全体がそうなってしまう。一度混ざると取り除けない。

321:デフォルトの名無しさん
13/10/10 01:11:08.17
日本語にするとおかしいね。
haskell界隈で使われる純粋と不純ってのも、日本語ではどうにも違和感がある。
不純ってのは、日本語の文脈では悪い意味でしか使われないから。

322:デフォルトの名無しさん
13/10/10 01:46:24.89
>>317
>"汚染"というのは、正しい状態を前提として不正な状態になることをいうのかなと

この理解が変でしょ。
「正しい」状態とかじゃなくて、ある種のデータはこういう内部表現をされて
います、ってそれだけのことだから。

323:デフォルトの名無しさん
13/10/10 01:55:36.45
再帰関数で相互に関数を呼んでいる場合に
ファイルをロードするとエラーメッセージ(片方の関数が存在しないと言われる)
が出てしまうのはどうやったら消えてくれるのでしょうか
動くので問題ないのですがエラーが気になるのです

324:デフォルトの名無しさん
13/10/10 03:48:38.33
あっあっ有理数汚染されちゃうっ誤差入っちゃうよぉ…

325:デフォルトの名無しさん
13/10/10 09:20:18.54
>>321
英語だって否定辞付きだろ。どうやって肯定的な意味に使うんだ。

326:デフォルトの名無しさん
13/10/10 10:26:12.15
CLで一般的かどうか知らないけど、Schemeにはは「正確数」と「非正確数」があって、
非正格数を演算した結果は非正格数になる。

327:デフォルトの名無しさん
13/10/10 11:47:50.50
正確に言えや

328:デフォルトの名無しさん
13/10/10 11:55:49.08
>>325
あの人ら、不純を悪い意味じゃなくて非純粋の意味でバンバン使うじゃん
(setq *x* (1+ *x*))
(nreverse ...)
これ全部不純な計算ね
でも、日本語で不純っていわれると、何かよこしまな悪い考えを咎められているようにも聞こえるw

329:デフォルトの名無しさん
13/10/10 13:10:02.09
その式はよこしまな悪い考えだと思う

330:デフォルトの名無しさん
13/10/10 20:52:47.95
>>328
あの人らは「んなもん使うなぼけ !!」って意思を込めて
「不純」って使ってるのかと思った。

331:デフォルトの名無しさん
13/10/10 20:59:45.69
なんで不純を理解できないんだ
前後の文と雰囲気から分かるだろ

332:デフォルトの名無しさん
13/10/10 21:10:19.06
自由変数の捉え方の問題では?
*VARIABLE* は,
「宣言した時点で新しい評価環境が発生してる」
と, 考えると別に気にならないけど
(let* (tmp)
(setf tmp (op1 ...))
(othe-opx tmp)
(setf tmp (op2 ...))
的な, 連鎖で状態を変え続けられる方が気持ち悪い

333:デフォルトの名無しさん
13/10/11 02:31:57.26
>>331
意味的に何を言いたいかは充分すぎるほど分かるけど、感覚的には全くわからんね
ああ、これまたどうしようもなく下手くそな英訳の濫用だなあとしか思わん

334:デフォルトの名無しさん
13/10/11 03:45:20.83
俺は感覚的にもよくわかるけどな
煽りじゃないけど、もっと適切な言葉があるなら知りたいから教えて

335:デフォルトの名無しさん
13/10/11 11:47:03.73
副作用

336:デフォルトの名無しさん
13/10/11 18:33:52.99
副作用ってのも違和感のある表現だが英語だとどうなってるの?

337:はちみつ餃子 ◆8X2XSCHEME
13/10/11 18:35:40.62
side effects

338:デフォルトの名無しさん
13/10/11 18:38:29.23
副作用や不純に違和感を覚えるってただ慣れてないだけだろ
何にでも突っ込みたい人なのかな

339:デフォルトの名無しさん
13/10/11 18:44:59.85
>>333
ばかなんだね
ふう

340:デフォルトの名無しさん
13/10/11 21:09:23.52
>>338
副作用はもうなれたけど、コンピュータ系のcontextで聞き出した頃は、
薬とかの副作用っていう、「悪いもの」、「必要外のもの」的な
意味合いを感じて違和感があった。

というか、むしろ、これで気づいた。副作用なんて、他にあんまり用いないし。

ただ、慣れと言われればそれまでだよね。

341:デフォルトの名無しさん
13/10/11 21:19:11.89
東山水上行

342:デフォルトの名無しさん
13/10/11 23:37:31.50
「低レベル」とかも別に悪い意味じゃないよねぇ。

343:デフォルトの名無しさん
13/10/12 04:36:52.83
いつまでも訳された日本語で考えてないで英語本来の意味で考えましょう

344:デフォルトの名無しさん
13/10/12 04:38:31.93
文脈次第

345:デフォルトの名無しさん
13/10/12 04:45:30.98
英語本来の?!
なにいってんだか
概念に日本語も英語もない
逆に英語でも日本語でも
文脈上の意味、ないし定義から離れて語素から意味を類推するというアホーなことをすることが問題。
どうも言葉自体になにかしら本来の意味があるなんて思っているやからが何人か書き込んでるな

LISP使いとしては、とっても恥曝しだぞ

346:デフォルトの名無しさん
13/10/12 09:28:06.14
>>340
「副作用」って表現は関数型の言語以外では今でも見かけない気がするが

347:デフォルトの名無しさん
13/10/12 09:33:12.96
新しい語義を翻訳する場合も、新しい語義として割り当てる努力は必要

348:デフォルトの名無しさん
13/10/12 09:56:36.40
>>346
そこらへんのプログラマは使ってなくても、標準規格における重要な用語で、
「副作用完了点」とかあるから。

349:デフォルトの名無しさん
13/10/12 14:26:15.07
>>345
英語では違和感ないのに、日本語に訳した言葉に違和感があると言ってるやつに対して言ってるだけだが?
LISPの前にまず英語と日本語勉強しろよ(笑)

350:デフォルトの名無しさん
13/10/12 14:32:06.21
>>349
わかってないのにレスするな低脳君
馬鹿はおれ、嫌いなの

351:デフォルトの名無しさん
13/10/12 14:37:56.31
>>350
指摘が全くもって的外れなの気付かないのかな?おバカさんなのかな?

352:デフォルトの名無しさん
13/10/12 14:50:31.62
>>351
だから君にはわからんって
偏差値60以下だったろ?
レスするなよ、馬鹿は嫌いなの

353:デフォルトの名無しさん
13/10/12 14:58:47.73
>>352
そんな低い偏差値の大学に通われていたのですか?
文脈の違いにすら気付かずに恥ずかしいレスをしてしまう程度なので仕方が無いですね
感情論でしか語れなくまともに議論すらできないお馬鹿さんはどちらでしょうか?
偏差値コンプレックスのお馬鹿さんは黙ってろよ

354:デフォルトの名無しさん
13/10/12 15:00:55.24
まずは朝型の生活にな

355:デフォルトの名無しさん
13/10/12 16:06:29.33
Amazonで「よこしまなきもち」で検索したらいやん

356:デフォルトの名無しさん
13/10/12 16:12:11.74
折角の休みなのに喧嘩すんなって

357:デフォルトの名無しさん
13/10/12 18:20:38.39
WindowsのLisp開発環境でお勧めはなんでしょうか

358:デフォルトの名無しさん
13/10/12 21:17:16.89
1.ちょっとLispを触ってみたい、とかならLisp Boxがとっつきやすいのではないでしょうか。
導入の仕方は検索してみてください。

2.しっかりLispと愛し合うなら、次のリンク先の動画が参考になるはずです。
[Installing Common Lisp, Emacs, Slime &amp; Quicklisp] www.youtube.com/watch?v=VnWVu8VVDbI

359:デフォルトの名無しさん
13/10/12 22:02:07.90
>>358
lispbox-0.7をインストールしてみました
Lisp環境を効率よく使うのにはEmacsが必須のようでうね・・・

360:デフォルトの名無しさん
13/10/12 22:20:05.45
windowsならlispboxとlispcabinet,どっちがいいんだろう?

361:デフォルトの名無しさん
13/10/12 23:04:59.68
>>346
昔の職場で普通にレビューとかで副作用って言葉使ってたな
関数型言語なんかの厳密な意味の副作用じゃなくて、
モジュールが何か目的以外の悪さしてるんじゃないかとかそんな意味で

362:はちみつ餃子 ◆8X2XSCHEME
13/10/13 00:02:39.88
一般用語としてなら、例えば文字を表示することを目的とした手続きで文字が表示されるのは「作用」で、
何か値が返ってきてもそれはついで (副作用) のことっていうニュアンスになるよね。

だけど、技術用語というものはそういったニュアンスを排除して定義によって意味を確定するものだから、
領域によって定義が異なるとかいうのもそういうものとして受入れるしか仕方ない。
最初に用語を決めるときに慎重に定めるべきではあるけど、後になってわかることだってあるし。

363:デフォルトの名無しさん
13/10/13 00:12:23.57
>>359
emacsは慣れるまで時間がかかるので、手っ取り早くlispいじりしたいなら、
カッコの対応表示してくれる適当なエディターで、
しこしこlisp書いてみたほうが楽しいかもしれません。
ちなみに、vim派にはslimvがあります。

ああ、そういえば、xyzzyってwindowsだったはずです。

364:デフォルトの名無しさん
13/10/13 00:45:34.08
emacsはチュートリアルに少し時間割けばわりかし早く慣れる(気がする)

365:デフォルトの名無しさん
13/10/13 00:49:53.99
emacsは好きになるまで2年ぐらいかかった

366:デフォルトの名無しさん
13/10/13 10:45:04.24
>>361
「薬の副作用」のイメージで考えてる人多いからね。
まあ、薬の副作用自体間違った言葉なんだが。

367:デフォルトの名無しさん
13/10/13 11:54:13.15
薬の方の副作用を二次作用って言うことにしよう。

368:デフォルトの名無しさん
13/10/14 01:28:12.61
初心者以前の質問で申し訳ないのですが、
Haskell でいう Hoogle, Python でいう公式の library reference のような、
標準で定義されてる関数やパッケージの総覧みたいなものとしては何を利用するのがいいでしょうか?

369:はちみつ餃子 ◆8X2XSCHEME
13/10/14 01:48:48.62
eldoc

370:デフォルトの名無しさん
13/10/14 10:55:51.04
眠くなるのが「副作用」の薬とかは、眠れないという症状がある場合、
副作用もついでに期待して使われたりするぞ。花粉症の抗ヒスタミン剤とか。

371:デフォルトの名無しさん
13/10/14 11:30:14.76
風邪はウイルス性だから抗生物質飲んでも治らないけど、
痰を切って喉をスッキリさせることを目的として処方されたり場合もあるしな。

372:デフォルトの名無しさん
13/10/14 11:38:59.09
>>355
アカウントログイン状態で検索しちまったじゃねぇかwwwwww
この本を検索した人はのこの本にLispとかプログラム関係の本ばっかりの中にシマシマパンツが出てくるようになったらどないすんねんwwww

373:372
13/10/14 11:40:18.04
ちなみに期待したのは猫関係の本だった

374:デフォルトの名無しさん
13/10/14 12:06:55.50
不純Lisp

375:デフォルトの名無しさん
13/10/14 13:10:09.97
>>368
次の2つが便利です。
上はプリントアウトして、下はslimeでC-c C-d hで。

* [clqr: Common Lisp Quick Reference](エッチテテピー//clqr.boundp.org/)
* [clhs: Common Lisp Hyper Spec](エッチテテピー//quickdocs.org/clhs/)

376:デフォルトの名無しさん
13/10/14 13:18:09.15
Common Lispで何か作りたいのですが
面白いアイデアてありますか?

377:デフォルトの名無しさん
13/10/14 13:35:40.00
URLリンク(www.slideshare.net)
ネット上に転がってるやってみたを習作してみると、要望が来るかもよ

378:デフォルトの名無しさん
13/10/14 18:04:11.67
>>369
>>375
ありがとうございます!

379:デフォルトの名無しさん
13/10/18 23:05:03.66
Mac に SBCL を コンパイル&インストールしています。
しかし途中で警告が出てしまいます。

自分でもネットで調べたりしましたが、この警告がなぜ発生するのかわかりません。(英語力の問題かもしれませんが)
この警告はなぜ発生するのでしょうか。

環境: OS:OS X 10.8.5, SBCL:1.1.12

<警告内容>
$ sudo sh make.sh
.... 途中省略
WARNING! Some of the contrib modules did not build successfully or pass
their self-tests. Failed contribs:"
sb-posix

380:デフォルトの名無しさん
13/10/18 23:33:44.99
>>379
Mac Ports とか使ったら

381:デフォルトの名無しさん
13/10/19 00:12:41.60
>>379,380
Brewの方が、Mac Portsに比べて、無関係のものを毎回入れないから楽。

382:デフォルトの名無しさん
13/10/19 17:14:01.48
>>380
>>381
ありがとうございます。
HomeBrew でインストールしました。

悩んでイライラしていたのが嘘みたいにあっさりインストールできました。
ありがとうございました。

383:デフォルトの名無しさん
13/10/22 19:47:20.58
Common Lispでmysql操作のサイト、書籍
などありますか?

384:デフォルトの名無しさん
13/10/22 23:29:24.61
URLリンク(github.com)
clのwmだって

385:デフォルトの名無しさん
13/10/22 23:43:20.30
URLリンク(blog.8arrow.org)
なんかDB操作のライブラリ作ってるようだ

DBまわりはRailsだなんだと使っていると、migreteとcrudとARぐらいは欲しいなとおもってしまう。

386:デフォルトの名無しさん
13/10/23 06:20:25.03
>>384

新しいのが、また出来たのかと思ったら、

> DSWM is a fork of StumpWM

じゃん。

URLリンク(dss-project.org)

387:372
13/10/23 14:56:19.56
>>384
WMをワードマスターと読んでしまって涙目
リンク先みるまでWindow Managerとは思わなかった。

clとかでGenericなエディタとかどうやって作るんだろうって思って昔のLispエミュとか見てるのだけど、そういうのにはむいてないよね。(Cursesとかの世話になるって意味ね)

388:デフォルトの名無しさん
13/10/23 15:20:16.85
>>387
>clとかでGenericなエディタとかどうやって作るんだろうって思って昔のLispエミュとか見てるのだけど、そういうのにはむいてないよね。(Cursesとかの世話になるって意味ね)

その論調だとcursesがC言語で実装されてるから、C言語以外はエディタ作るのに向いていないってことになんじゃね?

389:デフォルトの名無しさん
13/10/23 16:16:54.40
>>385
ありがとうございます。
他にないですか?

390:デフォルトの名無しさん
13/10/23 18:06:41.05
>>389
//clsql.b9.com/
//d.hatena.ne.jp/yuki_neko_nyan/20070901/clsql
//blog.8arrow.org/entry/20120130/1327926575
//www.hackinghat.com/index.php/cl-mysql

391:デフォルトの名無しさん
13/10/23 19:02:43.14
>>390
ありがとうございます。

392:デフォルトの名無しさん
13/10/25 11:23:11.42
Common Lispでリズムマシンみたいなものをつくろうとしているのですが、
0.1ミリ秒ほどの分解能があるタイマーって存在するんでしょうか?

393:デフォルトの名無しさん
13/10/25 12:40:12.91
OSとか処理系を書かないと答えられないんじゃないか?

それと余計なお世話なんだけど、”Common Lispでリズムマシン”を作ることに意味があるならいいけど、リズムマシンを作ってみたいだけならpuredataとかを検討したほうがいいんでないかい?

394:デフォルトの名無しさん
13/10/25 15:20:17.28
>>393
すみません
書いてませんでした

処理系はClozure CLで、OSはLinuxです
Windowsでも利用可能なら、そのほうがいいかなという感じです

最終的にMIDIシーケンサに発展させるつもりでおり、その習作という位置付けです
Common Lispを選んだのはシュミですが…

395:デフォルトの名無しさん
13/10/25 17:24:45.69
一番ユーザが多いとであろうと思うcommon lispの処理系って何なの?
できれば根拠というかアンケートサイト何かを示してもらえば嬉しいが


次ページ
最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch