【入門】Common Lisp その10【質問よろず】
2 :
デフォルトの名無しさん:2013/02/21(木) 00:11:50.65
< `∀´>ニダー
初心者です
小心者です
NetwalkerにCL乗せたいなぁ
ポケットサイズのlispマシン欲しい
>>7 Netwalkerは普通のlinuxマシンじゃないの ?
Vaio Pとかいろいろ買ったけど
Macbook Airが一番無難で可搬性の高いUnix(lispの動くプラットフォーム)
なんじゃないかと現状思う。
AndroidがLinuxだと思ってNECのLife Touch Note買ったけど
shellなくてわろた
9 :
8:2013/02/21(木) 23:02:51.05
8はNetwalkerは普通のLinuxだからCommon Lispは簡単に
インストールできるんじゃないの ?という意味で書きました。
わかりにくい書き方ですみません
common lispの入門にon lispを読んでるんだけどしらない関数ばかりで入門には向いてない気がしてきた
他に系統的に学べるサイトはないかな
本ってどの言語にしてもそこそこ自力で何か書けるレベルで読まないとあんまり続かない気がする
practical common lispをさっと読んでからCLtL2を読み始めるとよいと思う
英語読めないから本買わないと駄目なのか
結構値がはるしキツいな
ちょっと前最初のほうだけ英語で読んでみたけど
そこまで難しい英語じゃなかったので
読もうと思えば読めるレベル
>>11 その点手続型言語は基本的な文法をちょろっとやれば
そこそこ自力で書き始められて、壁にぶち当たったら本を読んで、
とできるけど、lispはそれが難しかった
他にもともと別の手続き型言語を知ってたとかではなくて?
最初はcar、cdrとか再帰だけで色々練習問題解いてたけど
それだけでも色々できて面白かったけどなあ
>>15 手続き型・・・小学校で習う表記に似てるからじゃね?
おれはPAIPを勧めるがなぁ。
あと、lisp をできるようになりたいだけなら日本語版でもいい。でも、凄いエンジニアになりたいのなら、英語力は必須だよ。
逆に考えればlispと英語が同時に学べるチャンスだ。
21 :
10:2013/02/23(土) 13:58:28.39
>>20 やっぱりこれがいいのか
読んでみる、ありがとう
緑のナマモノ本、Amazonで発売日に在庫切れか
でもまさか予約分しか入荷して無かったってオチじゃないよな
そんなもんじゃない?発売当日に在庫ありになってないのは珍しくない
予約してた人は今日届くのかな
予約してたけど届くには月曜…
新宿の紀伊国屋とかに行けばあるかな。
しかし正直コードのある本は電子書籍で出してほしい。
emacs + slime の環境なんですが
C-c C-d h と同じことを他のライブラリでやれるようにするものってありませんかね?
27 :
デフォルトの名無しさん:2013/02/24(日) 13:14:51.50
木のそれぞれの値を2倍にする関数を教えてください。。。
(mapcar #'(lambda (x) (* 2 x)) '((1 2) 3))
的な。
初心者の俺が練習がてら書いてみた
破壊的変更よく知らないので戻り値で返す
(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)))
再帰で呼び出す関数名が間違ったままだった・・・
(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)))
>>26 ドキュメント方面で共通の仕組みがdocstringくらいしかないから、
C-c C-d dくらいしかないと思う。CCLだとdocstring表示されんけど。
それ以上が欲しいならレッツ自作。
>>27 自分が知る限りない。レッツ自作。
MaximaがLispで書かれていると聞いてちょっと感動した
>>27 初心者の俺も練習がてら書いてみた。
(defun 2bai-2bai (node)
(if (consp node)
(mapcar #'2bai-2bai node)
(* node 2)))
(2bai-2bai '(1 (2 5 (10 30)) 3))
>>27 (defun f (x)
(if (listp x)
(mapcar #'f x)
(* 2 x)))
(mapcar #'f '((1 2) 3))
なるほどmapcarで再帰するなんて方法があるのか・・・
> mapcarで再帰する
定石だと思うぞ
mapcarとかreduceとか既存のものを利用していかに楽するかを考えるんだ。
働きたくないでござる。早くニートになりたい。
他人のソースを殆ど見ないので全然定石を知らないなあ
38 :
デフォルトの名無しさん:2013/02/24(日) 19:38:17.41
>>29,30,32,33
ありがとうございます!
mapcarで再帰は自分も知らなかったので眼から鱗です。
よくある木の再帰だと思うけど
マクロとかXMLとかの処理を書くときに嫌ってほど出て来るな。
Land of Lisp原著持ってたから立ち読みで済ませるつもりだったのだけど
リストリテラルを書きかえるのはよくないって注に書いてあって
ドキっとしたのでついレジに持っていってしまった
あと訳した人が元ヤンキーである可能性が微レ存
はぁ?Shiroさんだぞ?
45 :
41:2013/02/28(木) 01:27:01.72
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 :
デフォルトの名無しさん:2013/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))
;; )) ;という風に前者と違って`が消えたものが挿入されるのは何故なのでしょうか?
無駄がない形に最適化してくれてるんじゃないの。知らんけど。
50 :
デフォルトの名無しさん:2013/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)))))
`(`(,a))は`((,a))と等価じゃなくね?
(let ((a "hoge"))
(list 'ほら `((,a)) `(`(,a))))
;=> (ほら (("hoge")) (`(,A)))
``(,,@parameter)が
`(`(,A ,B) `(,C ,D) `(,E ,F))にならずに
`((,A ,B) (,C ,D) (,E ,F))になるのってどうなんだろう。
そのコードは後者の挙動を前提にしているような。
わけがわからないよ
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と似たようなもんだと思うんですけど..
>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 :
ハツネツ:2013/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
先輩方すげっwww
簡単にできちゃうのか。。
なんでこういう方向でいかないんですかね?
今のoop慣れした世代にはこっちの方が親近感あるから
とっつきやすいと思うんだけど
マクロは大勢で共同作業するときには C++ のテンプレート並みに諸刃の刃ぁぁぁ
なんです
諸刃の剣っていいたかったのか?
テンプレよりもオペレータオーバロードによくたとえられる気がするけど
何の蓄積もないところからってことになると統制がとれないだろうけど、
デファクトスタンダードになりうるクラス指向ライブラリがあれば、それなりに使う人もいるんじゃね?
フィボナッチ数列を行列のべき乗で求めるやつ書いてみたら
なかなかあほっぽくなっとるからかっちょよく書いとくれ
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/
>>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)))
CLはマルチパラダイム言語というが、
いったんCLOSの機能を使い出すと副作用でまくりで
関数プログラミングとの共存など不可能のように思える。
純粋関数型パラダイムはちょっと特殊だからなぁ
>>65 式と文が別物ってところに山ほど違和感がある >いわゆる普通の言語
# 高級アセンブラの C は除く
その C だって、GCC なら ({ ... }) で囲めばなんでも式になるぞw
そもそも、代入が式だし。
> GCC なら ({ ... }) で囲めばなんでも式
いや、それは極論だし
H
land of lisp まだ来ねー
昔のDOSの表計算アプリみたいな画面を
REPLで実現してくれるライブラリってない?
>>71 *curses.so あたりを ffi すればいいのではあるまいか?
cl-ncursesっていうのを見つけた
ありがとう
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つだけにしたらいいのかね。
お前らはどうやってんの?
read-lineで入力を求める際に
初期値として任意の値をセットしておくことはできませんか?
>>74 自分ならだるさを許容するかパッケージプリフィックスで手を打つと思う。
>>76 ありがとうございます。
やりたいことは初期値をセットしておいてその一部を書き換えてread-lineさせる
という動作なので、"default value"が表示されてる状態にしたいのです。
これに対するマクロ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 :
デフォルトの名無しさん:2013/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))))
希望と合ってる?
なぜこんなことをしているのかというと、XMLからデータを取ってこようとしているからです
厚かましいお願いですが、XMLで属性からデータを取得できるやり方も教えていただけないでしょうか
>>80 完璧です!ありがとうございます
畏れ入りました
自分のレベルがあまりに低いからかもしれませんが
なぜこんな短時間でマクロを考えつけるのでしょうか?
やっぱり経験ですか?
>>78 自分はあまりその辺りに詳しくないのですが、おそらく端末制御の領分になると思います。
難易度がかなり上がりますが、それでもその方式にこだわりがあるのなら、
>>72-73で挙がっている情報を調べてみると手がかりが掴めるかもしれません。
>>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を使った方が良いと思います。
>>84 >>85 なるほど。勉強になります。
それらを踏まえ、もう一度作りなおしてみます。
ご教授ありがとうございました!
>>87 ありがとうございます。早速ブックマークに登録しました。
>>78,83
ncurses に libform ってのがくっついてて,
こいつの set_field_buffer() とかをffiして使えば何とかなるのかな?
後は自前で作りこむくらいしか思いつかない
>>83,89
ヒントありがとうございます!
その辺をslimeのcontribあたりと合わせて見てみます。
一定の出力を最後にまとめて文字列として返したいのですが、どういう風にすればいいのでしょうか
今は↓のように文字列をconcatenateで連結させていますが、formatのnilの部分をストリームに変えて出来ないものかと思っています
(concatenate 'string
(format nil "テスト")
(format nil "bar")
)
(defun mkstr (&rest args)
(with-output-to-string (s)
(dolist (a args) (princ a s))))
こういうこと?
それです!ありがとうございました
94 :
デフォルトの名無しさん:2013/03/18(月) 18:07:16.64
thunkってどういうときに使うんですか?
感謝したとき
thanks!
>>94 めちゃくちゃ大雑把に言えば
「今評価しないで後で評価されるかも知れない式」
全般のことじゃね?
CLOSあんま好きじゃない派の人って
やっぱ構造体使うんですか?それともリスト?
両方使ってる気がします。
質問です。
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)
これってどうすればいいんでしょうか?
>>100 それEmacs Lispだと思うんで、Emacsのスレで聞いてください。
てーか、そういうときはM-x describe-functionで関数を調べてみてください。
"Replace all matches for REGEXP with REP in STRING."って書いてます。
list*とconsは全く同じものですか?
consは2引数やで
たしかにそうでした
みなさんは作った実行ファイルの大きさとか気にならないですか?
>>105 なんで気になるの?
自分はMegademoで4Kとか64Kでも作らない限り気にもしないけど
>>105 16G とか 32G の主記憶が当たり前の時代に, 組み込み物とか
>>106 のような
用途でもない限り, 実行ファイルの大きさとか気にしてもしょうがないじゃん.
組み込み物だって, 1G とか 2G の主記憶積んだやつあるのに...
コンパイラが吐き出す実行ファイルの大きさよりも、実行時のメモリ消費量のほうが気になります。
109 :
1/2:2013/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:2013/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です。
>>110 コンパイラが賢くないとしか言えないんだが...
disassemle すると, 型宣言した方はsse命令を使おうとして,
そのための準備コードが増えて遅くなってるように見える
(手元にあるのは 1.7 だけど....)
うちだと、
(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とか無駄にいっぱい付けないと駄目だったはず。
あと、基本的な確認で申し訳ないけど、最適化宣言は大丈夫?
実行時型チェックとか外すのに条件があったりするけども。
http://accomplish-nothing.blogspot.jp/2011/02/clozure-cl.html
114 :
109:2013/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の方がいいかもしれませんね・・
>>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)
(A B C D E) のcadddrがDになるのは何故ですか?
(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
cdrのcdrのcdrのcarだから
逆順に読めばいい
カドゥドゥドゥラァ
121 :
デフォルトの名無しさん:2013/04/28(日) 13:39:23.14
コマンドラインから
$ sbcl --script sample.lisp
と実行するとき、sample.lispの中の
quicklispたちは別ファイルに分けたりするべきなのですか?
あまりプロジェクトに関わったりしたことないので
ファイル配置の勘所がわからないです
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をダウンロードしてコンパイルしてくれるので。
あと、自分が見てきた中では、
* 必要なライブラリは事前にQuicklispや手動でインストールしておくことが前提
* 必要なライブラリの読み込みはASDFで依存関係を定義して利用
という形のプロダクトが多かったです。
作っているのがライブラリならそのままASDF経由で利用してもらって、
アプリケーションならC言語のmain的なトップレベルの関数を用意しておいて、
REPLから呼び出したり、実行形式にしたコアイメージのトップレベルに指定したり、
スクリプトから(asdf:load-system :foo)とか(ql:quickload :foo)で読み込み、
トップレベルの関数を呼び出し、って感じじゃないでしょうか。
この辺り、Common Lispでは色々方法があって、全部説明すると長くなるので、
どんな感じの運用をしたいか書いてくれると回答をもらいやすいかも。
124 :
デフォルトの名無しさん:2013/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 :
デフォルトの名無しさん:2013/04/28(日) 15:22:31.24
>>123 ASDFファイル(sample.asd)に、実行時に必要になるライブラリを
明記しておくのが多いということでしょうか?
>>124 スクリプトでは自然だと思います。
>>125 プロジェクトという言葉があったり、ファイル構成を気にしてらしたので、
一定以上の規模のソフトウェアも作りたいのかも、と思い、追記しました。
スクリプト用途ならASDFに対応する必要はないです。
ASDFに対応すると便利なのは、ソフトウェアのビルドに手順が必要だったり、
書いたソフトウェアを配布したいときです。ビルド用にcompile-fileするスクリプトを書いたり、
マクロを使うときにeval-whenで:comple-toplevel指定したりって面倒じゃないですか。
そういうときに利用するとその辺りを良きに計らってくれるので楽です。
makeとかrakeとかmvnとかantとかその辺に該当します。
127 :
デフォルトの名無しさん:2013/04/28(日) 23:01:16.97
>>126 とてもよくわかりました
ありがとうございました!
ブラウザゲーム作りたいです(´・ω・`)
ゲーム内部のバックエンド部分なら問題なく書けると思うから頑張れ。
ユーザインターフェイス(画面周りとか操作周りとか)は、
多分JavaScriptの力を借りることになる。
Common Lisp から JavaScript のコードを生成するとかどうよ。
ついでにnode.jsも使わせて
lispをjavascriptに変換してからv8で動かしたら
stalinより高速なんじゃないのかな
事前に型付けしまくってAOTコンパイルで頑張るCommon Lispと
実行時情報を元にJITコンパイラが頑張るJavaScriptだと、
アプローチ的にはむしろ対極にある気がするけど
v8はプロファイラで速度のボトルネック探してから
そこだけ型推論かけてNativeにコンパイルするそうだ
asm.js は Common Lisp 的アプローチって言えるんじゃね。
>>133 JavaScript って毎回ソースコードを読込むところからスタートして実行するところまでやらなきゃならないから、
コンパイル・最適化が実行時間に含まれるわけで、あまり気合入れた最適化も出来ないんだよな。
つまり、めいっぱい頑張って最適化すればいいわけじゃなくて、
全体として一番よくなるほどほどのところを目指すトレードオフの見極めが重要な JS は
Common Lisp とは目標が違うから高速化のために組合わせるのはうまくない気がする。
asm.jsはrabbit compiler的だよ。
部分言語である小さいcore言語を設定してて。
それからJITは気合入れたい所に目一杯気合入れることが可能なフレームワークです。
実行時プロファイルが使えるので。
何でもいいので仕事くだされ
twitter.com/g000001
PHPでよければ
140 :
デフォルトの名無しさん:2013/06/08(土) 21:18:23.73
(A B C D)は
なんで (A . (B . (C . D))) じゃなく (A . (B . (C . (D . nil)))) なの?最後の nil は何なの?
長さ0のリスト
nilはなにもないことを表す特殊な記号
() と書くこともある
乳首じゃないからな
コンスセルは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 :
デフォルトの名無しさん:2013/06/08(土) 22:00:19.42
いや、nilそのものの意味を訊いてるわけじゃなくてdana
(A . (B . (C . (D . nil)))) → (A . (B . (C . (D . ()))))
ということだ
147 :
144:2013/06/08(土) 22:05:18.70
ああ、全然ちがう!!
恥ずかしくて死にそう・・・orz
最後がなぜnilなのかは、リストの定義がそうだからとしか言いようがない。
149 :
144:2013/06/08(土) 22:10:00.86
(B (C . D))と勘違いしてた><
(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))) ではない
3つ以上並んだやつの略記リストは最後はnil
Lispは難解だな
(A . (B . C)) は A と (B . C) の2つで構成されるリストと解釈される つまり略式は (A (B C)) となってしまう
(A . (B . (C . nil))) は A と B と C と nil の4つで構成されるリストと解釈される
同様に (A . (B . (C . D))) は (A B (C D)) のことになる (A B C D)にはならない
(A) => (A . nil)
で、
(A (B C)) => (A . ((B . (C . nil)) . nil))
であってる?
>>154 違う
× (A B (C D))
○ (A (B (C D)))
(A B (C D)) は (A . (B . ((C . D) . nil)))
なんだかオラ混乱してきたぞ
158 :
155:2013/06/08(土) 22:46:45.98
>>151,153,154
は違うように思う。
(A . (B . (C . D))) は (A B C . D)
厳密なS式なんて時代遅れ
Lisp (programming language) - Wikipedia, the free encyclopedia
https://en.wikipedia.org/wiki/Lisp_(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).
>>150 (a b)は(a . (b . nil)) だよ。
(a . b)はあくまで(a . b)だ。
そもそも(a)が(a . nil)なのに、要素数が2のときだけ例外になんかせんよ。
(A B)と(A . B)は別物ってことか
リストとは2つの値のペアのことであり、3つ以上は無い
盛り上がっているのかと思ったらパルプンテかかってる。
(A . (B . (C . D)))
(A . (B . (C . (D . nil))))
それぞれについて一要素づつ表示する関数でも書いてみたら?
どっちが便利か?
どっちを採用したくなるか?
167 :
デフォルトの名無しさん:2013/07/03(水) NY:AN:NY.AN
CFFIの使い方解かりやすい日本語サイトか
簡単な例など何方か教えていただけますか?
>>167 CFFI - Common LISP users jp
cl.cddddr.org/index.cgi?CFFI
169 :
デフォルトの名無しさん:2013/07/03(水) NY:AN:NY.AN
On Lispのtrec関数が単なる遅延評価の言い換えなだけな件
そうか。
172 :
デフォルトの名無しさん:2013/07/12(金) NY:AN:NY.AN
Lisp in Summer Projectsに参加してる方、いますか?
日本語版のLet Over Lambdaは難しくて読めないっていうか、
読んでるとだんだんイライラしてくる。
気合で読んだぜ
そうか。
CLOSあったらいらないよね
plamdaとか
>Let Over Lambda
まあマクロの使用例ってところじゃねーの
it this self
もうアナフォリックマクロに使えそうな名前が残ってない
下のunwind-protectのプロテクト節の部分で、ストリーム sはきちんと閉じられるでしょうか?
それとも、変数lazyが他の値に再束縛され、sがガーベジコレクトされるまで開いたままなのでしょうか?
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)
=> ""
そのコードだと unwind-protect から抜けた時点で close されるよ。
(close s) の直前に (format t "closed") とか入れればわかると思う。
close 済み string output stream に
get-output-stream-string したときの動作は undefined 。
処理系によっては string output stream を close しても何もおこらない。
182 :
デフォルトの名無しさん:2013/07/20(土) NY:AN:NY.AN
ありがとうございました。
もやもやがすっきりしました(:-D)
:-(
:-(8-D)
common lisp処理系はエラー時に行番号を教えてくれないんだけどどうやってエラー箇所を特定すればいいの?
あやしげなとこにprint・・・
処理系によってはデバッグモードに突入したりするんじゃないの。
処理系によって賢い機能がある場合もあると思うので、もうちょっと詳細を書くとよいかも。
マクロがあると「行番号」で表すのが難しかったりするんだよね。
マクロ定義の方が間違ってるかもしれないし、
そのマクロ定義もマクロで生成されてるかもしんない。
エラーが発生したときにどこを示していいんだか処理系には判断付けるのが難しい。
clispとかsbclの話なんだけどちょっとした失敗なのに行を教えてくれないせいで無駄に時間食うんだよ
行番号はマクロ展開後でいいと思うんだけど何が駄目なのかな
C言語もそうだし自作処理系でもそうやったけど特に不都合はなかったな
自分が言いたいのはなにかいい方法があれば教えてくださいってことね
>>188 slime 使えば?
エラーが起こった箇所のソースに色けて
^N とか ^P でその場所にカーソルが飛んで
該当エラーの内容も表示してくれるぞ
>>188 slime 使えば?
エラーが起こった箇所のソースに色けて
^N とか ^P でその場所にカーソルが飛んで
該当エラーの内容も表示してくれるぞ
それはslime-compile-defunでコンパイルした時のことなの?
自分はslime-eval-defunで評価してそれをreplから実行してたんだけど
それよりコンパイルしたほうがいいのかな
関数コンパイルするタイミングでコードの位置覚えてくれるんで、
編集中やデバッグ中に定義してる位置にジャンプしたりできる。
てーか、マクロ展開後の行番号とか教えられたりしても途方に暮れるだけだと思うな。
Seriesとか試せば分かるけど、とんでもない行数に展開されることとかあるし。
行番号なくてもスタックトレースあるからそれでコンディション発生した関数は分かる。
あとは適当な位置にbreakつっこんで止めたり、printで出力したりすりゃ結構すぐ分かるよ。
>>187 処理系によっては、じゃなくて、Common Lispは規格でデバッガの存在が要求されてる。
ブレークポイントとかステップ実行とかディスアセンブラとかも同様。
>>194 存在が要求されてるのは知ってたけど、
挙動がどの程度細かく規定されてるのかは知らなんだ。
ステップ実行まであるのか。 CL さんマジかっけー。
common lisp
slimeいれておおすごいと思った所で熱が覚めて辞めてしまい1年ほど経過
マクロとか使いこなせると楽しいんだろうけれど、何かそのために面白い題材とか無いものか
何も言わずにOn Lispを読み通せ
プログラミングのために本読むの嫌いだけど読むか・・
ふつーにwebアプリ作るといいよ。動的に変更できるのが面白い。
200 :
デフォルトの名無しさん:2013/08/05(月) NY:AN:NY.AN
lispbox入れて始めてみたんだが、
コンパイルして関数を実行したら日本語が文字化けする
普通にslimeに直に入力したら日本語でも出力されるのに
こんな状況
i.imgur.com/A0pGoRn.png
Shift JIS を使うのは情弱
Allegro CLをEmacsからfi:common-lispで使っても日本語が文字化けする
なんでだろう
>>203 直接alispを起動して日本語のシンボルや文字列を扱うのは問題ないんだ
>>206 うん 一番下のset-buffer-process-coding-systemが怪しくて消したりしたけど
起動した時のメッセージが微妙に変わったくらいだった
;;; 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版だとヒープ領域の制限で日本語化は無理とかかな
clojureのREPL使っている人がいて
分からない関数carがあったら
(doc car)としてポンポン調べていたのですが
common lispにはこういう関数ありませんか?
(documentation 'car 'function)
SLIME使ってたらキー操作でHyperSpec引ける
>>210 2画面で片方ブラウザにしてるんだけど、新規タブでばんばん開いちゃうのやめる方法ないかしら
firefoxみたいに引数で新規タブかどうか指定できるブラウザ使うか、w3使うか。
(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の中から見えないのですか?
evalは一番外の環境を使って評価するんじゃなかったっけ
>>213 HyperSpec のevalのとこに書いてるよ
何故そうなってるか、という質問だとおれは答え難いなぁ。そんなものだ、と思って使ってた。詳しい人解説ヨロシク
前スレの 407 から 414 あたりで同じような話題が出てるよ。
217 :
213:2013/08/12(月) NY:AN:NY.AN
>>214,215,216
ありがとうございます。
前スレ見ました。最適化をしやすくするためにローカル環境を使わないようですね。
ちょうど去年の今頃の自分のレスでした。
(ICFPの時だ(そして今も))
なんだと?
お前は相変わらず成長しないな
ワロタ
そんなことあるもんなんだな
eval はあんまり使ったことないな
(find-if (lambda (lst) (find-if #'oddp lst)) '((2 4 6 8) (2 1 3)))
;=> (2 1 3)
ここで1を返すにはどう書くのがよいでしょうか?
223 :
222:2013/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:2013/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
出来ました
いきなりそっちにいくのか(困惑)
226 :
222:2013/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が出てきたので
ちょっとお尋ねします。arrayの一部を新たにarrayを作らずに切り出すことってできないんでしょうか?
新たにnewしないで、もとのarrayを直接参照するsubseqを探しているんですが、そういったものはないんでしょうか?
元のリストが(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)))である。
この構造は元の構造に含まれていないため、切り出すということができない。
と書いてみたがarrayの話か・・
あれ〜?
>>230 レスありがとうございます。そうなんです、arrayの話なんです。
>>231 (^^;
とりあえず、自己解決しました。
displaced-arrayでいけそうです。make-arrayのオプションとは、盲点でした。
緑のモンスターの本買いました。
コーディングは適当なエディタに書いてclispにペースト実行ってやってるんですが、もっといいやり方ないですか?
Emacsにslime?がいいのですかね?
鉄板→emacs&slime
>>233 slime の環境は quicklisp というライブラリ管理ツールを使って簡単にできるよ
>>234 おお、やっぱりこの組み合わせが1番なんですね。
本読んでると特にそのあたりの記載がなくて、最初はTerminalからclisp立ち上げて直に長文コード打ってました。(コピペで、ですが)
emacsでコード書いて保存してslimeで実行って感じがデファクトなんでしょうか?
>>235 quicklisp初めて知りました。これは管理が楽になりそうでいいですね。
私の環境はMacなのでbrewでclisp入れてますが、slime使うなら管理も含めてquicklispがいいですね。移行します。
ご教示ありがとうございました。
(defun add (x y)
(+ x y))←ここでctrl+xを押し、ctrl+eを押すと関数が定義される
(add 8 5)←ここでctrl+xを押し、ctrl+eを押すと13が表示される
書きながらどんどん実行していく。
238 :
236:2013/08/23(金) NY:AN:NY.AN
>>237 便利過ぎて鼻血が出ました。
これでLisp本がさくさく進められます!!ありがとうございました!
sbcl 1.0.55.0でquicklispからcxml-stpを使おうとしたんだけど、
次がコンパイルできないんですが同じ症状の人いますか?
(eval-when (:compile-toplevel :load-toplevel :execute)
(ql:quickload :cxml-stp))
CommonLisp初心者なんですけど
Clojureの->みたいのを実装したいのですがどうやったら綺麗に書けますか?
想定してる動作としては
(-> '(10 20 30) (mapcar #'1+ _) car 1+)
;; => 12
書いてみたのですがあと一段階…
(defmacro -> (&body forms)
``(let* ,(mapcar #'(lambda (f) (if (symbolp f) (list '_ (list f '_)) (list '_ f))) ',forms)
_))
;; => (LET* ((_ '(10 20 30)) (_ (MAPCAR #'1+ _)) (_ (CAR _)) (_ (1+ _))) _)
(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)))
間違ってたらめんご
マクロ部分はこっちに直して
(defmacro -> (&body forms)
(build-> forms))
>>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))))))
挿入する場所を選べんのかそれならこうだ
(defun build-> (forms)
(reduce (lambda (acc form)
(if (listp form)
(substitute acc '_ form)
(list form acc)))
(cdr forms)
:initial-value (car forms)))
githubのclojure/src/clj/clojure/core.cljにある->のソースを参考にしたら、こんなんなった。
(defmacro -> (x &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)))))
->>は、こんなんなった。
(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)))))
>>222 大分おそくなったちゃったけど、こんなのはどうだろう。
(some (lambda (lst) (find-if #'oddp lst)) '((2 4 6 8) (2 1 3)))
=> 1
someとfind-ifって同じ?
ざっくり言うと、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
Maximaで黄金比を計算しようと思って
(%i1) cf((1+sqrt(5))/2), cflength=3;
と入力したら
(%o1) [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2]
と表示されてしまいます。
これって最後は1にならなきゃおかしいですよね。
バグですか?
>>250 仕様です。
その式、マニュアルにそのまま出てます。
tp://maxima.sourceforge.net/docs/manual/en/maxima_29.html
仕様というか、例としてはそうなっているけど、なぜ2にしているかの理由は書いてないんじゃね?
clojureのthreading macroってquicklispにあったりしませんか?
threadなどで検索をかけてもこれといってひっかかるものがありません
254 :
デフォルトの名無しさん:2013/09/11(水) 08:01:21.21
>>253 threading macroって -> と ->> のことでいいのかな。
それなら以下のパッケージに含まれているようです。
quickdocs.org/cl-arrows/
quickdocs.org/backports/
>>254 ありがとうございます
clojureと挙動が少し違いましたがcl-arrowsが使えそうです
backportsも試してみたかったのですがquickloadがコケるのであきらめました
quickutilにも、->と ->>があったらいいな。
CLにclojureの#()やschemeのcutのようなものってありますか?
Lisperはこの世のごみ屑
今すぐ消えるべし
>>258 俺は特定のLisperにネタミがあるがおまえは一体何が原因でそんなことを言ってるんだ?
そういうbotなんだよ
261 :
デフォルトの名無しさん:2013/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)
>>259 ああいう人は心の病気なんだから専門家に丸投げして関わらない方がいいとおもうなー
>>261 さんくす!
しかしこういうのが外部にしかないということはCL書く人は毎回lambdaを書くということなんでしょうか
Land of Lispの最難関はどう考えても環境構築
Win8+CLISP+emacs+SLIMEでやってる人っていますか?
CLISPとemacsのインストール後emacsのsite-lisp(?)フォルダにslimeをリネームしてコピーまではしたもののその後がわかりません。
ユーザーフォルダの奥の方にあるinit.elがWindowsではemacsの設定として扱われる、ということまでは調べました。
double-float の simple-vector が作れないのは何で?
ついでに float の simple-vector に
double-float の値、例えば 0.0d0 を代入できてしまうのは何で?
(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)
gaucheとguileの違うところを教えてください。
>>269 ここは Common Lisp スレだよ。
* (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 :
デフォルトの名無しさん:2013/09/15(日) 12:47:28.34
sbclとcclでは上のようになりました。
しかし、clispでは
[1]> (type-of (make-array 3 :element-type 'double-float))
(SIMPLE-VECTOR 3)
となります。
一体全体どうゆうこったい??
型指定の類は最適化のヒントでしかないから、処理系によっては無視される。
clisp はあんまり最適化してくれない処理系。
274 :
267:2013/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 :
デフォルトの名無しさん:2013/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.
http://clhs.lisp.se/Body/t_smp_ve.htm 要素型が特定されていると 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
ありがとうございます!
simple-vectorと型要素の関係がすっきりしました。
clispがあまり最適化してくれない、というのも勉強になりました。
277 :
デフォルトの名無しさん:2013/09/15(日) 16:04:58.89
macroを勉強したいんですがon lispとlolがやはり定番なんでしょうか?
LOLでは「マクロを構築する上で、良いリファレンスやチュートリアルはほとんどない。Paul GrahamのOn Lispはその例外の1つである。」って書いてあるね
>>274 > でエラーになってしまう。大量の代入をすると float なら cと遜色ないんだけども。
> double-float だと2-3倍時間がかかるので気になっている
ここん所, 今一, 意味不明だけど解決したのかな?
# (declare (optimize (spped 3) (safty 0) (debug 0))) とかやれば
# 真面目なコンパイラなら (aref foo bar) は inline 展開なんじゃね?
>>266 動きました、ありがとうございます。
これでいちいちTerminalに一文字も間違えないように打つことから解放されました。
Land of Lisp もサクサク進められそうです。
ところでこのlispboxはClozureという処理系を利用していると書いてありましたが、CLISPと何か違いはあるのでしょうか?
Land of LispではCLISPを前提としているので。
common lispで名前空間にユーザー側で別名をつける機能ってありますか?
clojureみたいに
(require 'alexandria :as 'alex)
alex:alist-plist
のように機能を探してます。
>>280 land of lispの範囲だと少なくともサーバのソケット周りが違うんじゃないかな、clisp使うか、ningleとかusocket使ってサーバ書き直すとかしなきゃいけないじゃない
本持ってないけど、サンプルコード感じだと他はclosure clでも動くんじゃない?
282 :
デフォルトの名無しさん:2013/09/17(火) 06:55:03.39
>>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 :
デフォルトの名無しさん:2013/09/17(火) 17:59:12.85
Lisperはこの世のごみ屑
早く死滅せよ
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)
cl-dbiでtimestamp型が読み込めないよう
common lisp の room 関数は 結果を標準出力に出力しますが、標準出力ではなく変数にセットすることは可能でしょうか?
289 :
デフォルトの名無しさん:2013/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 :
デフォルトの名無しさん:2013/09/19(木) 19:38:15.34
>>284 おかげさまで取得できました。
ありがとうございました。
291 :
デフォルトの名無しさん:2013/09/19(木) 19:39:46.57
>>289 番号まちがえました。
おかげさまで取得できました。
ありがとうございました。
Linuxで環境構築したらclisp,emacs,slimeをインストールするだけで終わった
Land of LispからLispを始める人は絶対Linuxでやるべきかと
graphvizとかも必要になるから断然Linuxのがいいよ
LispプログラマはMacよりLinuxなイメージ。
とはいえ現実にはアプリを走らせる環境と同じOSで開発するのが一番リスク少ないんだが。
land of lispを読んで環境構築しようと思ったらいつのまにかinit.elを一日中いじっていた
何をいっているかわからねえと思うが
よくあること。
環境構築は断然 Linux か Mac がお勧め
Win なら、VMWare Player 入れて Linux の OS から入れなおしても
充分お釣りがくるよ
今CLでマルチスレッドをやろうとしたらBordeaux-threadsなんだろうか。
ちなみに処理系はSBCL on Linux
SBCL 専用でいいんだったら, SBCL のスレッド直接使えばいいと思う
cygwin導入すらばいいだけだろ
こんなところでスラバヤ殿下に会えるとは…
clhsとcltl2の関係ってどうなってんの?教えて偉い人
clhs は正式標準で, cltl2 は標準になる前に出版されて,
cltl2 出版後の改定が反映されてないだけだと認識してるが...
横から口を挟んで申し訳ないのだけれどclhsって何ですか?
Common Lisp Hyper Sex
clhshs
309 :
304:2013/10/03(木) 22:50:20.33
なるほど Common Lisp HyperSpecのことでしたか
Wikipedia を Wiki と略しちゃう男の人って…
質問させてください。
「Land of LIsp」で最近Common Lispをはじめました。
この本の中で除算について以下のような記述がありました。
↓↓↓↓↓↓↓↓↓↓↓↓
4を6で割ると、答えは少数0.66666…じゃないかと思うかもしれない。
除算関数はかわりに、有理数を返すんだ。
(省略)
引数に浮動小数点が含まれていると、結果は異なったものになる。
>(/ 4.0 6)
0.6666667
先に述べたように、小数点を含んだ数(4.0)は計算を汚染し、結果も少数になるんだ。
↑↑↑↑↑↑↑↑↑↑↑↑
引数に浮動小数点が含まれている際の除算の挙動は理解できたのですが、
最終行の「小数点を含んだ数(4.0)は計算を汚染し」の
「汚染」の意味がよくわかりません。
プログラミングにおいて「汚染」とはどのような意味で使われているのでしょうか?
>>311 Land of Lispは読んでなくて手元にCommon Lispはないけど...
(/ 4 6) = 2/3
は正確な値だけど
(/ 4.0 6) = 0.66666....
は何らかの丸めの入る近似値
有理数で計算しているうちは正確な値で結果が得られるけど
少数が混じると近似値になってしまうということではなかろうかと存じます。
313 :
312:2013/10/09(水) 18:49:23.69
読み返したら、あまり、回答になっていなかったか。
ここでいう「汚染」というのは、上記のこれ以降近似値という
質の低いデータになってしまうということだけど、
確立されたプログラミングの専門用語ではないと思う。
Webプログラムとかでデータにユーザが入れた値が入る等
安心して使えず、そのデータから派生したデータを使う場合
セキュリティに気をつけなくてはいけないデータになることを
汚染という使い方をしたのを見たことがある。
>>311 浮動小数点数のいろんな問題を含めて汚染といっているのだろうけど、
代表的なもののひとつに桁落ちというのがあって、
(x+1/N)という実数をN回足し合わせれば必ず(N*x+1)になると期待してしまうけど、
浮動小数点数の場合、xとNがそれぞれ大きい場合にはN*xになってしまう場合があったりする。
Cなんかで数値計算をやる場合には、浮動小数点演算の特性を頭に叩き込むのがまず基本だけど、
Lispの場合は有理数が使えるんだから、速度を気にしない場面では有理数を使うべきってことではなかろうか。
有理数と浮動小数点を計算すると浮動小数点になる
全部が有理数なら計算結果も有理数で得られるが、たったの1個でも浮動小数点が混ざっていると、計算結果は浮動小数点になってしまう
安全な食材の中に、たった1つでも有毒なものが混ざっていると、結果できた料理は有毒なものになってしまう様に喩えて、汚染とかいう
316 :
311:2013/10/09(水) 20:34:03.34
>>312, 313
ありがとうございます。
>少数が混じると近似値に〜
正確な値を清浄ととらえた上で、近似値を"汚染"と表現しているのですね。
「汚染」というのは、確立されたプログラミングの専門用語ではなく、
文脈によってニュアンスが変わると把握できました。
>>314 ありがとうございます。
>桁落ち
なるほど。桁落ちにより誤差が発生することがあるので"汚染"と表現しているのですね。
ためになります。
>>315 ありがとうございます。
>安全な食材の中に、たった1つでも有毒なものが混ざっていると〜
この比喩で、納得できました。
このように考えると、313さんが教えてくれた
「Webプログラムとかで〜」という用法とも、大きなズレは感じませんね。
"汚染"というのは、正しい状態を前提として不正な状態になることをいうのかなと
みなさんにいただいた内容をもとに自分なりに結論してみました。
また、何かあったら質問させてください。ありがとうございました。
汚染っていうのはヘンだろ。
値が誤差に汚され染められる
英語の contamination なんだろうけど。
純粋だったものが汚されるってニュアンスかな。
変かどうかは分からないけど、
>>315の言うような意味だと思うよ。
少しでも混ざると全体がそうなってしまう。一度混ざると取り除けない。
日本語にするとおかしいね。
haskell界隈で使われる純粋と不純ってのも、日本語ではどうにも違和感がある。
不純ってのは、日本語の文脈では悪い意味でしか使われないから。
>>317 >"汚染"というのは、正しい状態を前提として不正な状態になることをいうのかなと
この理解が変でしょ。
「正しい」状態とかじゃなくて、ある種のデータはこういう内部表現をされて
います、ってそれだけのことだから。
再帰関数で相互に関数を呼んでいる場合に
ファイルをロードするとエラーメッセージ(片方の関数が存在しないと言われる)
が出てしまうのはどうやったら消えてくれるのでしょうか
動くので問題ないのですがエラーが気になるのです
あっあっ有理数汚染されちゃうっ誤差入っちゃうよぉ…
>>321 英語だって否定辞付きだろ。どうやって肯定的な意味に使うんだ。
CLで一般的かどうか知らないけど、Schemeにはは「正確数」と「非正確数」があって、
非正格数を演算した結果は非正格数になる。
正確に言えや
>>325 あの人ら、不純を悪い意味じゃなくて非純粋の意味でバンバン使うじゃん
(setq *x* (1+ *x*))
(nreverse ...)
これ全部不純な計算ね
でも、日本語で不純っていわれると、何かよこしまな悪い考えを咎められているようにも聞こえるw
その式はよこしまな悪い考えだと思う
>>328 あの人らは「んなもん使うなぼけ !!」って意思を込めて
「不純」って使ってるのかと思った。
なんで不純を理解できないんだ
前後の文と雰囲気から分かるだろ
自由変数の捉え方の問題では?
*VARIABLE* は,
「宣言した時点で新しい評価環境が発生してる」
と, 考えると別に気にならないけど
(let* (tmp)
(setf tmp (op1 ...))
(othe-opx tmp)
(setf tmp (op2 ...))
的な, 連鎖で状態を変え続けられる方が気持ち悪い
>>331 意味的に何を言いたいかは充分すぎるほど分かるけど、感覚的には全くわからんね
ああ、これまたどうしようもなく下手くそな英訳の濫用だなあとしか思わん
俺は感覚的にもよくわかるけどな
煽りじゃないけど、もっと適切な言葉があるなら知りたいから教えて
副作用
副作用ってのも違和感のある表現だが英語だとどうなってるの?
side effects
副作用や不純に違和感を覚えるってただ慣れてないだけだろ
何にでも突っ込みたい人なのかな
>>338 副作用はもうなれたけど、コンピュータ系のcontextで聞き出した頃は、
薬とかの副作用っていう、「悪いもの」、「必要外のもの」的な
意味合いを感じて違和感があった。
というか、むしろ、これで気づいた。副作用なんて、他にあんまり用いないし。
ただ、慣れと言われればそれまでだよね。
東山水上行
「低レベル」とかも別に悪い意味じゃないよねぇ。
いつまでも訳された日本語で考えてないで英語本来の意味で考えましょう
文脈次第
英語本来の?!
なにいってんだか
概念に日本語も英語もない
逆に英語でも日本語でも
文脈上の意味、ないし定義から離れて語素から意味を類推するというアホーなことをすることが問題。
どうも言葉自体になにかしら本来の意味があるなんて思っているやからが何人か書き込んでるな
LISP使いとしては、とっても恥曝しだぞ
>>340 「副作用」って表現は関数型の言語以外では今でも見かけない気がするが
新しい語義を翻訳する場合も、新しい語義として割り当てる努力は必要
>>346 そこらへんのプログラマは使ってなくても、標準規格における重要な用語で、
「副作用完了点」とかあるから。
>>345 英語では違和感ないのに、日本語に訳した言葉に違和感があると言ってるやつに対して言ってるだけだが?
LISPの前にまず英語と日本語勉強しろよ(笑)
>>349 わかってないのにレスするな低脳君
馬鹿はおれ、嫌いなの
>>350 指摘が全くもって的外れなの気付かないのかな?おバカさんなのかな?
>>351 だから君にはわからんって
偏差値60以下だったろ?
レスするなよ、馬鹿は嫌いなの
>>352 そんな低い偏差値の大学に通われていたのですか?
文脈の違いにすら気付かずに恥ずかしいレスをしてしまう程度なので仕方が無いですね
感情論でしか語れなくまともに議論すらできないお馬鹿さんはどちらでしょうか?
偏差値コンプレックスのお馬鹿さんは黙ってろよ
まずは朝型の生活にな
Amazonで「よこしまなきもち」で検索したらいやん
折角の休みなのに喧嘩すんなって
WindowsのLisp開発環境でお勧めはなんでしょうか
1.ちょっとLispを触ってみたい、とかならLisp Boxがとっつきやすいのではないでしょうか。
導入の仕方は検索してみてください。
2.しっかりLispと愛し合うなら、次のリンク先の動画が参考になるはずです。
[Installing Common Lisp, Emacs, Slime & Quicklisp] www.youtube.com/watch?v=VnWVu8VVDbI
>>358 lispbox-0.7をインストールしてみました
Lisp環境を効率よく使うのにはEmacsが必須のようでうね・・・
windowsならlispboxとlispcabinet,どっちがいいんだろう?
>>346 昔の職場で普通にレビューとかで副作用って言葉使ってたな
関数型言語なんかの厳密な意味の副作用じゃなくて、
モジュールが何か目的以外の悪さしてるんじゃないかとかそんな意味で
一般用語としてなら、例えば文字を表示することを目的とした手続きで文字が表示されるのは「作用」で、
何か値が返ってきてもそれはついで (副作用) のことっていうニュアンスになるよね。
だけど、技術用語というものはそういったニュアンスを排除して定義によって意味を確定するものだから、
領域によって定義が異なるとかいうのもそういうものとして受入れるしか仕方ない。
最初に用語を決めるときに慎重に定めるべきではあるけど、後になってわかることだってあるし。
>>359 emacsは慣れるまで時間がかかるので、手っ取り早くlispいじりしたいなら、
カッコの対応表示してくれる適当なエディターで、
しこしこlisp書いてみたほうが楽しいかもしれません。
ちなみに、vim派にはslimvがあります。
ああ、そういえば、xyzzyってwindowsだったはずです。
emacsはチュートリアルに少し時間割けばわりかし早く慣れる(気がする)
emacsは好きになるまで2年ぐらいかかった
>>361 「薬の副作用」のイメージで考えてる人多いからね。
まあ、薬の副作用自体間違った言葉なんだが。
薬の方の副作用を二次作用って言うことにしよう。
初心者以前の質問で申し訳ないのですが、
Haskell でいう Hoogle, Python でいう公式の library reference のような、
標準で定義されてる関数やパッケージの総覧みたいなものとしては何を利用するのがいいでしょうか?
eldoc
眠くなるのが「副作用」の薬とかは、眠れないという症状がある場合、
副作用もついでに期待して使われたりするぞ。花粉症の抗ヒスタミン剤とか。
風邪はウイルス性だから抗生物質飲んでも治らないけど、
痰を切って喉をスッキリさせることを目的として処方されたり場合もあるしな。
>>355 アカウントログイン状態で検索しちまったじゃねぇかwwwwww
この本を検索した人はのこの本にLispとかプログラム関係の本ばっかりの中にシマシマパンツが出てくるようになったらどないすんねんwwww
373 :
372:2013/10/14(月) 11:40:18.04
ちなみに期待したのは猫関係の本だった
不純Lisp
>>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 :
デフォルトの名無しさん:2013/10/14(月) 13:18:09.15
Common Lispで何か作りたいのですが
面白いアイデアてありますか?
379 :
デフォルトの名無しさん:2013/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
>>379,380
Brewの方が、Mac Portsに比べて、無関係のものを毎回入れないから楽。
382 :
デフォルトの名無しさん:2013/10/19(土) 17:14:01.48
>>380 >>381 ありがとうございます。
HomeBrew でインストールしました。
悩んでイライラしていたのが嘘みたいにあっさりインストールできました。
ありがとうございました。
383 :
デフォルトの名無しさん:2013/10/22(火) 19:47:20.58
Common Lispでmysql操作のサイト、書籍
などありますか?
387 :
372:2013/10/23(水) 14:56:19.56
>>384 WMをワードマスターと読んでしまって涙目
リンク先みるまでWindow Managerとは思わなかった。
clとかでGenericなエディタとかどうやって作るんだろうって思って昔のLispエミュとか見てるのだけど、そういうのにはむいてないよね。(Cursesとかの世話になるって意味ね)
>>387 >clとかでGenericなエディタとかどうやって作るんだろうって思って昔のLispエミュとか見てるのだけど、そういうのにはむいてないよね。(Cursesとかの世話になるって意味ね)
その論調だとcursesがC言語で実装されてるから、C言語以外はエディタ作るのに向いていないってことになんじゃね?
389 :
デフォルトの名無しさん:2013/10/23(水) 16:16:54.40
>>385 ありがとうございます。
他にないですか?
>>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 :
デフォルトの名無しさん:2013/10/23(水) 19:02:43.14
392 :
デフォルトの名無しさん:2013/10/25(金) 11:23:11.42
Common Lispでリズムマシンみたいなものをつくろうとしているのですが、
0.1ミリ秒ほどの分解能があるタイマーって存在するんでしょうか?
OSとか処理系を書かないと答えられないんじゃないか?
それと余計なお世話なんだけど、”Common Lispでリズムマシン”を作ることに意味があるならいいけど、リズムマシンを作ってみたいだけならpuredataとかを検討したほうがいいんでないかい?
>>393 すみません
書いてませんでした
処理系はClozure CLで、OSはLinuxです
Windowsでも利用可能なら、そのほうがいいかなという感じです
最終的にMIDIシーケンサに発展させるつもりでおり、その習作という位置付けです
Common Lispを選んだのはシュミですが…
一番ユーザが多いとであろうと思うcommon lispの処理系って何なの?
できれば根拠というかアンケートサイト何かを示してもらえば嬉しいが
m m
( ゚∀゚) カモン
( ∩ミ シュッシュッ
| ωつ,゙
し ⌒J
>>394 あなたがcommon lispでアプリケーションを書くことに価値を置いているのかD™等のプログラムを書くことに価値を見出しているのかに依って違うんだけど
余りこだわりをこだわりというか邪見を持たずやりたいようにやったほうがいいと思うけどな
わけわかんなくてスマソ
そんなことを知ってどうするっていうんだい。
気にするな
とりあえずチンチンしごけ
m m
( ゚∀゚) イクゾ
( ∩ミ シュッシュッ
| ωつ,゙
し ⌒J
>>398 スマヌOSとかによっても違うのに余り意味がないかも知れないな、
俺はSBCLがユーザが多いよな気がしてなんとなくSBCLを選んだのでなんとなく引け目があったんだ
>>392 楽しそう。clojure の overtone みたいなの目指してがんがれ!
>>392 http://repmus.ircam.fr/openmusic/home
http://www.doc.gold.ac.uk/isms/lisp/midi/
http://www.youtube.com/watch?v=xzTH_ZqaFKI
参考になるかも
404 :
デフォルトの名無しさん:2013/10/31(木) 10:48:15.74
メモリの取り方の図解のサイト、書籍などございますか?
common lispで、参考になるようなきれいなソースコードとかありませんかね?
最初はポール=グレアムのコードからじゃね?
>>405 PAIP が教科書的に美しいよ。あとはlispのwebサーバ hunchentoot もかなり綺麗なコードだった。
LandofLispの絵に惹かれて買ってからちょこちょこ読み進めてるけどCommonLispって使い道あるんだろうか...
半分終わったくらいから気になりだした
pythonやruby使うのと同じように使えばいいんじゃないの?
Common Lisp じゃなきゃいけないって事態はそんなにないと思うけど、
Common Lisp では駄目だって事態もそれほどない。
同じコードを何度か書いたりして、他の言語の抽象化機能に疑問を感じた時?
format使いたい時
413 :
デフォルトの名無しさん:2013/11/01(金) 23:46:46.24
相変わらず暗いの
最も明るく行ったら
面白くないスレ減ると思います。
LISPって一人で書いているときはまあ良いとして、共同開発で使うと混乱したり、収拾着かなくなったりしないのなんとなく。
そこまで大人数のプロジェクトの経験者は少ないだろうしなあ。
コアの上に他の言語が乗ってるようなものだから、
gtkやobjC、Railsその他と変わらんと予想するが。
マクロも書くライブラリ層設計者と、非マクロのみのアプリ層設計者は分離した方が良いのかも?
ライブラリ層というよりDSL層か。
>>414 なる。
グレアムが言うには Viaweb 開発時には分担が完全に分かれてて、
自分の開発したところはユーザーサポートまで含めて自分でやる方式でまわしてたらしい。
新機能もバグ修正も常に行なわれながら発展する進化的モデルでの開発で、
仕様とコードを一体にして決断を下せる立場だったからこそ上手くいったと考えられてる。
ガチガチの仕様を多人数で厳密に満たしていくような開発スタイルじゃ混乱するだろうね。
ガチガチの仕様ならコードもガチガチになるから混乱しないような。
ガチガチの仕様ではLispの柔軟性の価値がないだけで。
まあでも飯は渡された仕様書を実装することで食べる人が圧倒的に多いわけで、LISPなんて役に立たないと思ってもしょうがないですな。
ほとんどは既存のシステムの焼き直しだから、
ライブラリが多いものの方が有利だしなぁ。
結局、ユーザが多い言語の方が有利ってことになる。
423 :
デフォルトの名無しさん:2013/11/03(日) 08:27:59.63
LISPで作った面白いものありますか?
ecLISP
>>421 アジャイルには向いているんじゃないの?
ソシャゲがLispで書かれる時代が
(psetq a b b a)は
(let ((a b))
(let ((b a))
(setq a b b a)))
に置き換えられるみたいなんだけどなんでこれでaとbの値を交換できるか理解できない
setqでaにbを入れて結局bに入れるaの値はbになりそうなんだけど
上のpsetqの定義はこれ
(defmacro my-psetq (&rest args)
(let* ((pairs (group args 2))
(syms (mapcar #'car pairs))
(vars (mapcar #'second pairs)))
(labels ((rec (ps ss)
(if (null ps)
`(setq ,@(shuffle syms vars))
(let ((body (rec (cdr ps) (cdr ss))))
(let ((expr (cadar ps)))
`(let ((,(car ss) ,expr))
,body))))))
(rec pairs syms))))
普通gensym使うはずなのに意味不明なコード書いてた
なんで動くんだろ
>>428 手続型でaとbを変換するときに
t = a
a = b
b = t
のtをgensymに置き換えてるだけなんだな
多分解決したありがとう
>>432 ごめん、合ってた。二重評価避けのgensymだ。
>>433 全て自己レス
試したけど、やはりいらない気がする。
433が永久ループに陥っている
誰か末尾再帰してあげてー!
tail call optimizationをするとスタック溢れがおこらないぶんより深刻な事態におちいるじゃない
大丈夫、CLだからそのうち落ちる
信号処理やらうと思うんだが
CLても簡単にできるもんなのかな
言語としてやり難いということはないはず。
ライブラリがなくて自作かcffi書いたり、パフォーマンスのためにCみたいなコードに、はあるかも。
信号処理できそうなのは分かったがgnuplot plplot以外にグラフ描画するライブラリないよな
和田先生みたくPostScriptを直接書けば何の問題ない
近頃なら SVG も有りじゃないの。
>>440 Processingは使えないのかな?
和田ってのはアホなんだな
ライブラリがないのが問題になる程度の腕なら、マイナー言語全般あきらめて、メジャー言語でやるべき。
ネイティブのライブラリをffi経由でラッパー作ったり。
ClojureみたいなVM言語だと、VM上のライブラリも少し楽に使える。
改造ってどゆこと?
他の言語で動くようにしろって?
他の板にも書けるようにして欲しいですけど、
まあ、好きなように遊んでください。
楽しいと思いますんで。
この投稿その他lisp方言のスレにもあるな
どの方言かも知らない奴がそこら中に書き込んでるな
興味ない話題はスルーしとけよ
結果的にそれが一番早く事態を収拾させる方法だよ。
一々食って掛かると某「自称本スレ」みたいになる。
もしかして、わざとそうやってここを荒れさせるのが狙いなら
もうこれ以上言うべきことは無いけど。
そもそもソースも読めないのに
悪意を持った素性の知れない人間に作られた悪意のツールを使うなよ
453 :
デフォルトの名無しさん:2013/11/12(火) 19:21:51.74
初心者の物ですがLinxにSynapticでclispをインストールしたのですが
どうしてもclipをインストールした場所が検索出来ません
何方かLinuxのファイル検索上手く出来る方法を教えて頂けませんか?
454 :
デフォルトの名無しさん:2013/11/12(火) 19:28:14.62
$ whereis clisp
455 :
デフォルトの名無しさん:2013/11/12(火) 19:30:36.74
↑ありがとうございました。
456 :
デフォルトの名無しさん:2013/11/12(火) 19:50:17.95
>>454 しつこいようですが
処理系てコマンド扱いなんですか?
lisp以前に必要な前提知識が足りない
素直にwindows使ってたほうがいいな
458 :
デフォルトの名無しさん:2013/11/12(火) 20:14:22.10
>>457 前提知識のお勧めサイトなどありますか?
>>453 454です。
初心者なら知らなくて当たり前です。これから学べばいいのです。
まず、知っておくことは「わからないことを調べる方法」を学ぶことです。
459の言うように、まずは人に聞く前にGoogleなどで検索する習慣をつけることです。
qiitaやstack overflowなども参考になります。
あなたの質問の内容を見ると、lispとlinuxを同時に学ぼうとしているように見えます。
457の言うように、どちらか一つに絞るのも一つの方法ですが、
個人的には、やる気があれば、なんとかなるのではないかと思います。
まずは、linuxのコマンドをざっと覚えましょう。
www.tuat.ac.jp/~sanoken/tech/unix/command.html
itpro.nikkeibp.co.jp/article/COLUMN/20060224/230573/
次に、ターミナルを立ち上げて、
$ clisp
でclispを起動しましょう。
次のHPがlispの勉強に役だつはずです。
www.geocities.jp/m_hiroi/clisp/
modern-cl.blogspot.jp/
463 :
デフォルトの名無しさん:2013/11/13(水) 01:47:11.72
464 :
デフォルトの名無しさん:2013/11/13(水) 01:47:53.48
lispとlinuxを同時に勉強か、最初はタイヘンだけど、いいんじゃないかな。
いろいろ言語用にOS側の環境作ったり調べたり質問したりすれば、すぐ両方使えるようになるよ。
467 :
デフォルトの名無しさん:2013/11/13(水) 08:38:55.68
>>454 find grepで検索出来なかったのですが
どうしてwhereisなんですか?
スレ違い
>>467 find grep whereis でググると次のページがすぐに見つかりました。
www.practicatechnical.com/computer-tips/ubuntu-tips/find-grep-locate-whereis
人に聞く前に、まずは自分で調べるべし。
471 :
デフォルトの名無しさん:2013/11/13(水) 13:23:46.13
schemeはr7rsとか出てるので更新されてるのがわかるんですけど
common lisp の方は1994年の標準化以降更新はないんですかね
ランド・オブ・リスプ読もうと思うんだけど、
Lisp CabinetっていうのでCLISPにチェック入れれば全部動くのかな?
475 :
デフォルトの名無しさん:2013/11/26(火) 17:44:55.18
randomの実装ってどうなってるかわからんかな
線形合同法だとは思うんだけど、具体的に
HyperspecとCLTLチラ見したけど、規格に無さげだし、処理系毎に調べるしか無いんでね?
mjk
lispworks、一応簡単な実験で乱数の範囲は0〜8388607のようなんだがなあ、周期がわからぬ
とりあえずthx
mt-
(defmacro my-lambda (&rest body)`(lambda (_ _2 _3) ,@body))
(mapcar (my-lambda (* _ 2)) '(1 2 3))
;=>(2 4 6)
こういう事がしたいのですが、引数の数が足らずエラーが出ます。
(defmacro my-lambda (&rest body)
`(lambda (&rest args)
(d-bind (loop for i from 1 to (length args) collect (symb '_ i))
,@body)))
そこで第一引数を評価するdestructuring-bindを作ろうとしたのですが、どうにもうまく作れません。
_1 _2...を引数の数に合わせて生成しバインドするいい方法はないでしょうか?
何がやりたいのかはっきりしないけど
こんなマクロが欲しいの?
(my-lambda (* _1 _4))
->
(lambda (_1 _2 _3 _4) (* _1 _4))
作りが甘いけどこんなのでいいのかい?
(defun flatten (tree)
(labels ((f (tree acc)
(cond ((null tree) acc)
((atom tree) (cons tree acc))
(t (f (car tree)
(f (cdr tree) acc))))))
(f tree nil)))
(defun ubar-var? (x)
(let ((name (symbol-name x)))
(and (eq #¥_ (elt name 0))
(handler-case
(parse-integer name :start 1)
(error (c)
nil)))))
(defun mapa-b (f a b)
(if (> a b)
nil
(cons (funcall f a) (mapa-b f (1+ a) b))))
(defun my-lambda (&rest body)
(let* ((ubar-vars (remove-if-not #'ubar-var? (flatten body)))
(numbers (sort (mapcar #'ubar-var? ubar-vars) #'<))
(first (first numbers))
(last1 (car (last numbers))))
`(lambda ,(mapa-b (lambda (i)
(intern (format nil "_~s" i)))
first last1)
,@body)))
>>481 普通の(lambda args body)に対し(my-lambda body)だけの記述で
引数に_1 _2 _3が裏で束縛されてbody内で使えるというものです。
>>482 bodyをflattenしてsymbolを走査し、ラムダ式の引数の数を決めるという
アプローチですか。考えつきませんでした!
レスありがとうございます。
使ってない変数で怒られたのでちょっと変項
(defmacro my-lambda (&body body)
(let* ((ubar-vars (remove-if-not #'ubar-var? (flatten body)))
(numbers (sort (mapcar #'ubar-var? ubar-vars) #'<))
(first (first numbers))
(last1 (car (last numbers)))
(vars (mapa-b (lambda (i)
(intern (format nil "_~s" i)))
first last1))
(ignores (set-difference vars ubar-vars)))
`(progn
(lambda ,vars
(declare (ignore ,@ignores))
,@body))))
(funcall (my-lambda (+ _1 _3 (* _4 _1))) 1 2 3 4)
-> 8
LOLに似たようなリードマクロがあったな
あっちは引数の数指定してたけど
配列でarray-total-size-limit以上のデータを扱うとしたら、普通はどうするんでしょうか?
あんまりないケースみたいですね。
仕方ないので、配列の配列をバッファとして持つクラスを作って、アクセサに
工夫をして凌ぐことにしました。
489 :
デフォルトの名無しさん:2013/11/30(土) 07:43:28.02
>>488 array-total-size-limitって一千万を超える値だけど、そんなデカイ配列何に使うのか興味津々
>>489 時系列の実験データを入れるのに使おうかと。使っている処理系が諸事情でclozure clなんですが、
limitが他に比べて小さいですね。
以前はpython使っていたんですが、pythonは自前のループで書いた処理が遅いので、好みのclでやりたくて、移行中です。
pythonはいい言語ですが、強制インデントがどうも性にあわない...
強制インデントかー。最近の言語は何々が出来ないが売りが増えて何だかなーがあるな。
表現が制限されるという事は、うまく抽象化できない概念が増えるという事だと思うのだけど。
手続き概念を書きたいのに、素直に書けないとか。
いかなる表現も自由で、抽象化方法も簡単に実装できるLisp系が、もっとも表現力のある言語。
計測器から垂れ流されるデータを解析しようとするとそんくらい普通に行くよ。
こういうのはオンメモリで処理するのをあきらめた方が良い。
おれなら sqlite に突っ込むかな
どうして
``(,`(,x ,x) ,`(,x ,x))を評価すると
`((,X ,X) (,X ,X))になるんですか?
なりません
497 :
495:2013/12/05(木) 22:50:52.92
なりませんか?こちらではsbcl、clispで同様になりました。
(setq x '(+ 8 8))
`(`(,,x)) ;=> (`(,(+ 8 8))) ; xは評価されたあともう一度評価される
`(`(,',x));=> ('((+ 8 8))) ; xは一度だけ評価される (言い換え, クオートされた後もう一度評価される)
`(`(,`,x));=> (`(,x)) ; xは次の評価時に評価される なぜこう変換される?
二重バッククオートでは``,,や``,,@や``,',などが頻出ですが、``,`,がどう動いているのか分かりません。
準クォートはバッククォートの引数だけ評価するから
,`(,x ,x) は (,x ,x) になって
一番手前の準クォートは評価されてその引数を返す形になるから消えて
`((,x ,x) (,x ,x))
になるんじゃない?
処理系作ってみるのが一番理解できると思うけど
うちの環境だと
clisp 2.48(cygwin)
[1]> ``(,`(,x ,x) ,`(,x ,x))
(LIST (LIST X X) (LIST X X))
sbcl 1.0.48(win32)
* ``(,`(,x ,x) ,`(,x ,x))
`((,X ,X) (,X ,X))
仕様はコレ。
http://www.lispworks.com/documentation/HyperSpec/Body/02_df.htm 仕様どおりにリーダマクロを展開すると
``(,`(,x ,x) ,`(,x ,x))
=> ``(,(APPEND X X NIL) ,(APPEND X X NIL))
=> `(APPEND (APPEND X X NIL) (APPEND X X NIL))
となる(仕様上もうちょっと展開は続く)。
が、それぞれの時点で equal の意味で等しい範囲内での最適化が許されている。
この式を最適化すれば
`(APPEND (APPEND X X NIL) (APPEND X X NIL))
=> `(LIST (LIST X X) (LIST X X)) ;; *1
となり、 clisp 2.48 の例と一致する。
backquote が専用のマクロに展開されるような処理系だと、
`や,の情報を展開後も保持できる。
ここで
(LIST X X) == `(,X ,X)
(LIST `(,X ,X) `(,X ,X)) == `((,X ,X) (,X ,X))
であるから、 sbcl 1.0.48 の例も正しい。
ほー
>準クォートはバッククォートの引数だけ評価するから
>,`(,x ,x) は (,x ,x) になって
その理屈だと
,'(,x ,x) も (,x ,x) になるから違うよ
>If the backquote syntax is nested, the innermost backquoted form should be expanded first.
>This means that if several commas occur in a row, the leftmost one belongs to the innermost backquote.
混乱してきたので、誰か訳して><
もしバッククオートシンタックスがネストしていた場合、
最も内側のバッククオートが最初に展開されなければならない。
これは以下のことを意味する。
複数のカンマが文の中に現れた場合、
最も左のカンマは最も内側のバッククオートに属する。
505 :
503:2013/12/06(金) 17:26:52.36
>>504 トンクス。r5rsの「準引用形式は入れ子にしてもよい。置換は,最外のバッククォートと同じ入れ子レベルで
現れる被 unquote 要素に対してだけ行われる」
最外と最も内側だから、schemeとCommon Lispで動作がちがうん?
the leftmost one belongs to the innermost backquote.ってどういう意味だ?
507 :
495:2013/12/06(金) 18:18:51.48
>>500 なるほどバッククオートもただのマクロなので
普通のマクロと同じく展開の過程を考えれば分かりやすいですね
once-onlyというマクロの定義で使われていたのが元々の出典でした。
`(hoge ,x) => (list 'hoge x)
`(hoge `(a ,(b ,x))) => `(hoge (list 'a (b ,x))) => (list 'hoge (list 'a (b x)))
``(,`(,x ,x) ,`(,x ,x))
=> ``(,(list X X) ,(list X X)) ; もっとも内側の`を展開
=> `(list (list X X) (list X X)) ; 二個目の`を展開
=> (list (list X X) (list X X))
= `((,x ,x) (,x ,x))
理解しました。
チートメモ
``,,x : 1度目評価される、2度目評価される
``,',x : 1度目評価される、2度目評価されない
``,`,x : 1度目評価されない、2度目評価される
508 :
495:2013/12/06(金) 18:20:48.66
*レスありがとうございました。
lisp勉強し始めたんだけどdisassembleできるんだねこれ(驚嘆)
ディスアセンブラが規格に入ってる唯一の言語 Common Lisp
common lispの闇は深い
>>506 ```,,,0 みたいのがあったとき、右端の`と左端の,がペアになるよ、という意味だと思う。
>>505 r5rs の場合 ```,,,0 == ``,,0
CL の場合 ```,,,0 == 0
というわけで違う。
513 :
503:2013/12/07(土) 07:23:03.95
>>512 ありがと。今迄どちらも同じだと思いこんでた。
なに、CLとschemeってバッククオートの挙動違ったのか!
初歩的でスマンのだけど、floatのビット表現ってどうやって出すんだろ
formatで出来るかなと思ったんだがggってもよくわからんかった
516 :
デフォルトの名無しさん:2013/12/07(土) 23:54:57.88
>>515 これかな。
浮動小数点数のIEEE754形式への変換
d.hatena.ne.jp/sile/20101023/1287829698
「"Common Lisp" float bit」でググって発見。
>>516 ありがとうありがとう・・・!single-floatもちょっと調べてできた
ggり方が悪かったようだ、反省
518 :
デフォルトの名無しさん:2013/12/08(日) 23:45:31.37
clisp
acl
ecl
ccl
cmucl
sbcl
maximaで使いたいけどれが最速ですか?
maximaはよくわからないが
とりあえずacl cmucl sbcl が早い
aclは高いから論外だな
520 :
デフォルトの名無しさん:2013/12/09(月) 05:05:19.45
ありがとうございます。
aclは無料版です。
Macのダウンロードしたら派手なGUIでビックリ
(let* ((para1 3)
(ary (make-array (list para1 3) :initial-element 0)))
(dotimes (i para1) (setf (aref ary i 0) i)
(print ary)))
;; #2A((0 0 0) (0 0 0) (0 0 0))
;; #2A((1 0 0) (0 0 0) (0 0 0))
;; #2A((2 0 0) (0 0 0) (0 0 0))
途中で送ってしまった。
clozure cl armlinux 1.8で実行すると、結果が
>>520のように
おかしくなるんだけど、これはバグかな?
(正しくは
;; #2A((0 0 0) (0 0 0) (0 0 0))
;; #2A((0 0 0) (1 0 0) (0 0 0))
;; #2A((0 0 0) (1 0 0) (2 0 0))
となるはず)
sbclは
#2A((0 0 0) (0 0 0) (0 0 0))
#2A((0 0 0) (1 0 0) (0 0 0))
#2A((0 0 0) (1 0 0) (2 0 0))
だね
524 :
デフォルトの名無しさん:2013/12/16(月) 01:14:15.99
>>523 検証ありがとうございます。ideone(clisp)でもそうなりました。
またdotimesのpara1を3に変えると、なぜか正解になるので、やっぱりバグみたいですね。
arm linux clozure cl ver 1.9が出ていたので、インストールして確認したら、
ちゃんと修正されていました。
(c == '-')ってすごく顔文字みたい
かわいい
誤爆しました
和んだ
`(,`(,`(,"-"))) 僕イモムシ
((("-"))) ワワッ評価されちゃった
リストの区切りが空白文字なのは地味に嬉しい
最近気が付いたんだがLispがあればCSVとかいらなくなるんだな
始めに(defun つけてうまくかっこつけてスペースでデータ分けれるし
これがデータとしてのコードとか言われる由縁なのか
はぁ?
ひぃっ!
ふぅ…
へぇー
ほ、ほーっ、ホアアーッ !! ホアーッ !!
deleteってcar部消えないの?hyperspec読んでもよくわからんかった
(setq a '(1 2 3))
(delete 2 a) => (1 3)
a => (1 3)
(setq b '(1 2 3))
(delete 1 b) => (2 3)
b => (1 2 3)
>>538 与えた配列は結果を構築するために再利用されうるという意味で破壊的なのであって、あくまで返り値が delete の結果。
Side Effects の項に書いてあるのはそういう意味。
まあ、nconcとnsubstitute以外は副作用を期待して使うなって話もあるしね
なるほどねーthx
・setq のような special form ってユーザー定義可能なんでしょうか?
・以下のクロージャを (myfun 10) のようにコールする方法はありませんか?
> (setq myfun (let ((cnt 0)) (lambda (delta) (setq cnt (+ cnt delta)))))
> (funcall myfun 10)
10
> (funcall myfun 10)
20
> (funcall myfun 2)
22
・以下のクロージャを (myfun 10) のようにコールする方法はありませんか?
setqじゃなくてsetfを使うならsymbol-functionを使って
(setf (symbol-function 'myfun)
(let ((cnt 0)) (lambda (delta) (setq cnt (+ cnt delta)))))
(setf (fdefinition 'myfun) (let (lambda (.....
じゃだめですかね?
まちがえた
・setq のような special form ってユーザー定義可能なんでしょうか?
special formと呼ばれるものは仕様で決まっていてユーザー定義できないが、使う側から見ればspecial formとマクロとは変わらないのでマクロを定義すれば望むことはできるはず
テキストデータを高速にパースして読み込むライブラリって何か定番あるんですかね
適当にread-lineとか使って自分で書くと数十MBくらいのファイルでもう速度が気になりだしてしまう
549 :
542:2014/01/01(水) 10:33:34.61
みなさん、ありがとうございます。
マクロの使い方も分かってきました。
(defmacro mysetq (x val) `(set 'x ,val))
550 :
542:2014/01/01(水) 13:27:09.69
訂正、
(defmacro mysetq (x val) `(set ,x ,val))
でした。
551 :
542:2014/01/01(水) 13:31:17.92
↑
これも間違ってましたね・・・
さすがに setq, setf, quote どれも使わずに手製 setq の実現は無理なんでしょうか
(defmacro mysetq (x val) (setq ,x ,val))
>>551 (defmacro mysetq (x val) `(set ',x ,val))
setqというのはset + quoteらしい。
closのインスタンスのプロパティーを表示させたいんだけどいい方法ない?
例えば、クラスfooのインスタンスがa=1,b=2のプロパティーを持っていたとすると。
#<foo (a=1, b=2)>
みたいに表示される関数が欲しいんだけど。
書き込んだ瞬間に思い出したinspectでいいね。
スレ汚しすまん。
>>552 ああ、defmacro テンプレートでの「,」(評価する)は対応するパラメータ記述そのままに置き換えられるんですね。
最初混乱しましたが、やっと分かってきました。
パッケージの使い方ややこしすぎて混乱する
何か良い説明してる所はないのかな
解決しました
common lispのループマクロは
pythonのリスト内包表記のように
[(x, y) for x in range(2) for y in range(2)]
=> [(0, 0), (0, 1), (1, 0), (1, 1)]
こんな感じのことは出来ませんか?
単純に考えたら2重ループになってしまった。
Common Lispにタプルはないのでリストで代用。
(loop for x below 2 nconc (loop for y below 2 collect (list x y)))
=> ((0 0) (0 1) (1 0) (1 1))
やっぱりloopを二重にしないと出来ないんですね
納得しました
(defmacro loop* (a b c x-max d e f y-max)
`(loop for x below ,x-max nconc (loop for y below ,y-max collect (list x y))))
(loop* for x below 2 for y below 2)
;=> ((0 0) (0 1) (1 0) (1 1))
次は3重以上も対応するようにしてみよう
563 :
デフォルトの名無しさん:2014/01/09(木) 19:22:39.83
(defmacro loop* (&rest arg) (gen-nested-loop (group arg 4)))
(defun gen-nested-loop (clauses &optional syms)
(if clauses
(let ((sym (gensym)))
`(loop for ,sym below ,(nth 3 (first clauses))
nconc ,(gen-nested-loop (rest clauses) (cons sym syms))))
`(list (list ,@(reverse syms)))))
(defun group (lst n)
(labels ((rec (lst acc)
(if (nthcdr n lst)
(rec (nthcdr n lst) (cons (subseq lst 0 n) acc))
(reverse (cons lst acc)))))
(rec lst nil)))
564 :
デフォルトの名無しさん:2014/01/10(金) 00:23:52.34
Common Lisp で ssh 用のライブラリはありますか?
ネット上を探してみたのですが見付かりませんでした。。。
"hoge"を:hogeにする方法ってありますか?
(intern (format nil ":~a" "hoge"))
こーゆーこと?
それだと|:hoge|になるので違います
568 :
デフォルトの名無しさん:2014/01/11(土) 20:41:40.60
(intern "HOGE" :keyword)
;=> :HOGE
:hoge は keyword:hoge の略記。
おお!
勉強になりましたありがとうございます
苫米地英人って胡散臭い人だと思っていたけど、LISPでは偉い人なの?
Wikipediaの引用で悪いけど
http://ja.wikipedia.org/wiki/%E8%8B%AB%E7%B1%B3%E5%9C%B0%E8%8B%B1%E4%BA%BA >プログラム言語であるLISP言語の論文を、かつていくつか発表していた時期がある。[38] 、イェール大学大学院では、
>オブジェクト指向LispのTプログラミング言語により、超並列処理システムなどを構築している[39]。
>カーネギーメロン大学計算機科学部に移籍後は、Common Lispの生みの親、スコット・ファールマン
>(Scott Fahlman)教授の下でLispプログラミングを勉強し、この縁からファールマンがジャストシステム
>ピッツバーグ研究所所長に、苫米地が取締役に就任した[40]。帰国後もCommon Lispの研究を続け[41]、
>通産省の援助でCommon Lispで記述されたWeb サーバである、Lispache サーバなどを発表している[42]。
>また、Common Lispにおける動的オブジェクト指向モデルのCLOSの普及にも尽力している[4
なんかやたらすごいじゃん。
このスレのスーパーLiSPハカー諸兄による評価お願い
凄そうに書いてはあるけど、凄いうちに入るのかなぁ?
573 :
デフォルトの名無しさん:2014/01/13(月) 16:19:36.03
ジャストシステムの時点でショボイが
その海外事務所のサブはかなりショボイ感
ファールマン教授、そんなショボイとこの所長やってたの?
お前らの所属と経歴はどうなんだよw
省略名がMITな日本の大学の僕からみればCMUに行けるだけでもすごいなぁ
苫米地すごいな
室蘭?
なんで経歴そんなにすごいのにインチキおやじになっちゃったんだ?
鳩山とか見てたらだいたい理解できる
苫米地ってkeyholetvも作ったんだよな。
アナログテレビ時代にアナログテレビが全部ネットで見れたソフト。
裁判になったら放送法の問題点があらわになるから訴えられるのを
待っていると言っていたが結局訴えられないままアナログ放送終わった。
アスミンおめでとう
なんでや!Lispとは関係な……くもないのか
イメージキャラクターをLispエイリアンにしなかったのが敗因
声優と結婚って楽しいのかなぁ?
やっぱりエッチの時の声がな
ちびまる子ちゃんはやめてけれ
588 :
デフォルトの名無しさん:2014/01/17(金) 08:20:56.32
コバペロ「ンーwwwwwwwwwwwwwwwwwwwwwwww」
複数行にわたる文字列のうち行頭のタブ文字や空白を取り除こうとしているのですがうまくできません
対象となる文字列は
"
a
[space][space]b
[tab]a
[tab]
c
"
こういうもので[space]は空白文字が、[tab]にはタブ文字が入ることを想定しています
(cl-ppcre:regex-replace-all "^\\t" string "")
ならタブ文字は削除できたのですが
(cl-ppcre:regex-replace-all "^\\t" string "")
では行頭からタブ文字を探せていないようなのです
どこを修正すればよいですか
正規表現"(?m)^\\s+"はどうでしょう。
通常^は対象文字列の先頭のみにマッチします。
そこで、(?m)によって^が対象文字列中の改行後にもマッチするようにします。
\\sは(スペース、タブなどの)空白文字一般にマッチします。
591 :
デフォルトの名無しさん:2014/01/18(土) 13:55:02.64
>>589 (regex-replace-all (create-scanner "^\\t" :multi-line-mode t) string "")
592 :
589:2014/01/19(日) 01:09:03.37
>>590-591 ありがとうございます
複数行にわたる処理のオプションを適切に指定しなければならなかったのですね
\sについてもありがとうございました
Lispエイリアンがすごく愛らしく思えてきた。疲れてるのかな
>>593 スカリーさんが居ないのがLisp界隈の不幸なのかもしらん
>>595 とりあえず突っ込みどころをつっこんでくれ
仕事でcommon lisp使ってる人ってその前に何の本読んでから使ってるんでしょう
実践/実用 Common Lisp のどちらか読んでるのか、あるいはSICPとかから入っていろいろと読んでいるのか
どれくらい読んでると最低限仕事に使えてるものなのかが知りたいです
処理系のマニュアルも結構読むのでしょうか
>>597 CLTL2
処理系のソース
各種ライブラリのソース
いつでも参照するのが CLHS
実践/実用 Common Lisp とかは, ずっと後になって斜め読みした程度.
>>598 > 処理系のマニュアルも結構読むのでしょうか
ふつう読むだろ?
gcc とかだって, 処理系マニュアル読まないと使えないんじゃないの?
"~/hoge/huga.lisp"を"/home/user/hoge.lisp"にする関数を教えて下さい。
elispではexpand-file-nameで出来たのですが。
ずっとLinux上でコードを書いていて
ファイル中で(load "~/Dropbox/hoge.lisp")としていたのですが
windowsで動かそうとするとエラーが出たのが経緯です。
(windows上で(user-homedir-pathname)で変えるパスにDropboxはあります)
(with-open-file (stream "~/hogehogefile" :direction :output)
(format stream "hoge~%"))としてみると
error opening #P"d:~/hogehogefile": Unknown error
[Condition of type SB-INT:SIMPLE-FILE-ERROR]
となってしまいます。
>>602 レスありがとうございます。
ふむふむ、この方はディレクトリを監視するプログラムにおいて
監視先ディレクトリを#+MSWINDOWSで変えるという手法を取っていますね。
しかしloadの~展開に関して#+MSWINDOWSを組み合わせる綺麗な手法が思いつきませんでした。
loadをラップして自分で~を展開するコードを書いたらうまく動きました。
(皆こんなことやってるのかなぁ?)
(defun expand-file-name (path)
(if (equal (subseq path 0 2) "~/")
(merge-pathnames (subseq path 2) (user-homedir-pathname))
path))
(defmacro load* (str) `(load ,(expand-file-name str)))
;(load "~/Dropbox/hoge.lisp") ; windowsでは動かない
(load* "~/Dropbox/hoge.lisp") ; どちらでも動く
604 :
デフォルトの名無しさん:2014/01/26(日) 18:53:15.90
>>603 パスネームを使えばいいのでは。どうしても文字列と "~/" を使わないと駄目なの?
(defvar *dropbox-directory-pathname*
(merge-pathnames (make-pathname :directory '(:relative "Dropbox")
:version :newest)
(user-homedir-pathname)))
(defvar *hoge-lisp-pathname*
(make-pathname :name "hoge"
:type "lisp"
:version :newest
:defaults *dropbox-directory-pathname*))
(load *hoge-lisp-pathname*)
605 :
デフォルトの名無しさん:2014/01/26(日) 18:58:47.79
あと、
>>603のコードが「どちらでも動く」というのは、たまたまその処理系が
Windowsでも "/" をディレクトリ区切り文字として解釈する実装になっている
からではないかと。厳密には可搬性は無いと思う。
>>602 hogeキチガイは早く消えろ。
ふむふむじゃねーよクズが。
>>599 >CLTL2
>処理系のソース
>各種ライブラリのソース
> CLHS
なるほど、規格とか処理系自体に関することの方なんですね。
>マニュアル
読むか読まないかだったらそうでしたね…(つまらない質問ですみません)。読むというのは必要になった時都度該当箇所を読む感じなのでしょうか、それとも頭から読んでしまっていますか?
どの程度の人数・期間の、(差し支えなければ)どういった種類のプロジェクトで使ったのかも興味があるので教えてもらえると嬉しいです
>>607 業務で CL 使うなんてのは,
o やたら, 仕様がコロコロ変わるけど, 納期の壁はいかんともしがたい
o 該当jobに精通したエキスパートが少ない
o マクロ, リーダーマクロに頼りきりって取り敢えず動作させる
てな, プロジェクトにしか使えないっす
現実的には, 実験要素てんこ盛りの研究開発用のプロトタイピングが
ほとんど. メンバー数も, 多くて 5人程度
もしくは, 一人で思いっきり趣味に走れるプロジェクトとか
lispは神秘のベールに包まれてるけど魔法じゃないからね
>>607 追加
> 読むというのは必要になった時都度該当箇所を読む感じなのでしょうか
とりあえず, 目は通します.
少なくとも, 性能ネックになった場合,何とかなるかならないかを判断できる程度には
>>607 はるか大昔、ある特殊なプログラミング言語環境(今で言うDSL)を Lisp で作ったり、
ウェブサーバ(HTTPサーバ)の開発プロジェクトに関わった事があるなぁ(どちらも
民間企業の業務)。Lisp じゃないけど Scheme(STk) で弁当屋の売上管理システム
作ってた人がいたっけ。雑誌名は忘れたけど紹介記事が載ってたな。何で Scheme
で!?って思ったけどw
>>608 だよね〜
>>608 >>611 なるほど、やはりそういうピーキーな使い方になるんですね。
質問を重ねて申し訳ないのですが、業務で使うという場合だと他の言語と比べるとどのへんが使いにくい点になるんでしょう? ライブラリとかノウハウの充実度なのでしょうか。それとも納品の都合なども絡んで来るのでしょうか。
>>612 > 業務で使うという場合だと他の言語と比べるとどのへんが使いにくい点
メンテナーの確保
ライブラリについては良く聞く話だな
ライブラリに依存しない部分的な処理だけLispで書いてもいいのかもしれんが
規格を調べる気にもならない。設計をやり直した方がいい。
やっぱりそうですね
すっきりしました
なるほどメンテナー…。
参考になりました。お答えいただいた方々ありがとうございました。
Common Lisp初めてみたいんだけどSBCLッテイウノデイイノ
いいんじゃない
なんならSBCLとclisp両方入れてみたら?
rubyのobject.methodsみたいにCLOSオブジェクトに適用可能なメソッドを調べ上げる方法はないんでしょうか。
>>621 MOP の SPECIALIZER-DIRECT-METHODS とか SPECIALIZER-DIRECT-GENERIC-FUNCTIONS
とかじゃダメ?
CLOS が PCL ベースのやつだとサポートしてそうだが…
>>622 ありがとうございます!まさにこれでした。
(defclass hoge nil nil)
(defmethod hoge-method1 ((h hoge)))
(defmethod hoge-method2 ((h hoge)))
(defparameter hoge-instance (make-instance 'hoge))
(moptilities::specializer-direct-methods (class-of hoge-instance))
=> (#<STANDARD-METHOD HOGE-METHOD2 (HOGE) {10041BCD43}>
#<STANDARD-METHOD HOGE-METHOD1 (HOGE) {1004145BC3}>)
624 :
デフォルトの名無しさん:2014/02/01(土) 02:03:45.34
>>623 頭も悪い、やる気もないならプログラミングなんかやめれば?
お前みたいな奴が書き込むだけでスレのレベルが下がるんだよ
最近、スルー検定が増えたな
>>623 感謝とかいらないからhoge厨は二度とくるな。
オブジェクトのスーパークラスやサブクラスを取得するのにもmoptilitiesが必要なんだよな。
流石にそういうのは標準で入れておいてほしい。
>>624 質問です、よろしくお願いします
カラス、下痢と言わずに
カー、クダーというのはおかしいと思います
どしてそんな非国民言葉がリスプでは使われているんですか?
>>627 (use-package :sb-mop) とか (use-package :mop) とかするだけちゃうん?
first, restの方がすぐ意味が分かっていいよな
概念として異なる
俺はcar/cdrがいい
一穴主義、女は一人、セルも一つ!
restだあ?
浮気者!
>>632 そのレジスタが残ってるCPUがまだ現役だったらかなり怖い
firstとrestは5字と4字なので並べるとズレて気持ち悪い
LP64な環境だとレジスタが64ビットでintが32ビットだからレジスタに2ワード入るのでちょっとそれっぽい
>>636 ヒープを一回しか取得しないなら32ビットオフセット2つで管理すればよくね?
そんなのやだけど
32ビットモードでも64ビットレジスタを使うことは出来るのです!
インストラクションにサイズプレフィックスが付くのでちょっと非効率かもしれないけど。
IP32L64ェ
>>638 SPARC とか Power とか ARM あたりだと無理だよね
>>638 x86 の話?
REX prefix って 32bit モードだと別の命令にマップされてない?
x32 と勘違いしてない?
64ビット符号無し整数って使えないの?
リバーシをビットボードで扱ってみたいんだけど
SBCLかCMUCLのどっちが数値計算ライブラリが多いの
ライブラリが規格に沿って書かれていればどちらでも動くと思うが・・・
線形代数ライブラリならf2clのlapackを使えばいいのかな
Emacsで選択範囲部分の四則計算を行なえるようにしたいのですが、
どのように記述すれば良いでしょうか?
(defun my-calc-region (start end)
(interactive "r")
(setq answer (buffer-substring start end))
;;なんらかの処理
(kill-new answer);;回答をkill-ringに
)
たとえば100*200+300*400を範囲選択すれば、
140000がkill-ringに入るようにしたいです。
lisp無職はlispで金稼ごうとは考えないの?
最近は Clojure を使う仕事がほんの少しはあるからそっちかな
女が稼いでくれるから
Lispエイリアンってパブリックドメイン立ったのか
×立った
○だった
あんなもんに版権設定してどうするw
Lispを学べば東大女とやれる
俺はそう聞いたから今年からLispをはじめた
チンチンいじりながらコンスセル
今日悟った。リストなんて実は無いんだ!
それはたかだか一つのセルの表現形式でしかないんだと。
そして思ったね。
東大女はこんなおれにクラっときて足を開くんだと。
頑張るぜ
東大女となんてやりたいか?
学歴高い女とやるのは征服感があってなかなかよろしい
>>654 漫画家の描いたキャラなのにわざわざパブリックドメインだと明記するのは珍しくね?
確かに版権気にするようなものじゃないけど
(ql:quickload :cl-ppcre)
(ppcre:scan "[^+-<>]" "abc") ;=> 0
(ppcre:scan "[^+-<>]" "...") ;=> NIL
SBCLですが二番目がNILになってしまいます。
0が帰ってきて欲しいのですが、皆さんの環境ではうまく動きますか?
[^-+<>]
661 :
659:2014/02/16(日) 23:02:30.83
>>660 エスケープはバックスラッシュが2個いるのですね。
ありがとうございました。
662 :
デフォルトの名無しさん:2014/02/17(月) 12:44:39.53
LISPっぽいの作っているけどGC用の情報ってセルの構造体に含ませればいいかな
初めて作るもんでよくわからんのだが
664 :
デフォルトの名無しさん:2014/02/17(月) 16:02:07.64
>>663 いやアルゴリズムはわかるんだわ。
マークアンドスイープってやつにしようと思うんだけど、
そのマークをどこにするかってことなんだ。
セルの構造体に含ませる方法でいいよ
初めて作るんなら
>>665 でいいと思う。
もっと手抜きして Boehm GC もいいと思う。
>>666 たとえば他にはどんなアプローチがありますか
668 :
666:2014/02/18(火) 01:10:51.06
ビットマップを別に用意して、そこにマークビットを置く方法がある。
キャッシュメモリとか OS の copy on write とかとの相性で、
そっちの方が高速に動作する。
もちろん上手く実装すれば、だけど。
まー、そういったのは高速化手法であって、最初にとにかく作ってみようと
いう人があまり意識してもしょうがない。
あと、Lispとかの実装技法としては、オブジェクトじゃなくポインタの側に情報を
持たせる方法もあるけど、アーキテクチャに依存してトリッキーになるから、
オブジェクトの側に持たせればいい。
670 :
デフォルトの名無しさん:2014/02/18(火) 13:31:23.51
オブジェクトに持たせると、forkしたあとgcするとぐんにょりするのだ…。
再帰は楽しいが、遅いんだね
再帰的定義をした後にwhile版を定義して速度比較しながら勉強してる。
関数プログラミングの勉強なら、再帰を直接使わず高階関数を使って、
再帰を陽に書くのを減らしてゆく、というのが王道。
>>672 末尾再帰最適化する実装ならそんなに変わらないと思っていたが、そうでもないのかな。
>>673 >>674 初心者なので言われていることがサッパリわからない。言葉だけでも頭の中に入れておく。ダンケ
>>674 末尾呼び出しをジャンプにする最適化が効いてるかどうかをチェックしてからの
比較でないと、なんとも言えないと思う。
> 末尾再帰最適化する実装ならそんなに変わらない
賢いコンパイラなら同じコードに落ちるけど
単に末尾再帰で書いてないとか
一般論として、例えばこんなコードがあったとして、
(defun my-for-each (fn lst)
(when lst
(funcall fn (car lst))
(my-for-each fn (cdr lst))))
fn に my-for-each を定義する関数が渡されることがある。
例えば、
(my-for-each
(lambda (a)
(print a)
(defun my-for-each (fn lst) nil))
'(a b c))
このような場合、ループせずに一回目の呼び出しで終了しなきゃならない。
つまり my-for-each は末尾再帰ではなく、末尾呼出と呼ぶべきもの。
で、末尾呼出はただのジャンプ命令に変換しちゃいけない。
毎回同じ場所にジャンプできるとは限らないし、
arity の違う関数に束縛されてるかもしれないから。
一応 Common Lisp では
「関数fの呼び出し中にfの束縛が変更されないと仮定してよい」
というような規則があるので、
コンパイラによってはループに変換するかもしれない。
でもそれはコンパイラの方針によるのであって、
「賢いコンパイラなら」というのは誤り。
動的なコード変更を重視する処理系なら、このような仮定はしない。
まあ、色々あって、Common Lisp では再帰とループは使い分けるのが普通だと思う。
処理系実装の話になると元気になるの、ワロタ
>>679 この書き込みを理解できるようになるのが一つの目標だ
ガンバるぞ
再帰とループが違う例としては動的すぎる気が。もっと簡単な例ないかな。
pythonをS式で書けるようになっただけ?
初心者はこっちだったのか
お前らcl21のことどう思ってんの?
頭が悪いからなかなか進めない
頭が良い人はいいなあ。
折れもさんざん頭が良いと言われてきたけれど、それはなんとなく「普通」の人と較べてで、
パッパと進んでいくには
「人間じゃない」レベルの頭の良さがいる。
はあ、そう生まれた人はいいなぁ
ま、仕方ないのでじっくりと時間をかけてなんどもやって、少しずつ直感化していく。
>>687 みんな過程ではそう思う。
どう頑張っても積み上げ以上のことはできないんだから。
適当なもの作って「俺意外に出来るな」って勘違いすることも大事だと思うよ
訳分からん→時間をかけてようやく理解→全能感→さらなる課題を発見→訳分からん→以下ループ
あるある。
「リスト遊び」何とか最後までやった。本の後半を消化するまで後二週間くらいかかるかな。
しめて二ヶ月。
次は「初めての人のためのLisp」か「Schme手習い」をやってみよう。もう、どっちも手元にある。
亀の歩みだけども、じりじり前進。
693 :
デフォルトの名無しさん:2014/02/26(水) 11:01:38.93
Windows(ccl) で cl-mysql を使いたいのですが、UTF8の文字が ? になってしまいます。
MySQL、ccl、slime は UTF8 に設定しているつもりなのですが他にも設定が必要なところがあるのでしょうか。
chcp 65001
コマンドプロンプトとか言うゴミみたいなターミナルはどうにかして欲しいところ
696 :
デフォルトの名無しさん:2014/02/27(木) 01:18:36.79
なるほどコマンドプロンプトの文字コードの設定があるんですね。
これはどのように設定すれば良いのでしょうか。
slime とかに設定するものなのでしょうか。
set-macro-characterとかで設定したリードマクロって
パッケージをまたいでグローバルに作用しているようなんですが、
自分でリードマクロを定義すると他のライブラリを読み込んだときかなりの割合でマクロ文字が衝突します。
安全なリードマクロの書き方ってあるんでしょうか。
俺は使ったことないんだけど、
readtable まわりを弄るんだったと思う。
700 :
デフォルトの名無しさん:2014/03/01(土) 17:22:51.69
>>698 他のライブラリを読み込むときだけリードテーブルを初期状態に戻せばいいのかなと。
(let ((*readtable* (copy-readtable nil)))
(ql:quickload "my-favorite-library"))
なるほど
>>698 named-readtablesとかcl-syntaxとか使って管理
使うときだけ有効化
Lispの悟りについて語ってください
無
無を発掘して知ることだ。
nil を煮る。
ウェイトレス:お飲み物はコーヒーで良いですか?
Lisper:T
その後紅茶を黙って飲む事が悟りだ
開発環境の設定の質問をします
emacsでcommon lispを使っています
common-lisp-hyperspec-formatをときたま使うのですが
これでcontrol characterの項目を選択するとウェブブラウザで開いてしまいます
http://lispuser.net/emacs/lisphacking.html これのhyperspecの設定をしたおかげで
slime-hyperspec-lookupの方はemacs-w3mで見ることができ、かなり使いやすいです
common-lisp-hyperspec-formatもemacs-w3mで開くにはどう設定すればよいですか?
>>708 そのページに書いてある設定でいいと思うけど?
(setq browse-url-browser-function 'w3m-browse-url)
試してみたけど、この設定で slime-documentation-lookup と common-lisp-hyperspec-format の両方に反映されたよ。
common lispのバッククォートとアンクォートの動作がよくわかりません
(setq q '(a b c))
``(,q)
を評価すると`(,q)になるのがよくわかりません
`xを(backquote x)
,xを(unquote x)で表わすと
(backquote (backquote ((unquote q))))で評価すると
(backquote (q))で
`(q)になるはずなんですがなぜbackquoteの内側の(unquote q)は評価されてqにならないんでしょう
前スレで似たような質問に答えた気がする。
流れてると思うからもう一度。
backquote の仕様はこれ。
http://www.lispworks.com/documentation/HyperSpec/Body/02_df.htm ``(,q)
== `(APPEND (LIST Q) NIL)) ; `は内側から先に展開される仕様
== (APPEND '(APPEND (LIST Q) NIL) NIL)
これを eval すると
=> (APPEND (LIST Q) NIL)
一方
`(,q)
== (APPEND (LIST Q) NIL)
で、 ``(,q) の評価結果と等しい。
なので結果が `(,q) になるのは正しい。
実際には出てくる結果がequalの意味で等しければ
処理系は好きに変換していいことになっている。
なので、処理系によっては結果は `(,q) でないかもしれない。
>>686 CLには正規表現やらネットワーク周りやら標準では入ってないので
そういうライブラリを組み込んだ上で新言語と称したものがあってもいいと思うし
初心者にはアピールすると思う。
私にはLispを信仰することはできなさそうだ
>>709 すみません
確かに両方に反映されていました
失礼しました
>>711 ありがとうございます
backquoteを仕様通りに展開するとうまく動作するのは分かりましたが
let over lambdaで言われてるように動作を予測するのは難しいですね
外側のbackquoteと内側のunquoteを対にして読めばいいんでしょうか
今日からScheme手習いで勉強はじめた
訳本より原著の方が良さげだけど高いからいいや
原著は口語英語チックで俺はちょっとキツかった。
訳本の方が良いと思う。
718 :
無職:2014/03/08(土) 18:03:46.85
だれか教えて下さい。
clispでの入力履歴を、
前回に立ち上げていた時までさかのぼるには
どうするのでしょうか。
再インストールしたら出来なくなりました。
よろしくおねがいします。
環境
osx 10.6.8
CLISP 2.49
rlwrap使えばいいよ
720 :
無職:2014/03/09(日) 11:19:13.76
>>719 ありがとうございます。
忘れていました。思い出しました。
素早い返答、感謝します。
2ちゃんていいですね。
Scheme手習いってコモンリスパーにも役たつの?
やくにたつ
ていうか、再帰とリスト処理の基礎を徹底的にやる。どういうLisp方言かは関係ない。
あれは徹底的にやるのはlambda式とクロージャが中心だけどな。
ほぉ、そうなのか
ラムダ式とクロージャはSeasonedじゃなかったか。
別のパッケージ同士でシンボルを使おうとしたらパッケージ名::シンボル名になってて
eqがtにならないので嵌ったんだけどこういうのはキーワードシンボルで扱えばいいの?
>>729 キーワードでも良いけど、シンボルプール用のパッケージを別途作って
そのパッケージを件のパッケージ群からuseしても良い。
そういう用途ならexternしないで意図的にパッケージ名付でアクセスするのも衛生的で良いかもしれない
そういうやり方は思い付かなかった
すっきり書けそうありがとう
732 :
デフォルトの名無しさん:2014/03/12(水) 16:22:32.27 ID:weuLszB+
hunchentootで今のURLを取得するにはどうすればいいですか?
erlangの根底の考え方大好きなんだけど文法がどうしてもなじめなかった自分はすげーうれしい
ちなみに同じ理由でMLとかHaskellもなじめない orz
loopマクロで
(loop for i from 1 to 10 collect i)
みたいにiを1から10の範囲でなにかをすることは出来るのに
(loop for i from 10 to 1 collect i)
みたいな書き方は出来ないけどこれと同じことはloopマクロで出来ない?
(loop for i from 10 downto 1 collect i)
でいい?
専用のトークンあったのか
land of lispのloopマクロ周期表にもあったのに見逃がしてた
助かったよありがとう
ときどきでいいので upfrom や downfrom のことも思い出してあげてくだ(ry
3年ぐらいCommon Lispから離れてたのですが
何か大きな変更ありました?
パッケージが色々変わったという噂は聞くのですが
商と余りを求めるfloorとtruncateは名前が違うだけですか?
それとも何か違いがあるのでしょうか
以下のように、負の場合に違う。
> floor converts its argument by truncating toward negative infinity;
> truncate converts its argument by truncating toward zero;
'((1 a) (2 ab) (3 b) (4 a))
'((4 a) (1 ab) (1 a) (3 c))
のような二つのリストに対して
equalなものだけを抽出したリスト
'((1 a) (4 a))を返したいのですが
lispらしいやり方ってどういうものですか?
(intersection '((1 a) (2 ab) (3 b) (4 a)) '((4 a) (1 ab) (1 a) (3 c)) :test #'equal)
>>743 ありがとうございます!
お、おそろしい...(笑)
そんなに簡単にできるとは...
>>745 なるほど、、注意します。
一覧のページ、助かります!
ありがとうございます。
>>741 ありがとうございます。知りませんでした。勉強になります。
関数fとgがあるときにfの中でg、gの中でfを呼び出したら
どっちかを先に定義しないとダメだけどそれだと先に定義したほうで警告が出てしまう
これをfletやlabelsを使う以外にうまく書く方法はありますか
clips だとそもそも警告でない。
SBCL なら
(declaim (ftype function g))
とか書くといいよ。
ありがとうございました
declaimは型宣言で複雑だと思って避けてましたが省略できるんですね
751 :
無職:2014/03/24(月) 14:40:40.32 ID:02bTSQQc
CLOSの疑問。
スロットオプションの :initarg :reader :writer など冗長だと思いました。
構造体のコンストラクタやメンバへのアクセサ、型判定関数の
自動生成などは便利だと思うのですが、CLOSはなぜこうなのでしょうか?
いきさつなど、わかる方いますか?
また、CLOSに限らずですが、SETFを徹底的に使いまわすのはなぜですか?
クラスにでも構造体にでもメンバはすべて、
読み出し関数と代入関数の自動生成、以上。
と、してくれたら明快なのにと思ってしまいます。
私が無知なのでしょうか?教えて下さい。
CLOSはもともとLisp向けのOOPLとして設計されたのではなくて、
Lisp向けOOPLS群を記述するための最小メタOOPLとして設計された。
だから自動生成するための道具は揃えたから。自動生成が欲しければ自分で書いてねって主義。
みんなでいいの作ったらそれを集めて取捨選択すればLisp向け標準OOPLが出来るだろうと。
かつてのLispがそうだったように。
けどCLOS作ったらCLOSで良くなってしまって後が続かなかった。
自分で書くと言っても難しくない?って疑問への答えがPortable CommonLoops実装。
オブジェクトを1つ取り、2つにして返すリードマクロを書く方法はありますか?
例えば、$を欲しいリードマクロとすると次のように評価されるものです
'(obj1 $obj2 ($obj3) obj4) => (obj1 obj2 obj2 (obj3 obj3) obj4)
754 :
無職:2014/04/01(火) 10:47:18.75 ID:18w+IeRp
処理系によって動作を変える書き方、
わかる方いらっしゃいますか?
clispならこうなって、
sbclならああなって、
Clozure CLなら、、、という風に。
探し方が悪いのか辿りつけません。
よろしくおねがいします。
グローバルな定数 *FEATURS* に、実装依存の機能とかを示すシンボルが
登録されているけど、それに最低ひとつ含まれている、その処理系を示す
シンボルを使う、という解でいいのかな?
>>754 (progn
#+sbcl (print "sbclで実行されるよ!")
#-sbcl (print "sbclで実行されないよ!")
#+(and sbcl clisp) (print "sbclとclispで実行されるよ!")
#+(and win32 (or sbcl ecl)) (print "こんな条件もしてできるよ!"))
Lisp使いは特別にワタシをナメさせてあげるわ
ただし、ワタシを擁護するのよ
/ ̄ ̄ ̄\
/ノ / ̄ ̄ ̄\
/ノ / / ヽ
| / | __ /| | |__ |
| | LL/ |__LハL |
\L/ (・ヽ /・) V
/(リ ⌒ ●●⌒ )
| 0| __ ノ あんたもナメたいんでしょ♪
| \ ヽ_ノ /ノ
ノ ノノ_.\___ _ ノ( ((
( ((/ / ├─-..,
)/ ゝ ¬ ,r一 )
|ノ r" /
/ `y
{ c | c |
ゝ 人 丿
`- ー' \ __,. ィ
ゝ / /
/ ρ /ノ
/ 〈
これまで(lisp-implementation-type)と(lisp-implementation-verion)でがんばってたわ・・・
(setf a '+ b 1 c 2)として
(eval (a b c))が展開されて(+ 1 2)にならない。
(eval ‘(,a b c))ならできるんだけど、上の形で展開できるようにするにはどうしたらいいかな。
(funcall a b c) じゃダメなん?
(eval (list a b c))
すいません。ちょっとちがった。
(progv '(a b c d) '(1 + 2 3)
(eval (eql (b a c) d)))が真になるようにしたい。
基本的な事を色々勘違いしてないか?
>>762 その俺様evalをマクロで再定義するんだな。
>>725 へ?
へへへのへ?
まさか、最初から
(define foo
(lamda ()))
だからとか?
767 :
デフォルトの名無しさん:2014/04/13(日) 21:19:18.03 ID:opL5E73o
Lisp使いが滅多に表に出てこないのは社内で開発支援ツールを
作ったりしているからってホント?
それとも基本的には純粋に道楽で使うものなの?
自分でLisp実装するレベルじゃないとLisp使い名乗るのは恥ずかしい気がしてくる
>>769 おいらはCommonLispは作り込めないけど己をLisp使いだと思うけどなー
自前CommonLisp作れないと駄目とか言うと世界に何人いるんだろう?
#自前で多倍長整数とかRational表現組むだけで泣けるんですけど
Lisp以外のこともちゃんと知っていないと、Lisp使いは名乗れないって思ってる
何を言ってるんだお前は。 LISPを使ってる人がLISP使いだろ。
そう、使おうとする心こそがLISP使いがLISP使いであるためのただひとつの資格さ!
N88-BASIC使いの俺が通りますよ…
774 :
デフォルトの名無しさん:2014/04/13(日) 23:05:39.98 ID:kn+IksNB
Lispはマクロ用の言語として使われることが多いので、プログラマという感じじゃないのかも。
同じくマクロで使われるVBAもプログラマが使うわけじゃないし。
単に母数が少ないだけじゃね
アレじゃね?CG屋にはLisperが多いっていう。
CGオーサリングツールにはLispのってるんじゃね??
変換ミス修正版
Emacs Lispとかxyzzy Lispみて
マクロ言語とか言ってるんじゃないのか?VBA持ち出してるし
Lispの意味でのマクロの意味で使っているとは思えないな
VBAはアプリケーション組み込みマクロ言語としてしか使えないかもしれんが
Lispは組み込みマクロ言語としても使えるが汎用言語だぞ
基本何にでも使える
まあ、一番ユーザーが多いlispはelispだろうから、誤解されるのもしょうがないのかもね
世間一般じゃマクロといえばエクセルと言う印象なんだろうな
おれもlispを知らない頃はそう思ってた
elispで書くのはマクロじゃねーよ。
いつまでTECO引きずってんだ。
elispに今もあるマクロはdefmacroとkeyboard macroの二つだけ。
elisp infoやemacswikiのglossaryで確認しろ。
>>782 emacsのエディタマクロとlispのmacroが混線してない?
もうエディタマクロなんてないんだよ。
今あるのはキーボードマクロだけ。
emacsってEditor MACroSの略だと思ってたけど今は昔なんやね。
TECOの時代は終わったのさ。
Real programming languageで書いたコードはmacroじゃない。
>>787 VBもPythonもエディタマクロに使われているけど全否定?
Lispのマクロについて根本的に誤認している人がいるようだ。
Excelのマクロ言語はVBAであるとか
wzeditorはC言語ライクなマクロ言語を持つとか
そういう意味じゃないからなあ
>>789 elispはマクロじゃ無いって話の流れからついに一週してしもたかんじやね。
emacs lispはemacsの機能を拡張するMacro言語であるようにみえる
emacs lispではLispのMacroが使用できる
emacsにはKeyboard Macroと呼ばれるキー入力シーケンスを保存して再現する機能がある
emacsの名前の由来になったMacroとは、かつてテキストエディタTECO上で動作する特殊なマクロ言語でemacsが実装されたことによる
上記四つのMacroは全部別のモノ
emacsの話を出すとMacroがややこしくなる
マクロって命令の羅列のこと。
elispみたいな本格的なプログラミング言語のコードをマクロとは言わない。
vimはマクロと言っているなあ。
もはや死語に近いだろうな。
Intel CPU のマクロフュージョンも取り上げてみたい。
>>792 >マクロって命令の羅列のこと。
より正確には、「拡張操作をパッケージ化したもの。またはその機能」
プログラミング言語での「操作」を、命令の羅列で表現する事がよく有るという事。
何に(言語、ツール)言及しているかによって、「拡張操作」の対象が変わるというだけ。
macro??/mak'roh/ [techspeak] /n./
A name (possibly followed by a formal??arg??list) that is equated to a text or symbolic expression to which it is to be expanded (possibly with the substitution of actual arguments) by a macro expander.
This definition can be found in any technical dictionary; what those won't tell you is how the hackish connotations of the term have changed over time.
The term `macro' originated in early assemblers, which encouraged the use of macros as a structuring and information-hiding device.
During the early 1970s, macro assemblers became ubiquitous, and sometimes quite as powerful and expensive asHLLs, only to fall from favor as improving compiler technology marginalized assembler programming (see??languages of choice).
Nowadays the term is most often used in connection with the C preprocessor, LISP, or one of several special-purpose languages built around a macro-expansion facility (such as TeX or Unix's [nt]roff suite).
Indeed, the meaning has drifted enough that the collective `macros' is now sometimes used for code in any special-purpose application control language
(whether or not the language is actually translated by text expansion),
and for macro-like entities such as the `keyboard macros' supported in some text editors (and PC TSR or Macintosh INIT/CDEV keyboard enhancers).
パッケージはないw
>>797 「パッケージ管理システム」の"パッケージ"に限定しない話だろ?
限定しなくてもない。
マクロ化にパックの意味なんてない。
CLisp Win 64bit版の置き場を見つけられませんでした。
教えて下さい。初歩的な質問で申し訳無い。
ハンナ・ユスティーナ・マルセイユ
関数を返す関数の勉強のために
対話応答システムを作ってみたら
ゲロゲロの悲惨なものになった。ウーム。知らなさすぎる中で創るとわやになるな。
表示はdisplayのみ
キーボードからの入力はreadのみ
onlispの日本語訳はpdfやhtmlで無料で公開されてますが書籍と比べてどうですか
無料版だけで事足りますか
>>803 オンライン版を読んでから考えてみたら?
>>804 継続まで読んだんですが両方一通り読んだことがある人の意見が欲しいんです
英語版のon lisp基本にすれば、翻訳なんかなんでもいいような
lighttableでlisp使えるようにならにゃいかな
>>805 折れは1今、継続、勉強中
なんかわけわからんな、なんだこれは!
と勉強してたら
col is short for collection
;"continuation"
とか出できて
「おお、これが継続ちゅうもんかい!」
とある意味感激した
折れも継続身につけるとこまで来たんやあ
「カーカー、おまえはカラスかい!
人間、なめとんのか!、()ばかりやないカー!」
とリスプに喧嘩売ってた時がなつかしい
勉強も継続してください。
onlisp書籍版は表紙がいいし手触りも良い。
持ち歩いてちょっと汚れや痛みが付いてきた頃の風合いも良い。
onlispのhtml版はあくまで草稿だから図が抜けてたりするし
オーム社から出てる紙の本か電子版を買った方がいいとおもう
onlispの継続の実装ってsbclに入れると警告出まくるよね
実際にはcl-contを使うのがよい
恥ずかしすぎて質問しにくいのですが・・・
xyzzyで
(ceiling 120)
120
0.0
(ceiling 312 2.6)
121
-2.599988
なぜ後者は120にならないのか、初歩すぎて検索しても見つからない TT
ceilingは正の無限大に向けて丸めるからです。(切り上げ)
負の無限大に向けて丸めたければfloor、
0に向かって丸めたければtruncate、(小数部破棄=切り捨て)
一番近い整数に近づけたければroundです。(四捨五入)
いやそっちじゃなくて、
コンピュータ上でほとんど小数は近似値だよー、312/2.6=120.00001になっちゃうよー、って絡みの話では?
>>821,824
Lisp的に書くなら関数内で局所関数を定義すると思う
(defun member* (x lst)
(labels ((iter (lst cnt)
(cond ((null lst) 0)
((eq (car lst) x) cnt)
(t (iter (cdr lst) (1+ cnt))))))
(iter lst 1)))
Schemeの名前付きletを移植するとか (Let over Lambdaより)
(defmacro nlet (n letargs &rest body)
`(labels ((,n ,(mapcar #'car letargs)
,@body))
(,n ,@(mapcar #'cadr letargs))))
(defun member* (x lst)
(nlet iter ((lst lst) (cnt 1))
(cond ((null lst) 0)
((eq (car lst) x) cnt)
(t (iter (cdr lst) (1+ cnt))))))
鯖移転してたんだな
toroの817からのログを失うのはもったいない
818 : 815[sage] 投稿日:2014/05/23(金) 02:13:12.85 ID:Dj6yziyp
>>817 なるほど 120.00001 になるんだったら120にならないのは当然ですね
近似値になるって事を考えて試行錯誤し
2.6 を 2.6001にすると言う適当な事で対処しました・・・
819 : デフォルトの名無しさん[sage] 投稿日:2014/05/23(金) 08:31:19.17 ID:S9ZhBRpZ
じゃなくて、四捨五入にしないと危ないだろそれ。
820 : デフォルトの名無しさん[sage] 投稿日:2014/05/23(金) 08:41:53.80 ID:UMGtPnEJ
ラウンドやな
821 : デフォルトの名無しさん[sage] 投稿日:2014/05/23(金) 08:58:33.93 ID:UMGtPnEJ
リスプ勉強始めました。まだリスプらしい発想ができず知識もないのですが、C言語でいう静的局所変数の実現方がわからず次のようにしてみました。
もっと、まともな方法有るでしょうか?
;;;隠れ引数cntを利用して静的局所変数を実現する
;;;
;;;目的のatomが与えられたlistの何番目にあるか?
;;;なければゼロを返す
;;;(member* 'c '(a b c d )) -> 3
;;;(member* 'x '(a b c d )) -> 0
(defun member* (x lst &rest cnt)
(if (null cnt) (setq cnt '(1)))
(cond
((null lst) 0)
((eq (car lst) x)
(car cnt))
(t
(member* x (cdr lst) (+ (car cnt) 1)))))
821 :
2/6:2014/05/23(金) 23:35:29.81 ID:VIeF9Nr2
822 : 815[sage] 投稿日:2014/05/23(金) 09:13:01.50 ID:5/FhmPgX
>>819 なんて説明したら良いんだろう・・・
あるブラゲのカードの攻撃力を求める計算を良くするので
それを簡単に求めれないかと xyzzyのLisp入門見て関数作ったのです
Lv1時数値の0.08倍ずつLvUp毎に増えるので
Lv1からLv?の計算は簡単でした
(defun st計算 (ステ Lv) (decf Lv)
(+ Lv ステ (* Lv 0.08 ステ))
)
しかしLv10とかLv20とかからLv?で躓きました
LvUp済み数値は切り捨てられているため
その数値から計算した数値は必ず求めたい数値以下になる
なのでceilingで切り上げたのですが
丁度の場合 (/ 312 2.6) に落とし穴が><
後、四捨五入も最初試しましたが
Lv3のカードとか低Lv時にまずい結果となりダメでした
もっとスマートなやり方あるのでしょうが
現在問題なく計算出来てるため良しとしています
日本語入ってたり段落が・・・初心者丸出しですが晒します TT
(defun st (ステ 現L L) (decf 現L) (decf L)
(setq X (ceiling (- ステ 現L) (+ 1.001 (* 0.08 現L))))
(+ L X (* 0.08 L X ))
)
ステ = 現在のステータス値
現L = 現在のLv値
L = 求めたいLv値
822 :
3/6:2014/05/23(金) 23:36:52.93 ID:VIeF9Nr2
823 : デフォルトの名無しさん[sage] 投稿日:2014/05/23(金) 10:05:01.75 ID:fRyU8CgY
>>820 この例ではカウンタを引数渡しでいいと思う。
C言語でいう静的局所変数に相当する機能としてはクロージャがある。
ttp://www.geocities.jp/m_hiroi/xyzzy_lisp/abclisp11.html クロージャを使ってmember*を実装しようとするとこうなる。
(let ((cnt 1))
(defun member* (x lst)
(cond ((null lst)
(setq cnt 1)
0)
((eq (car lst) x)
(prog1 cnt
(setq cnt 1)))
(t (setq cnt (1+ cnt))
(member* x (cdr lst))))))
823 :
4/6:2014/05/23(金) 23:37:31.47 ID:VIeF9Nr2
824 : デフォルトの名無しさん[sage] 投稿日:2014/05/23(金) 11:01:01.63 ID:VIeF9Nr2
(defun member* (x lst &hidden (c 1))
(cond
((null lst) 0)
((eq (car lst) x) c)
(t (member* x (cdr lst) (1+ c)))))
(member* 3 '(1 2 3 4 5) 1) => ERROR
(member* 3 '(1 2 3 4 5)) => 3
みたいな砂糖が欲しい
825 : デフォルトの名無しさん[sage] 投稿日:2014/05/23(金) 11:14:23.71 ID:EZ1gF0i3
>>823 どうも有り難うございます。書いてもらったSample睨みながら勉強してみます。
826 : デフォルトの名無しさん[sage] 投稿日:2014/05/23(金) 11:15:49.84 ID:SQmi/tAr
nthに合わせて0オリジンじゃないと気持ち悪いな。
824 :
5/6:2014/05/23(金) 23:37:56.54 ID:VIeF9Nr2
827 : デフォルトの名無しさん[sage] 投稿日:2014/05/23(金) 11:24:51.58 ID:fRyU8CgY
>>821,824
Lisp的に書くなら関数内で局所関数を定義すると思う
(defun member* (x lst)
(labels ((iter (lst cnt)
(cond ((null lst) 0)
((eq (car lst) x) cnt)
(t (iter (cdr lst) (1+ cnt))))))
(iter lst 1)))
Schemeの名前付きletを移植するとか (Let over Lambdaより)
(defmacro nlet (n letargs &rest body)
`(labels ((,n ,(mapcar #'car letargs)
,@body))
(,n ,@(mapcar #'cadr letargs))))
(defun member* (x lst)
(nlet iter ((lst lst) (cnt 1))
(cond ((null lst) 0)
((eq (car lst) x) cnt)
(t (iter (cdr lst) (1+ cnt))))))
825 :
6/6:2014/05/24(土) 01:55:42.59 ID:78dmexXG
828 : デフォルトの名無しさん[sage] 投稿日:2014/05/23(金) 11:33:16.96 ID:C0KuPecL
>>827 たびたびサンクスです
どうも有り難う
829 : デフォルトの名無しさん[] 投稿日:2014/05/23(金) 11:46:22.83 ID:/J+wV7gv
できるだけ無駄をはぶきたくてライブラリ解読して、書き換えて自前のライブラリつくっていってるんだが、usocketの内部をだれか解説してけろ。
830 : デフォルトの名無しさん[sage] 投稿日:2014/05/23(金) 12:54:38.32 ID:3Eda7qDb
usocket-0.6.1/backend/使ってる実装.lispを参考にしてください。
"U"niversal部分はいらないだろうから。
ログが失われるほどの鯖落ちなのに
誰も騒がないところを見ると
本当にもう2ちゃんには人居ないんだな
>>828 Windowsでやるなら Clozure CL のがトラブルなくていいと思うよ。
と、アドバイスしつつ、エラーが断片的すぎてよくわからんゾ、といいたい。
readやread-charで引数にrecursive-pが真だと
再帰的に呼びだされるって説明があるけどいまいちよく分からない
readでrecursive-pがtだとreadの中でreadが呼びだされてnilだと呼びだされない?
それだとread-charもそうなのかな
ググっても例が見つからないし困った
>>831 英語苦手だしよくわからないよ
(set-macro-character #\@
(lambda (stream char)
(list 'quote (read stream))))
で
@(1 2 @(4 5 6))
としたら
(1 2 '(4 5 6))
となるし再帰的に処理されてるんだけどなあ
でも
@(#3=(1 2) @(#3#))
とかだと#3#が無いと怒られるしこれが再帰的に呼ばれないってことなのかな
833 :
831:2014/06/02(月) 22:02:17.48 ID:H3ihprqs
>>833 ありがとう
結局処理系によって動作が微妙に違って有耶無耶になってるね
>>830 内部で再帰的に呼び出すかどうかを呼び出し側で制御するための引数じゃないよ。
この呼び出しはトップレベルでの呼び出しではないう意味のフラグ。
内部処理でこのフラグを使う。
set-macro-character等で定義したコード内でも同様。
分かりにくい名前だけど。
preserving_whitespaceのケースが分かりやすい。
ああずっと勘違いしてたのか
readに再起されてることを教えるためにrecursive-pをtにするのか
すっきりした
837 :
837:2014/06/03(火) 00:08:51.38 ID:cDJn8bWQ
read macroのようにシステムの振る舞いを変える特殊な機構がなければ、
こんなものはプログラマーに見せる必要はないのだ。
逆に言うと、CL使う時はプログラマがいつも言語屋に近いことをやらされるというか、
出来るということを想定してないと意味が分かりにくいものが結構ある。
だからCLの本はマニアックなものが多い。言語屋思考が前面に出てる。
838 :
デフォルトの名無しさん:2014/06/03(火) 00:30:35.72 ID:Mp2Ed1vv
インスタンスとletによる束縛の範囲が良くわからないのです。
(defclass foo ()
((a :accessor foo-a)))
(defvar *bar* (make-instance 'foo))
(let ((obj *bar*))
(setf (foo-a obj) 1))
(foo-a *bar*)
=> 1
このとき、obj は let の中で操作されてるのに、何で外側の実態まで変わっちゃうんでしょう??
いっぽうで、
(let ((a (foo-a *test*)))
(setf a 2)
a)
=>2
(foo-a *bar*)
=>1
このときはちゃんとlet内でのみ束縛されてるみたいです。
839 :
837:2014/06/03(火) 10:40:12.45 ID:uQjrLyNg
Common Lispに限らないかなり初歩的なことを理解できてないので、
プログラミング入門的な本から始めることをオススメします。
ヒープオブジェクト、バインディング、ポインター辺りのキーワードから。
(setf (foo-a obj) 1)はオブジェクトの破壊的変更ですが、
(setf a 2)はバインディングを変更しただけです。
C++ で書いたらこんな感じかな。
#include <iostream>
class foo {
private:
int a;
public:
int& foo_a(void);
};
int& foo::foo_a(void) {
return a;
}
foo bar;
int main(void) {
foo& obj = bar;
obj.foo_a() = 1;
std::cout << bar.foo_a() << std::endl;
return 0;
}
>>839 便乗でききたいんだけど、
(let ((a b)) ...)
ってした時に、a に束縛されるものが、bそのものなのか、bの参照先なのか、ってどうやって判断するんですか?
letの仕様で判断するしかないだろ
letの場合、aに束縛されるのは、bを評価した結果だよ
>>841 bそのもの
という場合は、シンボルbの意味になるな
値と参照先の対比で言えば
シンボルbが値として有ることはない。あくまでシンボルbは或る値へのポインタを保持する
代入と言わずに束縛という理由の一つでもある
>>843 バインディングの場合は、シンボルが値を保持してるわけじゃない。
環境上でバインディングされてるだけだ。
>>839の説明がよくない。
ここは破壊的かどうかよりも、let が何を束縛するかが重要だろ。
letでaに何が束縛されていようが、
変数aにsetfしたらaの束縛の変更にすぎないのは同じ。
それより問題なのは「*test*」
質問です
cygwinにClozure Common Lispを入れています
ターミナルからClozure Common Lispを動かして
drakmaをquickloadで入れようとしたらエラーになりました
? (ql:quickload :drakma)
To load "drakma":
Load 1 ASDF system:
drakma
; Loading "drakma"
> Error: Unable to load foreign library (LIBSSL).
> Error opening shared library libssl32.dll : 指定されたモジュールが見つかりません。 .
> While executing: CFFI::FL-ERROR, in process listener(1).
which libssl32.dll や which openssl
でパスが帰ってくるのでそれらへのパスは通っているようです
どうすれば解決しますか?
DLLのロード、cygwinのパス使って解決はしないのでは。
ありがとうございます
cffiの仕組みがよく分からないので調べてみます
>>852 cffi というより cygwin の話。
cygwin 経由でファイル操作しようとした場合、 cygwin のランタイムライブラリは cygwin 上のパスから windows のパスへの変換をかけて処理する。
cygwin 用にビルドされていないアプリケーションは cygwin 上で動かしても cygwin のランタイムを経由しないので、 cygwin 上の設定を必ずしも反映しない。
Clozure にはロードパスを明示して指定するオプションがあるはずなので、それでライブラリの場所を直接に指定するといいと思うよ。
853 :
デフォルトの名無しさん:2014/06/23(月) 22:01:30.53 ID:/DPPu1fU
どなたか教えて下さい。
または、ヒントになるウェブ上の文章など
ご存知なら記入していただきたい。
lispは、関数がファーストクラスオブジェクトである。
だから、あーしたりこーしたりできる。
なにをもってファーストクラスオブジェクト
とする条件が整うのですか?
またそうでない場合は何と呼ばれるのですか?
セカンドクラスは存在しますか?
そもそもファーストクラスオブジェクトという存在の
起源はいつ、どこで、だれが発端なのですか?
他のデータと同じように変数に束縛できたり、
印刷できたり、ネットワークで送ったり出来れば、
ファーストクラスオブジェクト。
他のデータとくらべて、なにか大きな制限があれば
ファーストクラスオブジェクトではない。
「大きな」制限がないという意味は、例えば同じオブジェクトを二回送信して二回受信して、
eqにはならないがequalくらいにはなるというような類いのこと。
数字の1ならeqになるけど、リストならeqじゃなくてもいいかみたいな話。
そうでないものをセカンドクラスと呼びたければ呼んでもいい。
単なる英語で特別な意味は無い。
起源はたぶんLispだろう。他にこの手のことが話題になる言語は長い間なかったので。
855 :
デフォルトの名無しさん:2014/06/24(火) 15:16:59.52 ID:5xWJp1EJ
854さん、ありがとうございます。
データと同じ様に扱えればファーストクラスとのこと。
lispのプログラムとは究極的には
1, 関数の定義
2, 関数の実行(データを与えられて)
なので、すごく自由なんですね。
関数をネットワークで送るってどういうことなの
S式を送って受け手で評価するってこと?
他のデータと同じように扱えればというのは同意だけど、印刷できたりネットワークで送ったりはなんか違くね
あくまでプログラミング言語の表現上でできることによる分類だと理解してるんだけど
まあ厳密な定義がない言葉だから人によって違うのかもしれんが
印刷?よくわからん
ネットで贈るって環境込みでクロージャー送らないの意味なくね?
よくわからん
ALGOLか。
表示的意味論のStracheyさんだな。
861 :
853:2014/06/25(水) 22:06:41.59 ID:bfUMIbrs
ファーストクラスについて質問した853です。
854さんへ返事をした855も私です。
859を見て驚きました。
まさかウィキペディアに項目があるとは「灯台下暗し」でした。
3つ目のリンク(英語のウィキペディア)を、たどれそうですね。
特にそのリンク先の項目
Historyの、First and second class objects.からはじまる10行分の引用元は
おそらく以下の論文32ページの下の方、
Fundamental Concepts in Programming Languages
https://www.itu.dk/courses/BPRD/E2009/fundamental-1967.pdf に存在していて疑問のキモに近づけている気がします。
そもそも10行分の引用の後ろにある... [4] この索引4番。
上の論文を含む論文集の様なコレ(ググると出てきました)。
Higher-Order and Symbolic Computation
https://cs.au.dk/~hosc/vol13/contents.html これは、何なのでしょうね?
サブタイトルに
Volume 13, Issue 1/2 (April 2000) Special Issue in memory of Christopher Strachey
とあり、860さんも指摘するこの名前が、インメモリーオブの後にある。
とりあえずは、皆様のおかげです。ありがとうございました。
2ちゃんてスゴイ。
ILC応募はじまってるぞ。
そうか
おいおい、興奮しねぇのかよ
いくしかねぇだろうが
|i
\ |.|
ト\ /| ト
| トヽ / | | ト
| | トヽ\/| | | ト /
| | | ト\≧三ミゞ=イ/
ム彡''´ ̄ ̄  ̄ ヽ{__..
/ V´
ノ __ ',
,. == y ̄, __、\_ ) 世 界 的 で す も ん ね
|i }-| ゝ二 |/ ̄ ̄ /ニ,l
ヽ__ノ/ヾ _ ノ > }}
/ >≦'__ し / 乗 る し か な い
Vて二オカ (_,/}
Yこ二ノ!!| } こ の ビッ グ ウ ェ ー ブ に
Y⌒ 从 ∠)
从从从トミ _.ィニ二 ̄丶
ミ三三彡 ' ´ \ \
/ \ヽ
/ ミ;,. ', ',
| _ _ __ \',.',
ノ! | V7\ ´/
/ l /_ゝ| ト >__/ /
| ヽン ´ ヽー'
i| l
|:! ヽ |
| ト、 `ミ, l
>>862 ILCってなに?ググっても分からんかった
International Lisp Coference
>>866 "ILC Lisp" でググれば直ぐに出てくるんだが
情報リテラシー能力が欠如しているのかw
ググればすぐ出てくるものに、その反応こそゴミだな。
>>869 ILCだけで絞れなかったら次に思いつくのはLispだろ?
ここは何のスレだと思ってるんだよwww
ますますぶざま。
必死だな。
>>867 >>868 ありがとう
確かに情報リテラシー能力は足りてないと思う
人の検索キーワード見てると勉強になってる
情報リテラシーってのはどうでもよくてだな、ILCにみんないこうぜってはなしなんだよ。
初学者の俺にはきっと時期尚早
エキスパートたちは楽しんできてくれ
「驚異のエロトーク、君の彼女を越える?!人工彼女三号アケミチャン、今、Lispの可能性がここに具現する!!」
とか発表されるのかなあ
初学者だからどうとかではなく、参加して信仰心を示すことが大切なのだよ、君。
あらら、そりゃくずだわ
信仰心!
あ、くず
そりゃ、くず
まじ、くず
くずの3乗!
Faith Bookですね
このスレ、ヘンなのが居ついちゃってからどうもダメだね。
ILC 2014 ってカナダ モントリオール現地集合やんけw
そういや、小俣さんからカリフォルニア現地集合のセミナー案内が来たことあったな
そんなんをさらっと日本語メールで送ってくるなって思った
>>882 モントリオールだとフランス語わからんと生活ままならん
英語だけだとちょっといぢめ入るんだよあそこ。
非常口とか全部フランス語
linuxでlispつかってるプログラマーの環境が知りたいです。
エディタなのかそれともlimpやlispboxみたいなIDEなのかとか
それと文字入力の組合せはiBus+Anthyよりuim + Anthyの方がいいのでしょうか?
iBus+Anthyでvim使おうと思うとキーボードで日本語入力への切替が出来ず、とても面倒だったので皆さんどうしてるのでしょうか?
vimmerでつ。
emacs 最強。
日本語入力は ddskk
>>886 emacsでし、日本語はATOKXなんだけど最近の環境に移行するのにはATOKマンドクサイ
emacsとmozc
ん?、emacsってローカル変数つかえないと聞いたなあ
正確にはemacs+sbcl+slimeって書けばOK?
893 :
886:2014/07/04(金) 05:55:47.78 ID:a+Sm66UT
>>892 lispboxを使わずにemacsでプログラミングしてるってことですか?
windowsではlispboxインストールしたけど、linuxもとりあえずemacsでやったほうがいいのかな
lispboxてemacs+slimeじゃなかったけ?
俺はemacs+slime+auto-complete+ac-slime+paredit+popwin
clojureのthreading macroおもすろーと思ってCLで書いてみたんだけど、
書き終わってみてなんか実際の使いどころが思いつかなくて休日を無駄にした気分です
日記
>>895 副作用許容するCLだと使いどころあんまないでしょ。
Loopマクロ完全理解とかの方がよっぽどお得、というかあれ完全に使いこなす人見てるといつも羨望のまなざししちゃう。
>>896 そうですね、やっぱりloopで自然に書けるところはそれで書いちゃうので
あと関数的でも名前長いとなんかいまいち読みやすくなった感がなかったように感じました
単純な関数の組み合わせは結構すっきり書けるようになったんでまあ無駄ではなかったと思いたいです
(-> last-page (+ i) (- 1))
(->> url (ppcre:split "/") #'last #'car (ppcre:split "\\.") #'cadr)
>>891 emacs24からスコープの扱いが変わったんじゃなかったっけ?
letがあるから昔からローカル変数はある。
スコープがレキシカルな変数、レキシカル変数のことでしょうかね?
emacs24からemacs lispでレキシカルスコープが使えるようになった
従来の動的スコープから変更になったわけじゃなくて、デフォルトは動的で、
何らかの指定をするとレキシカルスコープになる
動的スコープの関数からレキシカルスコープの関数を呼ぶこともできるし、逆も可能
ただしこのスレで今話題になってるのは、emacsでlisp使うと言っても、
emacs lispを使うわけじゃなくて外部のlispをemacs上で使う話でしょ?
emacs lispの静的スコープは設定で切り変えるんじゃなくて
昔のlispマシンみたいにclosure構文にしたほうがよかったと思う
そうか。
この地味に
そうか。
ってのむかつくんだけど
なにがむかつくってスレ開いて新着レスキタ - .∵・(゚∀゚)・∵. - ッ!!とかおもったら
そうか。
だよ
結構イライラするからやめてくれ
でまた
そうか。
だろ?やめろ
904 :
デフォルトの名無しさん:2014/07/10(木) 14:54:39.60 ID:np89A9e3
それ面白い都でも思った?
そうか。ってレスつくの期待してんの?
煎餅
布団
はじめまして。質問させて下さい。
1 yyyy-mm-dd
...
n yyyy-mm-dd
というテキストから、各行を名前に持つディレクトリをn個
生成するのはどうしたらできますか?
iphoneで撮影してdropboxのcamera uploadsに溜まっている
写真を整理しようと思い、
ls -h
cut -c-11
uniq
を調べながら使って冒頭のテキストを作るところまでできたところです。
誘導や「それならそもそもこういうやり方をすればもっと上手い」とかでも構いません。
よろしくおねがいします。
ubuntu 11.20です。
910 :
909:2014/07/13(日) 23:46:36.68 ID:YbxcgjxG
すいません追加です。できたディレクトリに、各日に撮影されたデータを
移動するうまいやり方ってありますか?
ファイル名の頭がyyyy-mm-ddとなっているのと、exif情報があります。
当方プログラミングはほとんどわかりませんが、以上よろしくおねがいします。
912 :
909:2014/07/14(月) 00:42:44.66 ID:QYx8kOpF
誘導ありがとうございました。こちらでの質問は取り下げさせて頂きます。
なぜここにきた。
lsとlispで関係あると思ったとか?
slとsbclで関係あるのかと思ったのでは?
ファイルとかディレクトリ操作でわざわざCLを使う気にもならない。
cl-fadとかを使って頑張るよりもシェルスクリプトを書いたほうが早いと気づいた。
こうして僕はまた一つ、大人になった
CLはその辺面倒くさいよね
パスネーム作るのもめんどくさいしファイルディレクトリ操作関連の関数名前長いし
関数名は長くてもコピペで終わりでしょ
マウス使えない人?
なんでそこでマウスがでてくるの? そこは自動補完使うだろ普通に
単に名前長いとコードが横に長くなるし見た目がごちゃごちゃして嫌いなんだよ
まあ何をする関数なのかがわかりやすいのは利点だけど
貧弱な表示器つかってるか
横に長いと読めないと言いたいだけ?
虫の居所が悪いなら酒でも飲んでさっさと寝なさいな
おやすみ
ファイルやディレクトリ操作はcommon lispに限らず
pythonとかでもシェルスクリプトより冗長になるけど
pythonやperlなんかはCLよりもう少し楽な印象があるけどなぁ
厳密に比較したわけじゃないけど
不満があるなら自分でなんとかしろってのがLispなので少し考えてみるか
外部コマンドの呼び出しも処理系依存だしexternal-programとかを使って違いを吸収してやる必要があるしな。
最近逆引commonlispが見れなくなって不便
ただでさえ情報が少ないんだから何とかしてよう
URL変わってた