【入門】Common Lisp その9【質問よろず】
1 :
デフォルトの名無しさん :
2012/03/05(月) 04:06:46.71
アセンブリとCommon Lispの関係は?
Common Lispでウェブアプリ書いてる人いる?
>>2 質問の内容が良く分からないけど、ネイティブコードにコンパイルする処理系なら、
内部でアセンブリ言語を中間形式として使ってたりするよ。SBCLとかCCLとか。
>>3 事例があるか、って話ならGoogleに買収されたITAが商売でやってたし、
日本でいるか、って話ならpaserveとかHunchentootとか使ってやってる人はいる。
ポール・グラハムおじさんを忘れちゃいけない
グラハムの話はウェブ黎明期の話だからな 今から新規にウェブアプリを開発するときにCommon lispを 使うのはかなりの冒険だろ
clackを忘れたら可哀そうだよー。 深町さん、はてなをLispに染めてくれんかな。
Lucid Common Lispはよくできていたな。
>>9 これFFIなのかな
FFIで呼び出した先で落ちたりすると結構涙目なデバッグする羽目になることあると思うのだけど頑張ってほしいな
Lisp界隈の進歩が亀のようにノロい理由として、 すぐに俺実装を作りたがって開発リソースが分散しがちというのが 大きな理由としてあると思っている。例えば clojure-py を見ろ。
何度目だこれ
俺実装を作るってのもニーズの一つだから良いんよ。 あとスレチなんよ。
自分はcommon lispの初心者にPAIPやCLtL2など限られた書籍をまず読ませる、 とどなたかわかりませんが書いていた覚えがあるのですが、 ご存じの方はいらっしゃいますか?
CPUがi7の場合 並列実行できると高速になるはずなのですが sbclはスレッドが不安定とも聞きます i7で一番高速な処理系はどれになるのでしょうか
>>15 >sbclはスレッドが不安定とも聞きます
ソースはどのあたり?
>>15 突っ込みどころは捨て置くとしても最速はFranzだと思うぞ
高いけど
OSはlinuxです ソースは以前にいろいろブログみてまわってた時の印象です
1.0.54のリリースノートで
> We still don't consider threads on non-Linux platforms good enough to enable
> them by default, but they're in a clearly better shape now.
って書いてるし、Linux以外の環境ではあながち外してもないんじゃいか。
とはいえ、
>>15 のソースは別口だとは思うけど。
この所SBCLはリポジトリに動きがない。みんな忙しいんだろうか。
>>21 Windows だけでってのは珍しいな。
androidでcommon lispを使った開発してる人 いますか? ググってみたところecl,abcl、cclあたりが候補になるのかな? あとsl4aというスクリプト実行環境を 利用する手もあるみたいです。 どれも敷居がたかそうだけど、lispで android開発できたら素敵だなっと。
>>23 CommonLispでなくて良いならClojureがswank丸ごと動くのでSlime使って開発できたりするよ
数値を受け取り、 1桁なら0を10の位に挿入して文字列として、 そうでなければそのまま文字列として返す処理はどう書けばよいですか? (defun num->string (i) (if (<= 10 i) (princ-to-string i) (format nil "0~A" i))) こう書いてみたのですが、princ-to-string と format が似たようなことをしているので 他の書き方は無いかと気になりました princ-to-stringとformatのどちらかを書かずに同じ結果を取得できないものでしょうか
formatの書式指定で出来る。
~2,'0d
(format nil "~2,1,,'0@A" 1) かな。
>>30 delayとforceが何をするものかを考えれば
簡易的な実現の一つとして、例えば
(defmacro delay (expr) `(lambda () ,expr))
(defun force (thunk) (funcall thunk))
というのもありだと分かるだろう。
(defun hoge () " ここにコメントを書く " foo) コメント部分に"とかを含めたい時ってどうやるんでしょ? Pythonみたいに"""みたいなことって出来るんでしょうか?
評価されるならいくつか逃げ道思い付くけど、docstringは「not evaluated」だし、
\でエスケープするしかないんじゃなかったっけ。
奥義のリーダーマクロを使えばどうとでもなるとは思うけど。
CL-INTERPOLに望みの機能があった気が。
http://weitz.de/cl-interpol/
36 :
デフォルトの名無しさん :2012/03/20(火) 10:07:11.65
関数の途中で処理をstopさせたいのですが。 C言語のreturnのように、途中で処理を戻す方法はありますか? (defun test-func () <中略> (if flag (message ”stop”) (message ”continue”)) <中略> )
38 :
36 :2012/03/20(火) 14:01:04.14
39 :
36 :2012/03/20(火) 21:26:44.25
>>37 すいません。以下をEmacsの上で実行したのですが、
(defun temp (x) (if x (return-from temp 'dummy)) 44)
(temp nil) => 44 はうまく行くものの、
(temp t) のほうは、以下のようにエラーが出てしまいます。
Debugger entered--Lisp error: (no-catch --cl-block-temp-- dummy)
正常終了してくれると助かるのですが。
Lispでオブジェクト指向プログラミングをやるときのスタイルについて質問です。 CLOSでオブジェクト指向をやろうとすると、オブジェクトのスロットの値の変更が必要になったりしますが、 Lisper的には普通にsetfで代入してしまうのか、あるいは変更する度に新しいオブジェクトを作ってそれを渡したりするのでしょうか。 そもそも関数プログラミングとオブジェクト指向やクロージャって相容れないように思えます。
>>39 (require 'cl)
でreturn-fromを使えるようになるけれど、
elispのdefunはブロックを作らないので、
(defun temp (x)
(block temp
(if x
(return-from temp 'dummy))
44))
とするか、Common Lispのdefun互換のdefun*を使って
(defun* temp (x)
(if x
(return-from temp 'dummy))
44)
ここまで書いといてなんだけれど、elispに関してはこっちで
Emacs Lisp 3
http://toro.2ch.net/test/read.cgi/tech/1191875993/
43 :
36 :2012/03/20(火) 23:15:25.05
>>40 >common lispの関数がemacs lispにあるとは限らない一例だね
あー、なるほど。
>>42 何から何まで親切にありがとうございました。
いいってことよ!
>>41 CLOSは普通に代入するスタイルですねー。
ただし、仰るような、関数的なオブジェクトシステムも存在します。
自分は以前Schemeで書かれたものをちらっと見掛けた程度ですが。
それと、OOPはさておき、クロージャは関数プログラミングでは不可欠な概念だと思います。
これがないと、例えばHaskellでもモナドのbindができなくて困るんじゃないでしょうか。
CLじゃ、標準だから当たり前だけど、CLOSは普通に使われてるんだよね。 自作オブジェクト指向システムも良いかもしれないけど、 自作ライブラリには、もれなく自作オブジェクト指向システムも付いてくることになったら正直辟易
クロージャは評価される度に内部状態が変わるような例題のイメージが強かったので副作用必須かと思ってけど、実際はそうでもないのか
>>49 (let ((n 0))
(defun f ()
(print (incf n))))
とかのことですか?
この手のコードは、変数のエクステントが分かりやすいから良く例に使われますけど、
関数fに参照透明性がない(副作用がある)のは、単に破壊的変更のせいです。
(let ((n 0))
(lambda () n))
のような形でもクロージャは良く使われますが、この式が返す関数に副作用はありません。
>>50 流石に例が不親切だった気がするので、もう少し実際のコードに出てきそうな例を。
(defun x+-all (x l)
(mapcar (lambda (y) (+ x y)) l))
こんな感じで、レキシカル変数を参照することは多いです。
これくらいじゃないとクロージャーっぽくないと思う (defun x+-all (x l) (mapcar (lambda (y) (lambda () (+ x y))) l))
>>49 λ式の評価器に必要なのがクロージャですから。
funarg問題のために。
54 :
デフォルトの名無しさん :2012/03/23(金) 21:01:06.44
任意の数の引数を取る関数に、一個一個引数をつけるのではなく、 リストか何かでまとめて渡したいのですが、どう記述すれば良いですか? (setq item1 '(item ”1”)) (setq item2 '(item ”2”)) (setq item3 '(item ”3”)) (widget-create 'radio-button-choice item1 item2 item3) の代わりに、 以下のように記述したいのですが。 (setq itemList '(item1 item2 item3)) (widget-create 'radio-button-choice 'itemList);; //NG
apply?
56 :
54 :2012/03/23(金) 22:42:16.67
>>55 applyとwidget-createの組み合わせだとうまく行きませんでした。
(apply 'widget-create 'radio-button-choice '(item1 item2 item3)) ;;NG
(widget-create 'radio-button-choice item1 item2 item3) ;;OK
以下だとうまく行ったのですが。
(defun seki3 (x y z) (interactive ”r”) (eval (* x y z)))
(apply 'seki3 '(2 3 4)) ;;OK
(apply 'seki3 2 '(3 4)) ;;OK
widget-create関数の使い方として以下を参考にしています。
なんとかリストで渡して選択画面を作りたいのですが。
http://www.dina.kvl.dk/~abraham/custom/widget.html#SEC16
58 :
54 :2012/03/23(金) 23:33:47.68
59 :
デフォルトの名無しさん :2012/03/24(土) 06:22:34.52
ごく基本的に質問ですみません。 リストのn番目の要素の値を変更はどのように書けば良いのでしょうか? たとえば、 (setq x '(”a” ”b” ”c” ”d”)) というリストがあった場合に、"c"の値を"C"と変更するにはどう書けば良いのでしょうか?
61 :
59 :2012/03/24(土) 06:57:45.55
emacsのslimeでcommon lispのソースを編集している際、 slime-eval-last-expressionで任意のs式を評価した結果(返り値)を そのs式の直後に改行して結果を貼り付けることはできないでしょうか。 今はソースのs式をコピーしてslimeのreplで評価し、 その結果をソースに手作業で貼り付けおり、面倒です たとえば(ceiling 1.1)とあるとき (ceiling 1.1) ;; result: 2 ;; result: -0.9 こういうふうに結果をs式の後に追記したいのですが、何か方法はありますか。
C-u M-x slime-last-expression
65 :
デフォルトの名無しさん :2012/03/27(火) 07:14:32.67
slime-eval-print-last-expression
間違えてageた上に遅れたorz
M-x slime-scratch っていう手もある
69 :
デフォルトの名無しさん :2012/03/27(火) 22:16:40.23
CommonLispでclojureの -> みたいな関数ありましたでしょうか?
>>69 同じような機能のものってことなら、CommonLispにはないんじゃないかな
Clojureのはメタ情報を活用してるから、同じ使い勝手のものを再現するのはなかなか難しいかも
Clojureの -> (arrow macro) を使うと (list (int (Math/sqrt 25))) を (-> 25 Math/sqrt int list) と書けるのか
paipとpclを読み終わってcommon lispでたいていのことはできるようになったと思います そこで質問しますが、common lispのスキルを上げるというかステップアップするには どういうものに取り組めばよいでしょうか? 2,3年で廃れてしまうかもしれない流行に左右されるよりも、 10年20年先でも通用するような新しい試みが何かあれば知りたいです
単にCommon Lispの知識が得たいなら、リーダーマクロやコンパイラマクロ、 パッケージやCLOS、MOPなどの細かい機能について調べれば良いと思うけど、 そういうこと? あとはマクロの応用とか。好みから微妙に外してる気がするけど。 現在のLispの世界では、あまり先進的な言語機能って研究されてないと思う。 Common Lispは今進化が止まってるし。Schemeのhygienic macroくらい?
処理系の実装やハック。有名なソースの読解やオープンソースやブログでの公開。 他には計算機科学系の論文でも漁ってCommon Lispの機能で実装してみるとか? 数年先にどんな技術が通用するかなんて分からんよ。 それに言語は目的があって使うものだから、言語自体のスキルアップの意味が分からん。 先進的な機能はライブラリとして実装されるから、言語自体の進化には見えないだけ。
さっき思い付いたけど、限定継続とかは割とLisp方面でも積極的に研究されてる気がする。 元ネタはFilinskiの論文? まあこっちもSchemeなんだけども。 言語自体を深く知ってもあまり意味がないことには同感。 他の言語で基礎はもうできあがってて、単にCommon Lispに親しみたいのか、 言語の機能は把握したので、次にアルゴリズムやデータ構造を知っていきたいのか、 その辺も教えてもらえれば、みんなもっと適切な助言をしてくれるんじゃないかな。
73です 皆さんありがとうございます
>>74 処理系自体を改変することよりも、使い方を磨こうと思っています。うまく言えなくてすみません。
>>75 >先進的な機能はライブラリとして実装されるから、言語自体の進化には見えないだけ。
これは盲点でした。たしかにそうですね
そして、paipを読んで強く思ったのですが、
>>76 さんのおっしゃるところのアルゴリズムやデータ構造が知りたい内容だとわかりました。
それらを体系的に(試しながら)勉強できる、(common)lispを使う教材があれば知りたいです。
いまさらアルゴリズムやデータ構造を知りたいのはプログラム自体の初心者か。 言語毎の差異は小さいから、アルゴリズム系の本を買ってCommon Lispで実装すると良いよ。 逆引きCommon LispやCommon Lisp CookBookのコード例も参考になる。 あとは定評のあるソースをたくさん読んで、とにかく何か自前で書く。 どの言語でも入門がすんだ後の本はあまりない。他人のソースを参考に自前で書くのが一番。 あとOn Lispは必読。
限定継続の勉強ならSchemeのほうがいいんじゃないかな。 限定じゃない継続を使ってさくっと実装できるし。
81 :
営利利用に関するLR審議中@詳細は自治スレへ :2012/03/29(木) 23:04:37.03
82 :
営利利用に関するLR審議中@詳細は自治スレへ :2012/03/31(土) 14:57:12.70
(setq allList '(("a" . ("a1" "a2" "a3")) ("b" . ("b1" "b2" "b3")) ("c" . ("c1" "c2" "c3")))) 上のような連想リストallListのなかの、"b"に対応する配列を差し替えたいのですが、 以下の(1)のように直書きするとうまく行くのですが、(2)のように(setf (nth 1 allList) '("b" . bList));と実行すると、 (3)以降を実行するのに、Wrong type argument: sequencep, bListとエラーが出ます。 どのように記述すればできますか? (setf (nth 1 allList) '("b" . ("b01" "b02" "b03" "b04")));;(1)OK (setq bList '("b01" "b02" "b03" "b04")) (setf (nth 1 allList) '("b" . bList));;(2)NG (setq myList (cdr (assoc "b" allList)));;(3)bの内容の表示 (setq i 0) (while (< i (length myList)) (message (concat "myList(" (int-to-string i) "):" (nth i myList))) (setq i (+ i 1)))
concatで怒られてるんじゃね? '("b" . bList) だと bListが評価されないから (list "b" . bList)に置き換えてみ。
>>84 間違えたorz
(cons "b" bList) か。
86 :
82 :2012/03/31(土) 23:15:56.58
>>83 ありがとうございます。
>(setf (nth 1 allList) '("b" . bList));;(2)
(2)のbListになにか符号をつけるなりして、(1)と同じかたちで読み込ませることはできるのでしょうか?
87 :
82 :2012/03/31(土) 23:17:18.54
あ、ちょうどタイムリーに回答いただけました。試してみます。ありがとうございました。
92 :
営利利用に関するLR審議中@詳細は自治スレへ :2012/04/02(月) 18:41:37.93
hunchentootについて教えて下さい。 複数のサブドメインを一つのサーバで扱おうと考えています。 cc.bb.com://AA/BB.html => cc.bb.com://cc/AA/BB.html の様にしてサブドメインをディレクトリに変換したいのです。 hunchentoot:hostでドメイン名が取得出来る事は分かったのですが、 うまくフック出来ません。 (defmethod handle-request :before ((*acceptor* hunchentoot::acceptor)(*request* hunchentoot::request))...) (defmethod hunchentoot:process-request :before ((*request* hunchentoot::acceptor))...) 共に全く引っかかりません。(一度も実行されないって事です) あと、この変換後の値で通常のディスパッチをさせたいのですが、そのやり方も教えて頂けませんでしょうか。 ググってもうまくサンプルが見つけられません。HUNCHENTOOTのドキュメントは簡単過ぎて私には全く役に立ちません。 ちなみにLISPもCLOSもWEBアプリケーションも初心者ですんで見当外れな事を書いてるかもしれませんので 目的が達成出来るなら手法にはこだわりません。ヒントで構いませんのでお願いします。
Apacheやnginxをリバースプロキシに仕立てた方が楽な気がする。 コンテンツごとに別々のacceptor作って。
94 :
営利利用に関するLR審議中@詳細は自治スレへ :2012/04/02(月) 20:51:44.84
>>93 ありがとうございます。
それも検討してみます。Apacheなんかで受けて各々振り分ける形ですよね。
あとは全てのアクセスを引き取って自分でディスパッチャー実装しちゃうとかも考えています。
レンタルVPSなんでメモリーがタイトなんですよ。出来たら裏で重い処理を走らせたいし。
アクセスはほとんど無いんで勿体ないってのもあります。
やり方さえ分かれば数行で出来る処理だと思うんだけどいかんせん資料が見つからないんですよ。
全称関数に:beforeを付ければ処理に割り込めるってのはあってます?
hunchentootのソースコード読めば理解出来るものでしょうか?
googleコードサーチも終わっちゃったんで、サンプル探すのに
koders上でhunchentootで検索しても25(重複入れても59)件しか無いとかどうしましょう。
あと、PORT指定なんかしてたんで混乱してました。
http://cc.bb.com/AA/BB.html =>
http://cc.bb.com/cc/AA/BB.html ですね。自分でも笑っちゃいます。
なるほど。じゃあ、hunchentoot:acceptor-dispatch-requestの特殊化は? 適当にacceptorを継承したクラスを作って、それ用のacceptor-dispatch-requestを定義して、 そのメソッドの中でrequestのホストを見て処理を分岐すれば良さそうな気がする。 acceptor.lispとかeasy-handlers.lispに書いてる既存の定義を見ればやり方は分かると思う。 流し読みなんで外してたらごめん。
hunchentoot-vhost.lispってのがある。
これか。 > (ql:system-apropos "vhost") #<SYSTEM hunchentoot-vhost / hunchentoot-vhost-20110418-git / quicklisp 2012-03-07>
98 :
営利利用に関するLR審議中@詳細は自治スレへ :2012/04/02(月) 23:34:26.97
>>95 流石です。発想が柔軟ですね。
私の中ではまだどうもLISPとオブジェクト指向が繋がっていないんですよ。
コードまで参照して下さったのですか?
理屈の上ではそれで行けそうです。あとは私の努力次第ですかね。
ありがとうございます。
>>96 ありますね。これは用途的にはバッチリみたいなんですが
使い方が簡単には見つかりませんね。探してみます。
ソースは短いんですけど私には難しいです。
>>97 お陰様でQLでロードまでは出来ました。
101 :
営利利用に関するLR審議中@詳細は自治スレへ :2012/04/03(火) 01:52:24.31
>>99 vhostのそれをずっと見ていたのですがserverに何入れるのかとか
ずっと悩んでいました。hunchentoot:serverってあるのに。。。
LISPのドキュメントやエラーメッセージなんか今一つコツが掴めません。
エラーなんかもパラメタの数が違うとかは見つかるのですが
どこのエラーだか見当もつきません。書いてあるのですかね?
>>100 素晴らしい!
localhostと127.0.0.1で切り替わりました。これで行きたいと思います。
わざわざサンプルまでありがとうございます。
hunchentoot:acceptor-dispatch-requestなんですね。
もう一つ下だったか。。。
102 :
営利利用に関するLR審議中@詳細は自治スレへ :2012/04/03(火) 03:15:19.72
>>100 さんのお陰さまで思い通りのものが出来ました。
要望はありませんが、嬉しいので勝手にあげます。
以下を追加するだけで今までのコードを一切変更する事なく
ttp://cc.bb.aa/AA/BB.html =>
ttp://cc.bb.aa/aa/bb/cc/AA/BB.html として扱う様になります。(仕様が変わっていますが、当初の目的はこれです)
ASPECT指向(って言うのかな?)万歳???
---
(defmethod hunchentoot:acceptor-dispatch-request :before ((acceptor hunchentoot:easy-acceptor) request)
(flet ((add-prefix (x)
(format nil "~{/~a~}~a" (reverse (split-sequence:split-sequence #\. (hunchentoot:host))) x)))
(setf (slot-value request 'hunchentoot::uri)
(add-prefix (hunchentoot:request-uri request))
(slot-value request 'hunchentoot::script-name)
(add-prefix (hunchentoot:script-name request))))
)
---
fletやらadd-prefixなんかの意味は分かっていないのですが、動いたのでOKです。
おめっとー。 fletはローカルな関数を定義する特殊形式で、 件のコードではadd-prefixってローカル関数を定義してる。 似たような処理が複数あるけど他では使わない、ってときに使うと便利。
104 :
営利利用に関するLR審議中@詳細は自治スレへ :2012/04/03(火) 18:56:29.74
>>103 ありがとう!
LISPすごいよ!他の言語じゃこうはならないんじゃないかな。
LISPもっと早く始めていればよかったな。
LISPERの人に怒られそうだけど、括弧がキモくて避けていたんですよね。
UNIXシェル程度にLISPのREPLが使えてたら生産性が段違いだったろうに。
fletも一応軽くネットで調べたんですけどよく分からなかったのですよ。
>似たような処理が複数あるけど他では使わない、ってときに使うと便利。
と言われてみると何となくやってる事がわかりますね。
ありがとうございました。
(flet ((test (x) (not (pathname-match-p x #p"~/quicklisp/dists/**/")))) (cl-fad:walk-directory "~/quicklisp/" #'print :test #'test))
ちょっと訂正。多分これで大丈夫な気がする。 (flet ((test (x) (not (pathname-match-p x #p"~/quicklisp/dists/**/*")))) (cl-fad:walk-directory #p"~/quicklisp/" #'print :test #'test))
paul grehamのon lispにmappendというユーティリティ関数が出てきます。 mapcarした物をappendで繋げるという関数です。その実装がこうなっています。 (defun mappend (fn &rest lsts) (apply #'append (apply 'mapcar fn lsts))) なぜ&restを使っているのでしょうか? 可変長にした所で可変長の引数を使うとエラーになりますし ex: (mappend #'identity '(asdf zxcv) '(asdf zxcv)) applyを使いたいがためにしか思えません。(applyを使うと周りの括弧が一つ外れるが、&restは副作用で周りに括弧が一つつくから) ↓なぜこうしないのでしょうか? (defun mappend (fn lsts) (apply #'append (mapcar fn lsts)))
>>107 2引数以上取れる関数を使えや
ex: (mappend #'list '(asdf zxcv) '(asdf zxcv))
>>107 エラーが出てるのはidentityがひとつの引数しか取らないからだと思う。
(mappend #'list '(0 1 2) '(3 4 5) '(6 7 8))
;=> (0 3 6 1 4 7 2 5 8)
後者の場合、多くのケースでわざわざリストを一度作って渡さないといけなくて不便。
(mappend-2 #'identity '((0 1 2) (3 4 5) (6 7 8)))
>>108 ,109
なるほど!2つ以上の引数を取る関数について考えていませんでいた。
その際&restが生きてきますね。御二方レス有難うございました
あと書き忘れたけど、
>>107 の後者のは意味変わっちゃってる。mapcarの部分で。
意味が変っちゃってるというのは後者で(mappend #'list '(asdf zxcv) '(asdf zxcv)) というような事ができないという事を言いたいのですか?
試せばすぐ分かるのに。データの渡し方を別としても、関数の挙動が変わってる。 (mappend #'list '(asdf zxcv) '(asdf zxcv)) ;=> (ASDF ASDF ZXCV ZXCV) (defun mappend-2 (fn lsts) (apply #'append (mapcar fn lsts))) (mappend-2 #'list '((asdf zxcv) (asdf zxcv))) ;=> ((ASDF ZXCV) (ASDF ZXCV)) (defun mappend-3 (fn lsts) (apply #'append (apply #'mapcar fn lsts))) (mappend-3 #'list '((asdf zxcv) (asdf zxcv))) ;=> (ASDF ASDF ZXCV ZXCV)
その事でしたか。&restを使わない + applyを使わない で &restもapplyも使っている関数を再現しようとした所でした。 (mappend #'list '(asdf zxcv)) ;=> (asdf zxcv) (mappend-2 #'list '(asdf zxcv)) ;=> (asdf zxcv) 引数を2個取る関数について考慮していなかったのでダメでしたが。 では、これにて失礼します。ありがとうございました。
115 :
デフォルトの名無しさん :2012/04/11(水) 20:59:50.24
MacOSX(LION) の CLISPにASDF-INSTALL を導入したいのですがやりかたがどうにもわかりません。 いちばん普通のやりかたはどうやればいいのでしょうか。
Gauche-tkとな?
もっと波動を送りたい。
ここはCLだぜ
120 :
デフォルトの名無しさん :2012/04/13(金) 00:05:59.70
>>116 ありがとうございました。おかげさまですんなり行きました。
いいですねQUICKLISP。
>>119 Lisp Schemeスレと間違えてたw
>>123 こうすれバインダー。
(sb-ext:run-program "ls" nil :search t)
> :search
> Look for program in each of the directories in the child's $PATH environment variable.
> Otherwise an absolute pathname is required.
同じ引数の取り方をする違う関数を効率よく作成したいのですが方法が分かりません たとえば (defun foo1 (arg1 arg2) (princ (+ arg1 arg2))) や (defun foo2 (arg1 arg2) (princ (- arg1 arg2))) で (foo1 1 2)や(foo2 3 4)とする動作を単純化して、 (foo #'+ 5 6) や (foo #'- 7 8)でokにする方法はありますか
>>126 うほほーい。
(flet ((f (fn &rest rest)
(princ (apply fn rest))))
(values (f #'+ 5 6) (f #'- 7 8)))
個人的には畳み込み。
(ql:quickload :alexandria)
(let ((fx (alexandria:compose #'princ #'+))
(fy (alexandria:compose #'princ #'-)))
(values (reduce fx '(5 6))
(reduce fy '(7 8))))
>>126 (defun foo (fn x y)
(princ (funcall fn x y)))
もしくは可変長引数を使って
(defun foo (fn &rest args)
(princ (apply fn args)))
呼び出し方はどっちも (foo #'+ 5 6) とかでおk
リストのatomの一文字目をもとにグループ分けする処理を書きました。 (remove-if (lambda (x) (string= "@" (subseq (string x) 0 1))) '(t1 t2 @t3 t4 @t5 t6 @t7 t8 t9)) これでremove-ifとremove-if-notで@がついているグループとついていないグループに分けられました。 つぎに、@が出現したらその直後のatomを ((@t3 t4) (@t5 t6) (@t7 t8)) のようにまとめて、残った物は (t1 t2 t9) とリストにまとめて最終的にvaluesで両方を返したいです。 リストの先読み?が必要そうだと思っているのですが処理を思いつきません。 よろしくお願いします。
>>129 '(@t1 @t2 @t3)の場合はどうなってほしいの?
>>129 @つきシンボルの直後がatomでない場合は?
132 :
129 :2012/04/20(金) 22:06:04.23
説明不足ですみませんでした
>>130 ((@t1 @t2) (@t3 nil))
こういう風にまとめたいです
つまり左から走査して@~のつぎはとりあえずまとめてしまい、
尻切れトンボになっているときはnilで補完する、ということです
>>131 その場合も強制的にまとめてしまいたいです
たとえば
'(@t1 (test) @t3 '())
これは
((@t1 (test)) (@t3 nil))
こういう風にです
動きがなんか、キーワード引数っぽいね
>>129 fare-matcherを使いたくない場合は頑張って条件分岐書いてくだしあ。
(ql:quickload :fare-matcher)
(defpackage :fare-matcher.use (:use :cl :fare-matcher))
(in-package :fare-matcher.use)
(labels ((@-p (x)
(match (coerce (string x) 'list)
((cons #\@ _) t)
(_ nil)))
(rec (rest acc)
(match rest
(() (values (nreverse (car acc)) (nreverse (cdr acc))))
((like-when (list x) (@-p x))
(rec nil (cons (cons (list x nil) (car acc)) (cdr acc))))
((list x)
(rec nil (cons (car acc) (cons x (cdr acc)))))
((like-when (list* x y rest) (@-p x))
(rec rest (cons (cons (list x y) (car acc)) (cdr acc))))
((cons x rest)
(rec rest (cons (car acc) (cons x (cdr acc))))))))
(values (rec '(t1 t2 @t3 t4 @t5 t6 @t7 t8 t9) (cons nil nil))
(rec '(@t1 @t2 @t3) (cons nil nil))
(rec '(@t1 (test) @t3 '()) (cons nil nil))))
あと@かどうかを調べるときの処理は、subseq使うより、 (defun @-p (x) (eql (position #\@ x) 0)) とかのが効率良いと思う。subseqは新しくシーケンス作るので、 それが必要な場合以外では効率悪いで。
出遅れた… orz Scheme版書いてみて、移植。 Common Lisp的にはどうやるのがフツー? (defun test (lst) (labels ((myloop (r1 r2 lst) (if (null lst) (values r1 r2) (if (and (symbolp (car lst)) (string= "@" (subseq (string (car lst)) 0 1))) (myloop (append r1 `((,(car lst) ,(if (null (cdr lst)) '() (cadr lst))))) r2 (if (null (cdr lst)) '() (cddr lst))) (myloop r1 (append r2 (list (car lst))) (cdr lst)))))) (myloop '() '() lst)))
138 :
デフォルトの名無しさん :2012/04/21(土) 00:02:42.63
脳内ステレオタイプCommon Lisper曰く、 * Common Lispの文化ではnullで空リストかどうか判別しない(() = nil) * よって、'()とかないわー。nil以外使ったことないわー * 再帰を使わずにloopやiterateを使うことが多い * lstという変数名はScheme文化なので堂々とlistと書け * 気が利いた奴はcarやcdrではなくdestructuring-bindを使う * appendは甘え だけど、そんな非実在Common Lisperとか気にせず好きなスタイルで良いのではないかと思う。
>>139 >* appendは甘え
ここ詳しく聞きたい
>>135 それだと最初の文字以外も調べちゃうから
(defun @-p (x) (eql (elt (string x) 0) #\@))
(defun @-p (x) (eql (char (string x) 0) #\@))
の方が良くね?
>>140 Schemeでもそうなんだけど、consで逆順に繋いでいって、最後に反転した方が効率が良いんだ。
appendで繋げていくと、最終的に不要な中間データが複数作られるのでかなり効率が悪い。
;; ある処理系でのappendの実装
(defun append (&rest lists)
(declare (dynamic-extent lists))
"Construct a new list by concatenating the list arguments"
(if lists
(let* ((head (cons nil nil))
(tail head))
(declare (dynamic-extent head)
(cons head tail))
(do* ()
((null lists) (cdr head))
(let* ((list (pop lists)))
(if (null lists)
(rplacd tail list)
(dolist (element list)
(setq tail (cdr (rplacd tail (cons element nil)))))))))))
これは、Lispでリストに要素を追加していくときに良く使われる定番の手法なので、
覚えておくと、他人のコード読むときなんかでも便利だと思う。
143 :
デフォルトの名無しさん :2012/04/21(土) 06:49:28.22
prognて何の略ですか
144 :
デフォルトの名無しさん :2012/04/21(土) 07:40:00.28
prognて何の略ですか
(string :test)で"test"が得られますが (x :test)で":test"を得るような関数xは作成可能でしょうか?
>>145 (format nil "~S" :test)
>>146 formatでできるのですか。盲点でした。
ありがとうございました。
>> 142 解説してるテクニックが前半と後半で違くね? cons+nreverseと、cdrを繋いでいく方法の2種紹介ってことだったらわかりづらい説明だね あと、なんでもappendってのはSchemeでも駄目でしょ
>>148 最終的には 「tconc とか queue って呼ばれてるものを使え」 になるような気が…
150 :
デフォルトの名無しさん :2012/04/21(土) 22:13:44.75
151 :
デフォルトの名無しさん :2012/04/21(土) 22:15:06.19
152 :
デフォルトの名無しさん :2012/04/21(土) 22:27:11.15
解説もくそも書いてあるまんまなんだけど。 とりあえず何がわからんのか質問してみそ。
154 :
デフォルトの名無しさん :2012/04/21(土) 23:16:41.58
>>153 まずここが分からないです!
unpack the tarball:
bzip2 -cd sbcl-1.0.56-x86-linux-binary.tar.bz2 | tar xvf -
replacing sbcl-1.0.56-x86-linux-binary.tar.bz2 with the name of the tarball you downloaded. Then enter the directory which was unpacked, and run the installation script to install SBCL in your /usr/local directory:
cd sbcl-1.0.56-x86-linux
sh install.sh
>>154 ターミナルから入力するコマンドだから
しばらく一般的なcui操作に慣れた方がいいかと
質問です。 指定した文字を複数個連続して作りたいのですが、 (defun repeat-string (num string) (format nil "~{~A~}" (loop repeat num collect string))) (repeat-string 100 "?") これで一応はできるのですが、 loopを使わずに出来ないものでしょうか。
>>156 (make-string 100 :initial-element #\?)
>>148 流石にそんなアクロバティックな誤読されても困る。最初のコメントに書いてあるように、
斯様にappendは非効率的だから、使う場合に注意を要するって意味なんだけど。
最初のコメントに書いてあるっていうのは語弊があったな。 つまり「例えばある処理系ではこういう実装をしているけど、非効率的でしょ?」って話。
>>156 文字を連続ってことなら157の方法だね。
文字列ってことなら
(defun repeat-string (num string)
(format nil "~V@{~A~:*~}" num string))
とか
ああ、ごめん。理解したわ。俺が悪かった。「これは」って代名詞が混乱させたのか。 「cons+reverseは」って置き換えてくれるとありがたい。
163 :
デフォルトの名無しさん :2012/04/22(日) 20:14:48.90
>>155 CUI勉強してやってみましたが、sh install.shを打ち込むと、
mkdir: /usr/local: Permission deniedとなります。次はどうすればいいでしょうか
まずMac OS X用のbinary持ってこいよ。そしたら、 $ sudo sh install.sh
165 :
デフォルトの名無しさん :2012/04/22(日) 21:36:18.49
>>164 mac os x用のbinaryとはなんでしょうか
167 :
デフォルトの名無しさん :2012/04/22(日) 21:53:52.94
>>166 WARNING: Improper use of the sudo command could lead to data loss
or the deletion of important system files. Please double-check your
typing when using sudo. Type "man sudo" for more information.
To proceed, enter your password, or type Ctrl-C to abort.
Password:
ってなりました
Common Lisp スレで Mac の使い方説明せないかんの?
>>167 Mac OS Xの初心者スレ、CUIスレ、ターミナルスレのどれかに行って。
(後ろ二つはまだあるかどうかしらんけど)
170 :
デフォルトの名無しさん :2012/04/22(日) 22:30:48.43
>>166 WARNING: Improper use of the sudo command could lead to data loss
or the deletion of important system files. Please double-check your
typing when using sudo. Type "man sudo" for more information.
To proceed, enter your password, or type Ctrl-C to abort.
Password:
ってなりました
ターミナルの宿命はよ
>>169 ありがとうございます
そっちに行ってみます
うまくいくといいです
とりあえずmanとグーグル先生を調べてから質問しような
>>174 わかりました。 ありがとうございます。
それについてもターミナルスレで聞いてみます。
176 :
デフォルトの名無しさん :2012/04/23(月) 13:32:13.32
>>167 のものです。今度は
GNU Make not found. Try setting the environment variable GNUMAKE.
と出てきました。これはこちらで聞いていい質問ですか?
>>176 おおざっぱに言えば処理系を起動してからがこのスレの話題。
初心者ってのはそういうもんだというのはわかってるが、
このスレの住民からするとたいそう「もどかしい」状態。
人工知能とのやり取りみたいだ
lispworksはmacosxにも対応していたのか
>>176 エラーメッセージ(の一部)でググレ。
さすがに釣りに思えて来た。
clispってcommon lispではないのですか? On Lispの例がそのままでは動かなかったりするのですが
Common Lisp の規格に沿った処理系はいくつもあるけど、規格の不明瞭なところをそれぞれの解釈で実装してたり、 そもそも規格では未定義にされていたり、規格以上の機能を提供しようと拡張されていたりすることもある。 そういった言語の微妙なところに依存してしまっている記述はあるかもしれない。 あと、定義を書く順番が関係してくる箇所もあるので、動かないという箇所を具体的に提示すればこのスレで何らかの助言を得られるかもしれない。
>>184 CLISPは代表的なCommon Lisp処理系のひとつですよ。
オープンソースだとSBCLやCCLに次ぐくらいには使われている。
On Lispの著者のお気に入りの処理系のひとつでもあります。
>>185 の言うように、書籍のミスなのか、あなたのミスなのか、
>>184 の情報だけではわれわれとしても何とも言えません。
(6 4 0 4 8 3 7 4 5 7) このリストの各要素を逐一足し合わせて (6 10 10 14 22 25 32 36 41 48) こういうリストを作るにはどうすればいいですか? reduceを使えばいいのかと思ったのですが、 reduceに#'+を渡す例を考えると最終的な値はリストではなく一つの値になってしまいます
(loop for x in list for y = x then (+ y x) collect y)
ありがとうございます。ばっちりです。 for ... then を使えばこんなにすっきりと書けるんですね。
(loop for x in '(6 4 0 4 8 3 7 4 5 7) sum x into y collect y) --> (6 10 10 14 22 25 32 36 41 48) でもいけるね
相変わらずloopは黒魔術
>>187 reduceでの解ということでひとつ。
(nreverse (reduce (lambda (r x) (cons (+ (or (car r) 0) x) r))
'(6 4 0 4 8 3 7 4 5 7)
:initial-value nil))
こういうのはloopやiterate、Seriesとかの方がすっきりできる感じがする。
あるいは内包表記とかもこういうの得意分野な感じ。
https://github.com/g000001/srfi-42 CLだとこの辺とか。
>>192 を見て疑問に思ったんだけど
schemeの世界のsrfiってcommon lisp向けに移植されていないのかな
本当だ。ありがとう。地道にもやっていたのか。
>>187 CL詳しくないのでHaskellで
sumlist xs = sumlist' 1 xs
where
sumlist' n xs | n > length xs = []
sumlist' n xs = sum (take n xs) : sumlist' (n+1) xs
CLにも同じ機能あると思うので、参考までに
CLですでに回答済なのに、場違いに出て来るHaskellerって・・・。
Haskellならscanl1を使えば一発
>>197 haskellスレじゃ初心者の質問が無くて暇なんじゃよ
>>200 某人の話題で揉めたばかりなのに、場を読まないと嫌われるぞ。
リーダーマクロを勉強するにはどういうものを読めばいいのでしょうか?
PCL
某人ってよく見掛けるけど最近出てきたネットスラングだよね。
(let ((pat '(T F))) (dolist (n1 pat) (dolist (n2 pat) (fresh-line) (format t "~A-~A" n1 n2)))) T-T T-F F-T F-F このようなdolistを100個以上重ねようと思うのですが、 短縮して書く方法は何かあるでしょうか。
(defmacro nested-dolist (bindings &body body) "1. ネストした dolist" (if (null bindings) `(progn ,@body) `(dolist ,(car bindings) (nested-dolist ,(cdr bindings) ,@body)))) (defmacro with-pattern-comb ((var pat ntimes) &body body) "2. nested-dolist をつかってパターンを N 段ネストで呼ぶ" (let (($pat (gensym "PAT")) ($vars (loop for n below ntimes collect (gensym "VAR")))) `(let ((,$pat ,pat)) (nested-dolist ,(mapcar (lambda (x) (list x $pat)) $vars) (let ((,var (list ,@$vars))) ,@body))))) CL-USER> (with-pattern-comb (x PAT 3) (format t "~{~A~^-~}~%" x)) T-T-T T-T-F T-F-T ...
207 :
206 :2012/04/29(日) 02:19:13.34
しかしたとえ2要素のリストでも、100段重ねると 2^100 回。ループおわらんよ。 目的がよくわからんからアレだけど、別の作戦を考えたほうがいいのでは?
>>206-207 ありがとうございます。ご指摘のとおりで、少ない回数ならその処理で回せますが
大きくなるとお手上げですね。
考え直します。
俺リーダーマクロを定義すると他のライブラリをコンパイルするときにしょっちゅう衝突を起こして困る。 例えばデバッグプリントをGauche風に#=expressionに割り当ててたらcl-annotと衝突したし。
汎変数を用いる関数は関数名の末尾にfが付いている場合があるのですが (incfやconcfなど) これは何の頭文字なのでしょうか?
form じゃね?
setfが元祖です。
LISPの長年の疑問 なんでたかが式の評価結果となるシンボルの値を設定するのにsetfみたいなしかけが必要なんだろう? いや、現状そうせざるを得ないのはわかるが、言語仕様の修正でなんとかならなかったのだろうか? 式言語なのに、LISPだけがこんなしかけを必要とするのが不思議だ。
普通にsetとかsetqだけでいける気が。setfは汎用のセッタってだけで。
ん? Lisp界隈では setf の対象は *単純なシンボルの値ではなくなった* からだけど。 lexical-scope が導入されたりして、 「評価結果のシンボルの symbol-value の値を更新」すればいい 時代は過ぎ去った。 HyperSpec の 5.1 Generalized Reference を参照。 (set 'foo 100) ;; シンボルの値設定しちゃうぜヒャッハー (setq foo 100) ;; ヤベェ。quote 分セルが節約www 俺天才www <--- この頃までは「シンボルの値」モデル (setf foo 100) ;; ついでに field 一般の更新用に拡張!! …という話ではないのかな? 何をどう「修正」すれば何がどう「なんとかなる」のかよくわからんので外してたら補足して。
自分も
>>215 の流れだと思ってた。
symbol-valueを設定するためにsetfがあるのではなくて、
setfがsymbol-valueの設定にも対応してる、みたいな関係。
なので、
>>213 がどういうことを主張してるのか良く分からない。
CやMLでは、代入先の式がいくら複雑になっても特別なセッタが必要になったりしませんよね? たぶんそれは「左辺値」という概念があるからで、LISPにも同等の概念があれば いちいちデータの種類ごとにセッタ(それも任意の式をとれるわけでない不完全な)を用意しなくてもすむのでは? と思った。
まあ、通常の評価の一歩手前で止める構文を導入すれば良かったのかもね。 ただしそれは式の意味領域を拡張することになるので、結構大掛かり。
>>213 Cだって&演算子がある。Perlにも。
ある式の結果が収められる場所を知りたいこと、
場所に対する演算を行いたいことは結構ある。
C++なんて&&渡しまで出来たし。
>>217 define-setf-methodに相当する機能がある言語なんて皆無に等しい。
たぶんあなたはCLtLは理解できてないんじゃないか?
Lisp系だがTaoは結構エレガントにまとめたと思う。
その左辺値的なものを実現するのがsetfなんだと思うよ。 そして、defsetfで任意の式に対応することができる。 あと、データの種類というか、式(place)の種類だよね? 汎変数のplaceをその都度定義するのが面倒という話は、 高機能さとのトレードオフと考えれば良いんじゃないか?
define-setf-expanderなりなんなりで (setf (if x y z) a) とかやればいくらでもsetfの設定できる
>>217 それはどうかな。
C++11 を見ればそのあたりの区別を考察してしまったがために更に区別が必要になって複雑なことになってるぞ。
Scheme はお前の望む形にちょっと近いかも。
みなさんありがとう。 >220 > 汎変数のplaceをその都度定義するのが面倒という話は、 > 高機能さとのトレードオフと考えれば良いんじゃないか? まさにこれが疑問の核心でした。 つまり ・Cの&演算子のような構文を導入することで左辺値の参照は汎用的に行えるようになる ・しかしそれではC#のプロパティのような、参照時の処理を自由に追加する機能は実現できない という対立があって、LISPは自由度を選んだということですね。 (別の機能としてもよかったかも知れませんが)
>>222 schemeの該当機能は知らないのですが、私もなんとなくそんな気がします。
(e1 e2)で、e1の評価結果が関数値であれば任意の式が取れるあたり
設計思想的に自分の直感に近そうです。
言語設計についてとかは本スレでやれば?
馬鹿じゃねえの? Common Lispがそんな間抜けな設計のわけねえだろ。 ちゃんと計算されてる。角度とか。
λ職人の朝は早い 「まぁ好きではじめた仕事ですから」 最近は良い型が取れないと口をこぼした まず、λの傾きの入念なチェックから始まる。
こちとら傾くのが商売。 言語機能の直交性などは犬にでも喰わせちまえってんだ!
assocとsetfの食い合せが悪い。 assocのちょっとした工夫が、後のsetfのあだとなった。
横レスだけど
>>215 のような話はほかにもあるのかな
歴史を知ることでその関数やマクロ作者の意図を知ることが出来るような。
setfってMacLisp由来でしょ?
shallow bindingだから
>>215 の説は誤りで、
(setf (car x) y)みたいな代入の汎化がしたいためでしょ。
replacaみたいな関数を個々に用意するのは馬鹿らしいし。
探索系の関数にも使えるし。
関数適応ではそれぞれの要素が一度評価されてるので、こういうことができるのでは ないかと思ったのですが出来ませんでした。(評価されるのは引数だけでした) ((if t '+ '*) 3 5) なぜ出来ないようになっているのでしょうか?
steeleも過去の互換性は切り捨ててそうすればよかったと後に語ってる。 まあ簡単に切り捨てられるものではないが。
scheme だとできたりしなかったけ?
Schemeのように変数と関数の名前空間が分かれていないlispでは全部評価するのが自然な流れだけど、CLのように分かれていた場合、式として評価しない方が自然に思う 評価したとして、 (let ((car 'cdr)) (car '(a b c))) ==> a ? (let ((f (if t '+ '*))) (f 3 5)) ==> error? などはどう解釈すれば良いかはっきりしないし、はっきりさせたとしても今より不恰好になると思う
なるほど。関数と名前空間が分かれていて、 同じシンボルでも引数としての評価時と関数としての評価時で参照する所が違うから、 関数部分を引数部分と同じように評価するとややこしい事になるんですね。 なんだか名前空間の分かれていないschemeのほうが整然としている気がしました。(触ったことはないのですが) そういった整然さを捨ててまで名前空間を分けた理由とは何なのでしょうか。 (let ((+ 10) (- 5)) (* + -)) 仕様の選定人の中にこういう趣味の人がいたのでしょうか?
(let ((+ 10) (- 5)) (+ + -)) すみません訂正です。(こうしたほうが例として適切でした)
Lisp1.5からそうなんだっけ?
(defmacro aaa (x-a) `(defmacro bbb (x-b) (case x-b ,@(mapcar (lambda (d) ...) (リスト x-a の展開))))) みたいなコードの、(リスト x-a の展開) をどのように書けば良いのでしょうか? x-a では間違い、,x-a でも文法エラー、`,x-a も間違い、、、。 `(...,(... の中でマクロの引数の利用方法が分からないとも言えると思うのですが。
そりゃあ、そのコードだとmapcarの中はバッククォートの外になってますし。 その(リスト x-a の展開)がどういうことをやりたいのかいまいち分かりませんが、 別のリストとつなげたいとかそういう話なら、appendやconcatenateでくっ付けるなり、 `(0 1 2 ,@x-a)とか(apply #'list 0 1 2 '(3 4 5))みたいにするなりすればいいじゃないですか! やだー!
…なんで最後にふざけた。
247 :
244 :2012/05/09(水) 08:41:03.09
>> 245 (質問の書き方が悪かったです) (リスト x-a の展開)というのは、単に (defmacro aaa (x-a) `(mapcar (lambda (d) d) ,x-a)) みたいに、,x-a を mapcar の2番目の引数として ループのために利用したいといった意味です。でも上のコードでは、 ,@( の内側のmapcar にて x-a を利用したいので 既にコンマの中になっていて ,x-a では使えないので困っています。 実際のコードはおおよそ以下のようになっています。 ?x-a? の書き方が?です。 (defmacro generate-data-table (x-a) (let ((g!arg (gensym))) `(defmacro query-data (,g!arg) (case ,g!arg ,@(mapcar (lambda (lst-c) (setupcaselist lst-c)) ?x-a?)))))
普通にx-a渡せば良いじゃないっすか。
249 :
244 :2012/05/09(水) 08:54:18.15
>>245 の回答を読んでると、どうも、
バッククォートとカンマとマクロの関係の基本が
何もわかってないということが分かった。。。う〜。
もうちょっと自分で考えてみた方が良いかも。です。
ちなみに、Let Over Lambda の日本語版の p.128、
dlambda について、自分なりにアレンジしてみようと思いました。
250 :
244 :2012/05/09(水) 09:13:06.60
>>248 それだと文法ミスにはならないのですが、
(generate-data-table *DATA*)
The value *DATA* is not of type LIST.
と、*DATA* としてリストを渡しているにもかかわらず
エラーメッセージが表示されてしまうのです。
マクロは単にコンパイルする際に定義したコードが評価されるってだけですよ。 (aaa '(0 1 2))というコードがあったら、aaaに'(0 1 2)という式を渡して評価し、 返される式がコンパイラに解釈されるだけ。 バッククォートも基本は単純で、基本はクォートと同じでリストのリテラルだけど、 中に , や ,@ といったアンクォートされる部分があったら、そこは評価する。それだけ。 どうも、その本の該当する場所で前提とされる基礎知識が足りてない気がします。 復習して基本を押さえてからの方が結果的に近道になると思います。
>>250 そりゃあ、シンボル渡してるんだから、それをmapcarに渡してもエラーになりますよ。
マクロに渡してる*DATA*っていうのは実行時のデータじゃないんですか?
実行時に計算して初めて得られるデータとかを、コンパイル時に利用できると思いますか?
あるいは、*DATA*が最初から用意されている定数だとするなら、マクロに渡す必要はありますか?
マクロの定義内で直接使えば良いのではないですか?
253 :
244 :2012/05/09(水) 09:39:48.52
>>251-252 なるほど。実行時にリストになるシンボルをコンパイル時に評価しろと言っているから
問題なんですね。
ちなみにこの *DATA* については、そのうち入力から読み取って作成予定
なので、このマクロではダメですね。わかりました。
少なくとも、"読み込み時","コンパイル時","実行時" の区別が
ちゃんと理解できていないのが問題ですね。まずはそこらへんを復習します。
http://www.asahi-net.or.jp/~kc7k-nd/onlispjhtml/anaphoricMacros.html |Norvigは,ifを次のように再定義したら便利だろうと述べたが,
|
|(defmacro if (test then &optional else)
| `(let ((that ,test))
| (if that ,then ,else)))
|
|参照透明性を侵すという観点からこのマクロを却下している.
|
|しかし問題は組み込みオペレータを再定義したことに因るもので,アナフォラを使ったことに因るのではない.
|上の定義のb)節は,式が「任意のコンテキスト内」で必ず同じ値を返すことを要求している.
この文章がどういう事なのか分かりません。参照透明性を侵すとありますが具体的にどのような場合に侵されるのでしょうか。
「上の定義のb)節は,式が「任意のコンテキスト内」で必ず同じ値を返すことを要求している.」とはどういう事なのでしょうか。
b節とは(if that ,then ,else)の事?
また上記のdefmacro ifは無限ループに陥りますが、あくまでifが現在の物と比べてこういう風にあれば、という理想の話だからですよね。?
仮に if を再定義したら、 (let ((that 10)) ;; that は 10 (if (+ 5 3) (print that) ;; 再定義版の if だと、ここで that が 8 になってる!! ...)) となる、ってのが「参照透明性を壊す」ということ。参照透明であるなら、 that の値は 10 でなければならない。 b) というのは、もう少し上のこの文章の部分。 > 参照の透明性が保たれているプログラミング言語とは,\\ a) どの部分式も,値の等しい別の式に置き換えることができ,\\ > b) 式は任意のコンテキスト内のどこで何回使われても同じ値を返す,ようなものだ.
256 :
デフォルトの名無しさん :2012/05/10(木) 02:56:14.47
SBCLを使っているものですが ASDFとquicklisp同時に使って問題ないものなのでしょうか?
>>256 QuicklispはASDFの上に作られたものなので、ASDFないと機能せんと思いますよ。
さておき、QuicklispとASDFと同時に使うというのはどういうことを指していますか?
質問が抽象的過ぎて何とも言えません。
>>255 レスありがとうございます。
b節とはその事だったのですね。
(if (+ 5 3)
(print that)
...)
の式はどこで使われても同じ 8 が表示されるので参照透明性を侵していないと言えませんか?
どうして、that=8の状態を基準に考えようとするんだろう 式を普通に読む限り、字面ではthat=10と読める筈 that=10の一貫性を崩してifの中だけで有効な、字面からだけでは読み取れないルールが導入されている方がイレギュラーだとは思わないだろうか 255がわざわざ (let ((that 10)) ;; that は 10 って書いてる意味も考えよう
ifは本来は別のコンテキストを作らないのでアウト。書いてあるだろ。
261 :
デフォルトの名無しさん :2012/05/10(木) 11:41:23.64
262 :
254 :2012/05/10(木) 15:12:39.09
>>259 ,260 レスありがとうございます。
モヤが晴れました。要点は、ある関数やマクロが元来新しいコンテキストを生成するものなのかどうかという点と
違うコンテキストであれば式の値は異なってよいという点でした。
letは元来新しいコンテキストを生成するものであるから
(let ((that 10))
(let ((that 8))
(print that)) ; 8
(print that)) ; 10
の中の2つの式thatは異なるコンテキストの中の式であり値が異なっていても参照透明性は壊れていない。
ifは元来新しいコンテキストを生成するものでないから
(let ((that 10))
(if 8 (print that)) ; 8
(print that)) ; 10
の中の2つのthatは同じコンテキストの中にあり、しかしながら値が異なるので参照透明性が壊れている。
私は上記ifの再定義によってifも新しいコンテキストを生成するものに存在が変わった、だから
これはletのケースと同じで参照透明性を壊していないじゃないかと思ってしまいました。これがモヤでした。
しかし元来ifは新しいコンテキストを生成するものではないということが重要なのですね。
既存のコードはifがそのように変わった事など知らないので
>>254 のように再定義すると
変数が上書きされて今まで正常に動いていたものがうまく動かなくなる場合があるから
危険―つまり参照透明性が壊されると分かりました。
ifの実装の都合でthen部、else部の参照の透明性が破壊されていることが問題になってる。 ifではないコンテキストを生成するような構文、 例えばletでも間違った実装をすれば同じようなことは起きうる。
aifの話?
死んだプロジェクトです。
267 :
!256 :2012/05/12(土) 23:15:44.14
ポシャってるのか。そこにも書いてあるけど、 現代風の標準ライブラリみたいのが欲しい。 もしくは、asdf みたいなライブラリインストールツールの標準化とか。 あと、マルチプロセス、マルチスレッドについてのなんらの仕様が欲しい。 コンパイラやメタオブジェクトまで仕様に含まれているのに 並列化サポートについては遅れているとしか思えない。
269 :
267 :2012/05/13(日) 02:45:05.50
>>268 そうか〜。やっぱり心変わり。
並列化の仕様化については確かに揉めそう、というか不可能な感じもするので
問題なく使えるライブラリ実装があればいいか。
となるとまぁ、現状でもいいことになるか。
現代風の標準ライブラリについては、とりあえず、Ruby に有るようなもの、
って言おうと思ったけど、これは常時開発中で標準ライブラリとは言わないのかな。
計算機やネットワーク、種々のプロトコルについては日々進化してるわけだから、
仕様に入れるのはやっぱり不可能そう。
>>269 具体的にこういう物が欲しい、欠けてる、みたいな話は良いと思う。
既存の物を知っている人が紹介できるかもしれないし、作る動機になるかもしれない。
抽象的だと議論が発散して得るものがない場合がほとんどで不毛だけど。
Rubyではないけど、Pythonにあるようなもの、というコンセプトなら
https://github.com/garaemon/clap というのがあるけど、開発は滞りがちみたい。
271 :
1/2 :2012/05/13(日) 11:11:35.97
非常に簡単な DSL を作る作業についていつも困っています。 例えば、分子構造について標準入力等から読み取った1次元リストデータを、 別の入力である構造化用ルールツリーデータに従って構造化したいといった問題とか。 例:水分子: H2O 入力1: (setf struct-mol '("H2O" ;分子名 "3" ;構成原子数 "O" "1.35200" "2.02600" "-0.16900" ;酸素、X, Y, Z 座標値 "H" "0.85000" "2.18800" "-0.96800" ;水素、X, Y, Z 座標値 "H" "1.46300" "1.07500" "-0.14500" ;水素、X, Y, Z 座標値 )) 入力2:tree で記述された構造化用ルール (setf rule-mol '((str 1 name nil) ;文字列として読んでシンボル name に対応付け。 (int 1 natom nil) ;整数として読んでシンボル natom に。 (nlist natom atoms ;以下を natom 個のリストとして読んで、シンボル atoms に。結果もリストに。 (str 1 atom nil) ;1つの文字列を読んでシンボル atom に。 (float 3 xyz nil)))) ;3つの浮動小数点数を読んでシンボル xyz に。 出力: ((NAME ("STO-3G")) (NATOM (24)) (ATOMS ((("O") (1.352 2.026 -0.169)) (("H") (0.85 2.188 -0.968)) (("H") (1.463 1.075 -0.145))))
私にとって難しいところは以下です。 1.構造化用ルールのところの natom の様に、 一旦対応付けられたシンボルを下のルールを読むところで 利用できるようにすること 2.struct-mol、rule-mol について2重ループ以上にする必要が有るのですが、 基本的にどういう構造にするのか分からない。 struct-mol 要素を rule-mol に従って読み進める時に、例えば (float 3 xyz nil) について 処理する等、幾つかのデータをいっぺんに読むことになるのですが、どこまで読んだかを レキシカルスコープ変数に保存しておくのか、大きな関数内のグローバル変数に置いておくのか、 どのようにするのがスマートなのか分からない。 3.マクロってどこらへんに出番があるの? 誰か見本のプログラムを下さい。と、いうのは甘いですか? 自分で書いたのだと70行くらいになってて、とても可読性が低い感じです。
既にできでるっていう70行のプログラムを添削するってのなら誰かやってくれるんじゃない?
(defun rule-interpreter (rules) (lambda (data) (labels ((take (n) (prog1 (subseq data 0 n) (setf data (subseq data n)))) (parse-float (str) (read-from-string str)) ;; you should use parse-number library (apply-rule (result rule) (destructuring-bind (type arg varname &rest subrules) rule (let* ((num (etypecase arg (number arg) (symbol (caadr (assoc arg result))))) (node (ecase type (str (list varname (take num))) (int (list varname (mapcar #'parse-integer (take num)))) (float (list varname (mapcar #'parse-float (take num)))) (nlist (list varname (loop for i from 0 below num collect (nreverse (reduce #'apply-rule subrules :initial-value ())))))))) (cons node result))))) (nreverse (reduce #'apply-rule rules :initial-value ())))))
277 :
275 :2012/05/13(日) 14:29:16.84
たぶん、文面から察するに、↑みたいなルールを解釈するプログラムを作ってるんじゃないかな? 1. ルールで表現する => コレはすごくいい考えだとおもう。状況はわからんが、ルールはもうちょっと改善できそうな… 2. 内部的に二重ループになるのはある程度はしかたない。NATOMの回数は事前にわからないんだからね。ループを一個にしても、対して性能に影響ない感じ。 3. なんでもマクロに出番があるわけではない。 私は高階関数が珍しい世代だったので、 rule-interpreterを隠蔽して、 (def-mol-parser h2o <<ルールのリスト>>) にするとか思いつくけれど 最近の Scheme の流行具合をみると、別に不要な気がしますね。
278 :
275 :2012/05/13(日) 14:35:17.22
自分は分子の定義がファイルにどばーっと書いてあって、それを一行ずつリストにするところまでやってあって、 ルールに従ってロードするというような場面を想像をしたけれど。データ表現なら、個人的趣味からいえば、 構造体にしたいし、分子はリストではなく配列で持ちたいなぁ。
マルチスレッドはCLtLの頃は雑多なLispマシンがあって、 それぞれタスク/プロセス/スレッドのモデルが違ったから標準化出来なかった。 今はほぼMac OS Xを含めたUNIX/POSIX/Mach系とWindows系に絞られてきたから、 標準化しやすいのではないか? 問題はCLtLの全てをMT safeかどうか、どのようにMT safeか決めないといけないこと。 野心的にやろうとするとかなり大変。コンサバにやってもそう簡単なことではない。
マルチスレッドは色んな路線があるから、標準化には早いでしょ。 ライブラリで十分。
標準化と良くいうけど、標準化してユーザーや産業での採用が圧倒的に増える込みありますか? Schemeみたいにインプリメンター主導な頭で仕様大事と考えててもCommonLispは衰退するだけだと思いますね Quicklispみたいなものをプッシュしてユーザーが増えてからで遅くない
プログラマの視点ならそうかもしれんが、 企業でその手の決定を下せる立場にある人にとっては 仕様が確定していることの安心感も必要だったりするぞ。
これまでもansi仕様がありますよ。現在のansi仕様の範囲しか使わない縛りの案件今後どれだけあるんですか どの言語を採用するかを決定する企業も大きくみてユーザーでしょう CommonLispの言語仕様改訂を強く望んでいる大口ユーザーってどこですか Franz位しかないのであれば、Franzのlispに機能を組み込んでおけば良いってことになりますね
284 :
272 :2012/05/13(日) 18:40:53.15
>>273-278 おおお。ありがとうございます。
上の課題は例ですが、私が実際に今のプログラムに必要としているものです。
275 のコードはまだ理解出来ていないのですが、
をもうちょっと読み込んで、適宜コピペさせて頂きます。(ペコリ)
他にも、私のプログラムで問題になっている
バイナリ/テキストファイルに対しての中間データの読み書きについても
すぐさま利用出来て助かります。
私一人が開発しているプログラムなので、ルールの書式についても
より良い方法が無いのか、模索中です。だからこそ、将来のルール変更に
耐えられる様に、ルールを DSL として与えるプログラム形式に
なっている必要があります。
最終的にはXML/XSLTのS式表現になりそうな
286 :
275 :2012/05/14(月) 00:34:57.04
マクロなDSLがしたいという話もあったから、ほぼ同じ仕様で、
出力をマクロにした例を無理矢理つくってみた。
;; 展開形:
http://paste.lisp.org/display/129423 (define-mol-rule standard-mol
(name :type string)
(natom :type fixnum)
(atoms :type list
:count natom
:children ((atom :type string)
(xyz :type float :count 3))))
CL-USER> (standard-mol data)
#S(STRUCT-STANDARD-MOL
:NAME "H2O"
:NATOM 3
:ATOMS (("O" (1.352 2.026 -0.169)) ("H" (0.85 2.188 -0.968))
("H" (1.463 1.075 -0.145))))
287 :
275 :2012/05/14(月) 00:35:48.06
(defun first-item (item) (first item)) (first-item '(mr, hoge)) こうすると当然のことですがComma not inside a backquote.と出ます mr,の部分を文字列にせずに処理する方法は何かありますか
>>288 (first-item '(mr\, hoge)) --> |MR,|
文字列にせずに処理する方法 っていう意味は分からなかった
>>289 '("mr," hoge)とせずに、という意味でした
エスケープするということをすっかり忘れていました
ありがとうございます。
シンボル名にcommaは使えないんじゃなかった?
と思ってたらエスケープすれば使えたのかorz
293 :
デフォルトの名無しさん :2012/05/26(土) 15:13:44.83
次のように動作する関数wanted-fnを作りたいのですが、うまくいきません。 お力を貸して頂けると大変ありがたいです。 (wanted-fn '((a 0 1 (b 2 3) 4 5) (c 6 (d 7) 8 9 (e 10) 11) (f 12 13 (g 14 (h 15) 16) 17 18) (i 19 20) ...)) => ((B 0 1 2 3) (A 4 5) (D 6 7) (E 8 9 10) (C 11) (H 12 13 14 15) (G 16) (F 17 18) (I 19 20) ...) アルファベットの部分には任意のシンボルが入り、 数値の部分には任意の数値または任意の文字列が入ります。 したがって、上の例のアルファベット順や数値順を定義に利用することはできません。 また、'...'は同じような式が任意の数(ただし有限個)続くということを表しています。
どう「うまくいかない」のか説明がないんだが…? (defun wanted-fn (data &aux fn args) (labels ((push-fn (x) (push x fn)) (push-arg (x) (push x args)) (flush-unit (result) (prog1 (append result (list (cons (car fn) (reverse args)))) (setq fn (cdr fn) args ()))) (parse-unit (lst &aux result) (dolist (e lst) (etypecase e (symbol (push-fn e)) (string (push-arg e)) (number (push-arg e)) (list (setq result (append result (parse-unit e)))))) (flush-unit result))) (apply #'append (mapcar #'parse-unit data))))
295 :
293 :2012/05/26(土) 16:26:08.44
>> 294さま ありがとうございます!! 再帰を使って関数を定義しようとしたのですが、 どういう手順で考えれば、このような再帰関数を作ることができるのか、 うまくいかなかったのであります!! 感激であります!! これから関数の動作を理解すべく、じっくりコードを読み込む所存であります!! ペコリ。
296 :
294 :2012/05/26(土) 16:41:14.32
再帰がわかんなかったのか?なら、そーゆう疑問を最初にいわねーと。 (defun wanted-fn (data) (labels ((parse-unit (data fn args result) (if (null data) (cons (cons (car fn) (reverse args)) result) (destructuring-bind (x . xs) data (etypecase x (symbol (parse-unit xs (cons x fn) args result)) (string (parse-unit xs fn (cons x args) result)) (number (parse-unit xs fn (cons x args) result)) (list (parse-unit xs fn nil (parse-unit x fn args result)))))))) (apply #'append (mapcar (lambda (x) (reverse (parse-unit x nil nil nil))) data))))
297 :
294 :2012/05/26(土) 16:48:15.29
*考え方* 1. 結果が (fn arg1 arg2 ...) のリストになる。 2. リストを一個ずつパースすることから、終了条件は (null ...) 3. 返す値は (cons (fn arg1 arg2 ...) result) になる。 4. fn はその階層のリスト?をたどった先頭要素 -> (car fn) 5. args はリスト終端時に木をたどったもの全部 -> (reverse args) => これで (if (null data) (cons ....) ....) の形が完成 6. あとは、 car / cdr を分解して、関数呼び出しに変換する。
298 :
293 :2012/05/26(土) 16:58:52.92
>> 294さま 再び、ありがとうございます。 美しいコードなので、動作の構造がすごくわかりやすくて、ためになります。 再帰でdestructuring-bindをこのように使い、リストを小さくしていく手法は初めて見ました。 大変勉強になります。
299 :
293 :2012/05/26(土) 17:00:24.62
>> 294さま ああ、考え方まで、参考になります。
300 :
293 :2012/05/26(土) 17:19:31.84
>> 294さま 今気づいたのですが、「ああ」の意味は二義的ですね。 正確に言うと、ここでの「ああ」は感嘆の「嗚呼」であって、 ついでに「ああ、どーもね」という意味ではありません。 細かなことですが、せっかく教えていただいたのに無礼な態度は取りたくないので、 取り急ぎ。
いいってことよ!
実用common lispの1章に (defun first-name (name) "Select the first name from a name represented as a list." (if (member (first name) *titles*) (first-name (rest name)) (first-name))) こういう関数が出てくるのですが(p.15)、(first-name)は(first name)のタイポでしょうか
そだね。 (first name) が正しい。日本語版の typo かな? 手元の英語版ではちゃんと (first name) になってる。
304 :
302 :2012/05/27(日) 10:19:37.27
ありがとうございます。
rplacdは何を略したものですか?
replace cdr
``内で,,@lstとするとlstが展開された後さらに,が付くのですが、何か簡単な方法で ,をつけないようにすることは出来ないのでしょうか? (defmacro make-short (short long &rest rest) `(defmacro ,short (x) `(,',long ,x ,,@rest))) ; あまりいい例ではないと思いますが (DEFMACRO SHORT (X) `(LONGLONGLONG ,X ,ASDF ,ZXCV ,QWER)) ; macroexpand-1するとこうなります (DEFMACRO SHORT (X) `(LONGLONGLONG ,X ASDF ZXCV QWER)) ; こうしたいのですが,',@では実現されませんでした (defmacro make-short (short long &rest rest) `(defmacro ,short (x) (list ',long x ,@(mapcar (lambda (x) `',x) rest)))) (DEFMACRO SHORT (X) (LIST 'LONGLONGLONG X 'ASDF 'ZXCV 'QWER)) ; 無理やりするとこうですが
(defmacro make-short (short long &rest rest) `(defmacro ,short (x) `(,',long ,x ,@',rest))) これで出来ましたw おもしろいですね
309 :
デフォルトの名無しさん :2012/06/05(火) 11:11:40.28
これはどのプログラミング言語にも当てはまることだろうからここできくべきではないのかもしれないが、 初中級者から上級者へのアップグレード方法がわからない。 特にLispはコミュニティーを見つけるのも大変だしプロジェクトを見つけるのも大変。 このスレで充分だろと言われればそれだけだけどもCL上級者とコンタクトをとれる場所ってないものかな それとどこに行けばCLのプロジェクトが見つかり、参加することができるのか…
311 :
デフォルトの名無しさん :2012/06/05(火) 11:38:54.41
>>310 さんくす
だが英語が苦手な俺にとってはできれば日本人がいるところがよいのだが…
カンファレンスとか勉強会にでも行かないと会えないんじゃないかなー。 ネット経由ならTwitterとか使う手もあるかもしれないけど。 プロジェクトとかは日本発のもの自体が少ないから、英語無理だと選択肢が少ない。 逆に辞書引きながらでも良いなら、今の時代ならGitHubとかで交流余裕。 あとxyzzy界隈なら割と賑わってる印象。
初中級者から上級者のトピックが不足してるのは確か. ドキュメント的なものをアウトプットするのが楽しいという人が少ないのでしょうがない. しかし, アプリ作ることになると結局clだけで完結するわけでもないし, また, clが他の言語に比べて, それほど突出したり変ったりしてる訳でもないので, (cl抜きに)中から上級のプログラマであれば, そんなに困らないのではないだろうか. そんな風にあまり困ってない人がgithubなどで色々作って公開してるんじゃないかな. 意見交換する場があったら活発に意見交換するかというとそうでもないのですぐ廃れてる..
>>309 309みたいな質問をする人が情報収拾の主力としてるメディア、知りたい
common lispでググってる範囲なのか2chでスレ眺めてるのか
ついでにこのスレの住人御用達の主力メディア、興味ある
ルーク、ソースを読むんだ
>>317 309じゃないけど、おいらはGoogle readerでPlanet lispとlispを眺める程度でしかないなぁ
Reddit、Planet Lisp、Planet SBCL、CCL WikiとCLikiのフィード。 あとはGitHubのフィードで大体話題になってる情報は入ってくる感じ。 たまにcomp.lang.lispとかも見てるけど、あんま面白いネタない気がする。
Lispくらい上級者向けの本が多い言語も珍しいんじゃないか? 後はC++くらい?
そんなことはない。 いろんなテーマの上級者向けの専門書で、ソースコードが載ってる場合、 シェアに比例してC言語のことが多いから、結果としてC言語が書かれた 上級者向けの本も多い。
上級っていっても何を指すかで違ってくるんじゃない? 多いっていえば、lispはAI関係の昔の本はほんとう沢山あるね ウェブプログラミングが近頃のプログラミングで大きな需要を占めるとすると、その辺りで上級なものっていったらほぼ0だよね セマンティックウェブとかはあるかな 言語機能の解説でいえば、clos、コンディションシステムなどのAIブームが消える前には標準化されてなかった機能達を詳しく説明してる本は少ないね 実践CommonLisp位かな。ここいらの解説は入門書で説明するにはそこまで辿り着くのが大変だし、単体で本になっても売れるもんでもないだろうしってところで空白地帯だね
テーマといっても言語を使い熟すということと
ある言語を使って複雑なことをするということはベクトルが違う。
>>312 のいう、C++の上級者向けの本というのはC++の使い方の本のことでは?
OnLispが初級、LetOverLambdaが中級としたときの上級は? という感じかな
327 :
デフォルトの名無しさん :2012/06/10(日) 05:23:25.87
Land of Lispてどうなんですか?
(setf test '(1 2 3 4 5 4 3 2 1 0)) このtestを属性リストのように扱って、 奇数番目のatomが奇数のときには、そのつぎのatomを足し合わせていく、 という処理をしたいのですが、よくわかりません mapcと(lambda (x y)...)ではできませんでした。
こういうこと? (defun f (xs a) (if (null xs) a (if (oddp (car xs)) (f (cddr xs) (+ a (cadr xs))) (f (cddr xs) a)))) (defun g (xs) (f xs 0)) > (g test) 12
>>328 (loop for l on '(1 2 3 4 5 4 3 2 1 0) by #'cddr if (oddp (car l)) sum (cadr l))
>>325 On LispのようにLispの文法、意味の基本的なことは知っているのが前提の本を初級って馬鹿じゃないのか?
初級と初学との溝は深い。深くないのもあるけど。
Let Over Lambda の前半こそが、初級だと思った。後半は上級、OnLisp が中級。
初めてLispやる人が単体で独習できない本を初級はちょっと無理があると思われ
>>329-330 ありがとうございます。たしかに、cddrで順に処理していき、
適宜carで条件分岐させればよかったですね。
勉強になります。
初級と初学との溝は深い。深くないのもあるけど。
338 :
デフォルトの名無しさん :2012/06/17(日) 17:02:05.43
少し前に出てましたが International Lisp Conference はどのような趣向で行われるようなものなんでしょう? 折角の日本開催,帰省がてら参加したいなと考えているのだけど
339 :
314 :2012/06/17(日) 17:45:13.64
Lisp is one of the greatest ideas from computer science and a major influence for almost all programming languages and for all sufficiently complex software applications. The International Lisp Conference is a forum for the discussion of Lisp and, in particular, the design, implementation and application of any of the Lisp dialects. We encourage everyone interested in Lisp to participate. We invite high quality submissions in all areas involving Lisp dialects and any other languages in the Lisp family, including, but not limited to, ACL2, AutoLisp, Clojure, Common Lisp, ECMAScript, Dylan, Emacs Lisp, ISLISP, Racket, Scheme, SKILL, etc. Topics may include any and all combinations of Lisp and: * Language design and implementation * Language integration, inter-operation and deployment * Applications (especially commercial) * Reflection, meta-object protocols, meta-programming * Domain-specific languages * Programming paradigms and environments * Parallel and distributed computing * Theorem proving * Scientific computing * Data mining * Semantic web
Lisp is one of the greatest ideas from computer science and a major influence for almost all programming languages and for all sufficiently complex software applications. The International Lisp Conference is a forum for the discussion of Lisp and, in particular, the design, implementation and application of any of the Lisp dialects. We encourage everyone interested in Lisp to participate. We invite high quality submissions in all areas involving Lisp dialects and any other languages in the Lisp family, including, but not limited to, ACL2, AutoLisp, Clojure, Common Lisp, ECMAScript, Dylan, Emacs Lisp, ISLISP, Racket, Scheme, SKILL, etc. Topics may include any and all combinations of Lisp and: * Language design and implementation * Language integration, inter-operation and deployment * Applications (especially commercial) * Reflection, meta-object protocols, meta-programming * Domain-specific languages * Programming paradigms and environments * Parallel and distributed computing * Theorem proving * Scientific computing * Data mining * Semantic web
Lisp版アブダビコンバットと命名
343 :
338 :2012/06/18(月) 13:54:51.05
情報ありがとうございます
>>339 まだ発表者を集めておられる途中という感じですね。
今後カンファレンスの題目だけでも発表していただけると
気負わず参加できそうです
>>342 Lispに関心があれば誰も厭わずという感じでしょうか
提言って意味の取り替え面白い,
Lisperはグラップラーってのは妙に説得力あります
344 :
uy :2012/06/19(火) 18:17:48.25
チャーチ数っての知ったんだけど それ使ってプログラム作ってる奴いるの?
もっと勉強しなよ
346 :
uy :2012/06/19(火) 23:36:43.61
お前が勉強しろ いないわけね
お前が何も知らないだけだ Brainfu*kでまともなもの組む奴いないだろ?
丸投げ以下でワロタ 自分が何をしたいのかも考えられない奴が 何を威張ってるんだろうね
何でこんなギスギスしてんのw
ム板は殺伐としているのがデフォ
SchemerがいちいちCommon Lispのスレまで出張してくんなよ。
>>349 あなたが優しくバカの相手をしてやってください
353 :
uy :2012/06/20(水) 10:52:29.39
>>347 例えがおかしすぎ
所詮2chLispスレものこの程度
>>353 ではラムダ算法やチューリング等価の勉強でもしてみたら?
あなたの勉強が足りないだけです
このスレでうゆの相手をしないように。 LLバトロワスレあたりでやってください。
実用性はともかくYコンビネータとか考えるの面白いよなw
International Lisp Conference なるものを締切り前日(先週土曜)に知って 急いで論文書いたけど間に合わずにabstだけ登録した もっと早く知りたかった せっかく途中まで書いた論文だし 類似の雑誌とかあったら投稿したい どの雑誌になるんだろう
359 :
デフォルトの名無しさん :2012/06/20(水) 17:04:38.36
関数my-length1、実効速度:遅、使用メモリ:小 関数my-length2、実装速度:速、使用メモリ:大 を意図して次の2つの関数を定義しました。 (defun my-length1 (lst) (labels ((rec (lst acc) (if (null lst) acc (rec (cdr lst) (1+ acc))))) (rec lst 0))) (labels ((rec (lst acc) (if (null lst) acc (rec (cdr lst) (1+ acc))))) (defun my-length2 (lst) (rec lst 0))) しかし、disassembleしてみると、 両者は同等のアセンブリコードにコンパイルされていました (SBCL)。 上の関数my-length1は呼び出される度に局所関数を生成し、 下の関数my-length2は関数が定義時に局所関数が一度だけ生成される、 と思っていたのですが違いました。 上の意図のような使い分けをするための方法はあるのでしょうか? 情報をいただけるとうれしいです。
360 :
デフォルトの名無しさん :2012/06/20(水) 17:36:34.48
359です 読み返してみたら日本語として変でした。 「上の関数my-length1は呼び出される度に局所関数を生成し、 下の関数my-length2は定義される時に一度だけ局所関数を生成する、 と思っていたのですが違いました。 」 が、ましな日本語です。
計算の効率上、等価なクロージャを何度も生成する意味ってないですけど、 何のために必要なんでしょうか。明後日の方向に全力疾走してるように見えます。
362 :
デフォルトの名無しさん :2012/06/20(水) 19:00:44.16
359です。 CTMCPのp.124以降に「局所手続きを使うこと」という節があります。 そのなかで以下のような(ニュートン法により根を求めるための)2つの関数がでてきます。 (もともとのコードはOzによるもので以下のものは私がLispに書き換えたものです) CTMCPには「my-sqrt4ではimproveとgood-enough?がsqrt-iterの反復の度に生成されるが、 my-sqrt5ではそうではない」と書いてありました。 Lispではどうなっているのか?と思い、以下のコードを考えました。 しかし以下の2つのアセンブリコードは同等のものでした。 必要は特になく、ただ疑問だったので質問しました。
363 :
デフォルトの名無しさん :2012/06/20(水) 19:02:21.35
359です(つづき) ;; ニュートン法による球根(第4版) (defun my-sqrt4 (x) (labels ((sqrt-iter (guess) (labels ((improve () (/ (+ guess (/ x guess)) 2)) (good-enough? () (< (abs (- x (* guess guess))) 0.00001))) (if (good-enough?) guess (sqrt-iter (improve)))))) (let ((guess 0.1)) (sqrt-iter guess)))) ;; ニュートン法による球根(第5版) (defun my-sqrt5 (x) (labels ((improve (guess) (/ (+ guess (/ x guess)) 2)) (good-enough? (guess) (< (abs (- x (* guess guess))) 0.00001)) (sqrt-iter (guess) (if (good-enough? guess) guess (sqrt-iter (improve guess))))) (let ((guess 0.1)) (sqrt-iter guess))))
>>355 uyのせいでバトロワスレが1000いったみたいだなw
>>362 そういう話であれば、両者は本来同じ処理なのですから、
同様に効率が良いコードにコンパイルされた方が良いですよね?
なので、最近のコンパイラでは式の変換なども含めて最適化をしているそうです。
Ozについては知りませんが、何らかの事情でそういうことをしてないんでしょう。
>>359 > (defun my-length1 (lst)
> (labels ((rec (lst acc)
> (if (null lst)
> acc
> (rec (cdr lst) (1+ acc)))))
> (rec lst 0)))
recに外側の環境(my-length1)への参照がないので、局所関数を
作る必要がない。
(rec内のlstはrec自身の仮引数だから外側の環境への参照でない)
なので、実験したければ、my-length1の仮引数を参照するように変更
するとよいかと。
367 :
デフォルトの名無しさん :2012/06/21(木) 01:03:50.68
359 & 362です。
「求根」が「球根」になってた。ニュートンが開発した、たまねぎ栽培法みたいだ。Orz
>>365 さん
おっしゃる通り、非効率なソースコードでも、
きちんと最適化してコンパイルしてもらえることはありがたいことです。
他の部分はわかりませんが、my-sqrt4とmy-sqrt5のコードに関しては、
OzのコンパイラよりSBCLの方が賢いコンパイラなのですね。
>>366 さん
その通りですね。
359の例は適切な例ではなかったようです。
もう一度しっかりと本を読み返し、次のmy-sqrt2を試したところ、
my-sqrt4やmy-sqrt5とは違うアセンブリコードがでました。
;; ニュートン法による求根(第2版)
(labels ((improve (guess x) (/ (+ guess (/ x guess)) 2.0))
(good-enough? (guess x)
(< (/ (abs (- x (* guess guess))) x) 0.00001))
(sqrt-iter (guess x)
(if (good-enough? guess x)
guess
(sqrt-iter (improve guess x) x))))
(defun my-sqrt2 (x)
(let ((guess 1.0))
(sqrt-iter guess x))))
368 :
uy :2012/06/21(木) 05:56:20.40
>>354 なめてのかお前
ラムダ計算で作れないと決め付けてるお前がまず勉強しろよ
所詮Lispスレもこの程度
以下さわったら負け。自演に釣られても負け
>>357 今日、またCFPが出てたよ。締切り伸びたのかな?
個人でiphoneアプリ、Windowsアプリをマーケットに売って生き残れ
格安iPhoneEラーニング(学習動画多数あり)
http://tinyurl.com/7wj77om コワーキングスペースJP
http://tinyurl.com/76vdrny WEBサーバーIIS Win2008ServerVPS SqlServer Oracle MySql 言語はマーケットで売れるメーカー製のみやる
ASP.net(C#)+管理EXEアプリ(C#)+iPhone C#のソースを出さなければWEBアプリの著作権も守れる
C#マーケット Windows8 Metroアプリ WindowsPhone Surface PS Vita Xbox360 iphone(mono使用)
iPhoneマーケット iPhone iPad 予定 iTv iCar i (家電製品)
地方に安い土地を買いコンテナ型の格安高性能オフィスを建て(300万〜500万)
レンタル自習室&シェアオフィス・コワーキングで収入を得ながらそこでアプリを開発する
http://tinyurl. com/7pb2yaa
最近のcommon lispの学術的トレンドってどういうものなの? ここ10年ぐらいキャッチアップしていないから分からん
実際ラムダ計算のIFってIFだとだまされてたけど違うなこれ IFじゃないよこれ ただ引数に応じて関数の状態が変化するひとつの関数の定義に過ぎない Yコンビネータも同じ 引数に応じてネストの個数が変わるだけのもの つまり応用していくとソースコードから 条件分岐とループ文がなくなることが既に証明されてるわ・・・ やってらんねーな やはり近々プログラミングという分野は消滅するとしか思えない ソフトウェアに限界はない、 組み合わせに限界個数はない しかしソフトウェアに、完成はある やっている事があまりに無駄すぎる
こいつ本当にバカだ
376 :
デフォルトの名無しさん :2012/07/08(日) 22:53:03.42
Schemeでは対話インタプリタに渡せばシンボルが何を指すのかがわかるんですが、Common Lispで似たようなことをしようと思うとどうすればいいんでしょう? やっぱググるしか無いですか
シンボルをググる?
379 :
デフォルトの名無しさん :2012/07/09(月) 23:09:06.34
380 :
デフォルトの名無しさん :2012/07/11(水) 02:05:09.06
Common-Lispの勉強のため、GNU CLISP 2.49をWindows XPにインストールしました。 Emacs等は使わず単体で使用しているのですが、 日本語を含むパス名(たとえば"P:/ソフト/test.lisp"など)が使えません。 そういうものなのでしょうか。
とか思ったんですが、今CLISP 2.49をインストールして実行してみたら、 custom:*default-file-encoding*もcustom:*pathname-encoding*も標準でCP932ですね。 CLISPのコードは読んでませんが、コードページに合わせて設定してくれてるのかも。 何か別の問題でエラーが出てる気がするのですが、どういうエラーが出てるんでしょう?
383 :
デフォルトの名無しさん :2012/07/11(水) 12:03:55.67
早速のお答えありがとうございます。 以下のようになるのです。 なお、フォルダ「ソフト」を「soft」に変更すれば正常に動作します。 [1]> (load "p:/ソフト/test.lisp") *** - PARSE-NAMESTRING: syntax error in filename "p:/ソフト/test.lisp" at position 3 The following restarts are available: ABORT :R1 Abort main loop Break 1 [2]>(quit) Bye. P:\>type p:\ソフト\test.lisp (format t "test") P:\> また、custom:*default-file-encoding*とcustom:*pathname-encoding* を確認したところどちらも#<ENCODING "CP932" :DOS>になっていましたので、 これらの変数の問題ではなさそうだということですね。
あー、やっぱエンコーディング変えても駄目かもしれません。嘘つきました。 ちょっと解決策は思い付きません。*pathname-encoding*をISO-8859-1にしても弾かれるみたいですし。 力になれずに申し訳ないです。CLISPに詳しい偉い人が来るのを期待してください。
386 :
デフォルトの名無しさん :2012/07/11(水) 22:20:38.26
検討および資料の紹介をいただきありがとうございます。
シフトJISの「\」の問題はすっかり忘れていました。
「ソフト」を「日本語」にしたら通りました。(「ソ\フト」はだめでした)
勉強用としてはフォルダやファイルの名前を注意すればなんとかなりそうですが、
それより今から他の処理系に乗り換えてもいいかもしれません。
CLISPを選んだのは、単にM.Hiroi氏のサイトで紹介されていたからという理由なので。
http://www.geocities.jp/m_hiroi/clisp/index.html Common Lisp以外の話ですみませんが、Puttyというもの、知りませんでした。
検索するとターミナルエミュレータがでてきますがそれのことでしょうか。
また、コマンドプロンプトのかわりにもなるのでしょうか。
仰るとおり、PuttyはtelnetとかSSHで接続するときなんかに使うターミナルエミュレータです。 コマンドプロンプトの使用感に満足できないので、CygwinとCygTermとPuttyを組み合わせて使ってます。 UTF-8の出力を表示できたりして便利です。最近ではより手軽に使えるMinttyというのもあります。 処理系は、Clozure CL 1.8とSteel Bank Common Lisp 1.0.52では同条件で問題なかったです。 CLISPは環境依存の問題に真面目に取り組んだのが仇になった感じですね。
横レスで質問します emacs+slimeでcommon lispのソースファイルをいじりすぐに実行するからよく分からないのですが、 ターミナルエミュレーターを使用するのはどういう場面なのでしょうか
SLIMEを使うので、普通の開発時に使いたいと思うことはほぼないです。 他プロセスから処理を起動したいときとか、swankをロードしないイメージを作りたいときとか、 そんなときに。UNIX系のOS使う場合はEmacsでansi-term使っちゃいますけど。
>>380 Win7 + cygwin + CLISP + mintty(Putty派生) だけど、
(setq custom:*pathname-encoding* "utf-8")
(setq custom:*default-file-encoding* "utf-8")
(setq custom:*terminal-encoding* "utf-8")
で行けたよ。
392 :
デフォルトの名無しさん :2012/07/12(木) 02:06:06.53
>>387 Clozure CLかSteel Bank Common Lispを試してみて、
それでもだめならコマンドプロンプト代替になるものに手を出します。
>>390 資料見てみました。
どうやらCLISPをWindowsのコマンドプロンプトから使うというのが間違いのようですね。
ちなみに日本語の入力はできました。
>>391 それがコマンドプロンプトではだめなようなのです。
皆様ありがとうございました。
またわからないことがあったら質問させていただきます。
わかりやすくまとまっているね
長いS式をformatで出力すると自動改行されてしまいます。 改行せずにフォーマットで指定した通りに出力させることは出来ないのでしょうか? 具体的には (defvar tmp '(asdf zxcv asdf zxcv asdf zxcv asdf zxcv asdf zxcv (asdf zxcv asdf zxcv asdf zxcv asdf zxcv asdf zxcv asdf zxcv asdf zxcv asdf zxcv)asdf zxcv)) (format t "~{~A ~}" tmp) とすると ASDF ZXCV ASDF ZXCV ASDF ZXCV ASDF ZXCV ASDF ZXCV (ASDF ZXCV ASDF ZXCV ASDF ZXCV ASDF ZXCV ASDF ZXCV ASDF ZXCV ASDF ZXCV ASDF ZXCV) ASDF ZXCV と、改行されてしまいます。 SBCL 1.0.49 です
(let ((*print-pretty* nil)) (format t "~{~A ~}" tmp)) かな
>>398 お〜!!うまくいきました。そんな変数があったのですね、Perlみたいです。
common lisp 自動改行 させない 等でググったのですが見つけられなかったので無理なのかなぁと思っていたところでした。
ばっちりのレスありがとうございました。
CLtL2の22,27章は一度目を通しておくべき。
(setq data '(global)) (let ((data '(lexical)) (sexp '(cons "HOGE" data))) (eval sexp)) ;=> ("HOGE" GLOBAL) なぜevalではletで定義した局所変数ではなく setqで定義したグローバル変数が使われるのでしょうか?
局所環境は空にして評価されるからです。 局所環境を反映させたければ、`などを使ってS式を作る時に行なってください。 > [Function] > eval form > > The form is evaluated in the current dynamic environment and a null lexical environment.
>>403 レスありがとうございます。
すみません、局所変数が使われない理由が局所関数は空にして評価されるからというのはトートロジーに聞こえます。
理由が知りたいのです。
理由は知りません
仮にローカルな環境を引きずるのであれば、 (setq f (let ((data '(lexical)) (sexp '(cons "HOGE" data))) (lambda () (eval sexp)))) (funcall f) => ("HOGE" LEXICAL) とならなきゃいけないけど、それはとても非現実的な仕様。 クロージャにすべてのローカル環境を引き継がせねばならなくなっちゃう。
>>404 グローバル変数はパッケージに登録されてて、
実行時のルックアップがし易いけど、
ローカル変数はコンパイル時に解決してしまうからじゃないかなぁ。
最適化をかけたら変数が消滅することすら有るわけで。
eval のために最適化を諦めるのも馬鹿馬鹿しいし。
REPLをevalで実装するとして、CLISPみたいに、 式を評価するごとに自然数をインクリメントしてプロンプトに表示し、 それをnというレキシカル変数で管理しているとする。 ここでもし、evalがレキシカルな束縛を参照できる場合、 nを破壊的に変更すると、プロンプトに表示される数も変わってしまい、 機能が破綻する。 こんな感じで、実用上も色々悲惨なことになる気が。
>>404 > ローカル変数はコンパイル時に解決してしまうからじゃないかなぁ。
これに尽きると思う。
インタプリタだけに限るなら、そういう実装があってもいいと思うけど。
ローカル変数はコンパイル時に解決してしまうとはどういうことでしょうか?
つまりコンパイル後のコードには変数のアドレスだけがあって名前は残らないので (機械語的にはアドレスさえ判れば値を読み書きできるから名前は要らない) 名前で検索することはできないということ
それだけじゃなくて、一般的にはどの変数が参照されるかわからないから、 レキシカル環境を空にしない仕様だと、環境を全て持ち運ばないといけない。
しかしクロージャはその時見えていた環境を全て持ち運びますよね? クロージャの環境持ち運びはなんとか実現できたが、 evalでのそれは難しかったのでしょうか。
CLでは、レキシカルスコープを採用している上に、
クロージャは#'(lambdaの特殊な形に限定されてる。
ところがevalは引数を一度評価してからevalので、
引数評価時にS式を生成することも可能で、
基本的に実行時にならないと何を参照するかわからない。
(
>>402 のケースは単純だから最適化する「コンパイラ」もいるだろうけど)
インタープリタの気持ちになって追ってみるか、
インタープリタを作ってみれば分かる。
始めたばっかだけど、Lispの関数の命名センスがなぁ・・・
たとえばどんなの?
cdrないなぁ とかw
好きなだけ自分好みの別名を付ければ良いよ。 S式さえ受け入れられれば、文法面では好き勝手できるのがLispなんだし。
だが俺のプロジェクトでは許さん
個人的には rplacd に怨念めいたものを感じた。
リプレース カー と リプレース クダー だろ? 確か当時は、名前に使えるのが6文字まで、とかいうシステムがあったりして、 そういう省略名は今よりだいぶ一般的だったはずだと思われる。
strdupとかmemcpyとかbzeroとか、その手の省略なんて腐るほどあるじゃないですかー! やだー!
eltって何の略なの?
エレメント(element)でねーべか
リストに対する処理をする関数の引数順が 要素 リスト、の順だったり、リスト 要素の順だったりでわかりにくい
SLIMEのサポートに頼りっきりなので、もう引数の順番とか気にしなくなった。
sexp
>>425 原則t的に省略可能なものが後ろに来るんじゃなかったっけ?
実践common lispの26章はAllegroServeを使ってwebプログラミングをしているのですが、 当方emacs+slime+sbclの環境でこの章まで読み進めてきましたので できれば既存の環境+アルファで済むようなものがあればそれを使ってみたいのですが 何かありますか?
>>429 AllegroServe は確か SBCL でも動いたと思うよ
PortableServe だったかそんな名前。
quicklisp でインストールできたは分からないけど。
(car sex)
aserve だった。quicklisp にもあった。
上につづく (defmacro do-forever (&rest body) `(if (equal (car ',body) '(return)) nil (progn (car ',body) ; ←リストが返り実行されず (do-forever (cadr ',body))))) ;←不定個数の残りだけ渡すのはムリ
Common Lisp は末尾呼び出しの最適化を保障してないから、 永久ループを再起呼び出しで書いちゃダメ。 quasiquote の意味がわかってないんじゃない? do-forever 内に do-forever を書くとマクロ展開が終わらなくなるよ。 というのは置いといて、 スタックオーバーフローしていいならこれでどう? (defmacro do-forever (&body body) (let ((g (gensym))) `(block nil (labels ((,g () (progn ,@body) (,g))) (,g)))))
>>435 回答ありがとうございます。
>quasiquote の意味がわかってないんじゃない?
はい、わかりません。勉強します。
もしよろしければ、quasiquote意外にも知っていた方が良いと
思われる事がありましたらURLやキーワードだけでも結構です。
教えていただけませんか。当方、入門書を読み終わった程度です。
マクロ書くなら、パッケージとフェイズ(コンパイル時、ロード時、実行時) については知っておいた方が良いと思う。特にフェイズ。 参考資料はHyperSpecとかCLtL2とかくらいしか思い付かなくて申し訳ないけど。
>>435 >Common Lisp は末尾呼び出しの最適化を保障してないから
知らなかった。意外だな。
これっていちばんLispらしいところだと思うんだけどどうなの?
コンパイラは出来る時にはやるから別にどうとも。 CLOSのafter method, around-methodとの相性も悪いし。
formatについての質問です (mapc #'(lambda (x) (format t "~3D~%" x)) '(267 42 8)) このようなことをするときに ~3dの3の部分を数値の桁数+1として動的に変化させる方法はありませんか?
" ~D~%"みたくスペースいれとくのじゃ駄目なの
すいませんすごく素朴な質問をさせてください C/C++や、あるいは、アセンブリ言語ではむずかしいけれど、 Lispならあっさり対応できる問題(なるべく実用的なのがいいです)の 典型例はなんかないでしょうか?
ぶっちゃけた話、アセンブリ言語とC99相手なら、数少ない例外を除いて、 ほとんどの分野の問題で圧勝できると思うけど、C++11は変態なので多分そこまでの差はない。 メタプログラミングの分野では一日の長があるか、って感じじゃないの。
445 :
443 :2012/08/06(月) 09:50:41.99
実装の手間とか、設計スタイルとかで差は出ないんでしょうか? エレキ上がりの上司にヒト泡吹かしてやりたくて情報収集中で、 そいつが「下が分かればすべてできる」みたいな思想の持ち主なんですが、 俺のほうは「できると適切は別だボケ」と反逆心をみなぎらせているわけです
不便そうな言語でスラスラ書いちゃう人もいるからねえ まあ何か大規模なもんやらせれば?
マ板に行ってくれないか?
その上司の言っていることは、そんなに間違ってないよ。 >俺のほうは「できると適切は別だボケ」と反逆心をみなぎらせているわけです まさに同じ理由で上司が正しいとも言える。 コンピュータにも得手不得手があって、ハードが分かっていれば、自ずとそれが分かる。 コンピュータに苦手な方法を採用すると、実行効率が落ちるだけの結果になる。 コンピュータにとって素直な形で実装されてて、しかも表現力も有るC++に勝つのは難しい。
449 :
uy :2012/08/06(月) 14:40:08.78
>>436 可愛らしいお名前ですね^^v
れいこちゃんのティロをフィナーレしたい・・・
(defun test (a &key b c) (list a b c)) こう書いた場合、(test 10 :c 30) ; => (10 NIL 30) となるのは良いのですが、 (test :c 10) ; => (NIL NIL 10) となるようにできない理由は、(おもに実装面において) 何があるのですか? また、(test :c 20 30) ; => (30 NIL 20) となるようにできると便利だと思うのですが…。 教えて下さい。
実装できない理由はないと思うけれど、 &optional でないものを省略できていいのだろうか 後者は便利というより混乱の元にならないかな
>>443 やはり記号処理じゃないかな。
パズルを解くとか
>>440 (mapc (lambda (x) (format t "~vd~%" (+ (truncate (log x 10)) 2) x)) '(267 42 8)) ; required (plusp x)
>>442 >>453 ありがとうございます。
>>453 のlogと~vを使うテクニックがすぐに思いつきませんでした。
まさにこの処理をしたかったのです。
>>444 C++11はlambdaのおかしい部分が次のバージョンC++??で直れば
schemeと同等ぐらいになると思う
457 :
453 :2012/08/07(火) 16:25:49.04
マジで
>>441 な話だったのかw
桁の大きい数字に合わせて整形したいって話なのかと思ったのに。
LISPは人工無能向けだと聞いたのですがそうなのですか?
っPAIP
つOn Lisp
arcってこけちゃった?
そういう視点でLisp方言をみる習慣がLisp界隈ではない。
物事を勝ち負けでしか考えられない奴のために、一年中オリンピックやってくんないかな
まとめるとarcはこけました
randomを使ったシミュレータもどきをつくろうとしています。 同じシミュレーションでは常に同じランダムステートを使用して どんな場合でも同じ結果が出るようにしたいのですが 常に同じランダムステートを得るにはどうしたらよいのでしょうか?
イメージをダンプしておけば良いんじゃないかと思うけど、どうだろう。 sb-ext:save-lisp-and-dieとか、ccl:save-applicationとかで。
>>469 たいしたもんを作ろうしてるわけではないんでそれでもいいんですが
大規模なのをやる時はそれだとなんかいやだなあ、と思ってます
>>471 最初にそれ試したんですが、
:SMPLOCKERなんてキーワードしらねーよって言われるんで諦めてました
外したらいけたんでそれで行きます、ありがとうございます
lispの勉強を始めたばかりです 文字列をそのまま、ダブルクォーテーション無しで出力する方法が分かりません (format nil "~A" "Hello, World") "Hello, World" どうすればいいのでしょうか。 処理系はWindows7でのSBCLです
(format t "~A" "Hello, World") Hello, World 返り値としての文字列に""がつくのはどうしようもないのでは。
REPLの出力関数いじればいいが、だからどうなのって話だ。
>>468 CLはよく知らないけど,通常のプログラミング環境でいう乱数は厳密には疑似乱数だよ.
疑似乱数生成器に初期パラメタとして与える乱数の種(random seed: 普通は大きな素数
が好まれる)が決まれば,その後得られる疑似乱数列は一意に決まる.
だから同じ結果を得たければ,最初に同じ乱数の種を与えるだけでいいはずだよ.
478 :
横レス :2012/08/18(土) 15:40:51.06
擬似乱数の知識がないのかな? seedはstateとは違う。seedはstateの初期値のこと。 古典的な擬似乱数アルゴリズムの場合、同じ型であることが多いが。 sbclの場合は、make-random-stateで作ることが出来る。 読み書きもできるから、保存も簡単。 使われているアルゴリズムはMersenne Twister。 他の処理系は知らない。
>>477 >>478 そうかい.「CLはよく知らないけど」って書いといてよかった.w
それにしてもCLだけがそんなに本質的に異なる言語だとも思えないんだけどな.
ちなみに俺も数値実験とかシミュレーションとかやっているけど,
途中の乱数をすべて保存しておかないと結果を再現できないような開発環境じゃ
とてもやる気しないぞ.
そういう処理が必要になるモデルのアルゴリズムに問題があるんじゃないの?
完全に理解不足ならお許しください.俺生粋のSchemerだから.(もう来ない)
480 :
横レス :2012/08/18(土) 16:06:56.77
>>479 > 途中の乱数をすべて保存しておかないと結果を再現できないような開発環境じゃ
> とてもやる気しないぞ.
そんなこと誰も書いてない。
えーと、つまり、CLでは擬似乱数生成器の状態をrandom-state型のオブジェクトで管理してて、 writeで書き出せてreadで読めるって理解で良い?
そう。それ以外は実装依存。
把握。ありがとー。
横レスだがそのやりとりを見てcommon lispのランダムステートをちゃんと理解できたわ どこかでランダムステートの解説を読んだ際に、なんか違和感があるなと思ったんだが すっきりした
485 :
デフォルトの名無しさん :2012/08/20(月) 00:44:28.09
大規模な乱数テストを多数回繰り返すには、 ランダムステートをファイルに保存するのがとても良い方法だと思います。 しかし、ちょっとした乱数テストで良いなら、次の方法も使える気がします。 (setf rs0 (make-random-state)) (setf rs1 (make-random-state rs0)) (let ((*random-state* rs0)) (loop :repeat 10 :collect (random 100))) ;=> (14 0 42 11 91 63 79 87 95 50) (let ((*random-state* rs1)) (loop :repeat 10 :collect (random 100))) ;=> (14 0 42 11 91 63 79 87 95 50) ちなみに *random-state* を動的に束縛せずに、 random の第2引数としてランダムステートを与えても大丈夫です。 (loop :repeat 10 :collect (random 100 rs0)) でもok。
sbcl依存で問題ないなら、それでいい。
ランダムステートの実装は処理系依存ですが、
関数 make-random-state はansi規格で定められています。
http://www.lispworks.com/documentation/HyperSpec/Body/f_mk_rnd.htm#make-random-state ですので、どのような処理系を使用していても make-random-state を用いて、
乱数テストを行うことができるのではないでしょうか。
さて、CLtL2の12章9節に、乱数テストの方法が2つ書いてあります。
1つはランダムステートをファイルに保存する方法、
もう1つはランダムステートをコピーする方法です。
後者の方法では、次のようなマクロによって、
より簡単に乱数テストができるかなと思いました。
(実践Common Lispの20章3節の注7を参考にしました)
(defmacro with-same-random-state (&body body)
`(let ((*random-state* (make-random-state #.(make-random-state t))))
,@body))
(with-same-random-state (random 100)) => 81
(random 100) => 34
(with-same-random-state (random 100)) => 81
(random 100) => 26
計算機プログラムの構造と解釈って本の例を試しながら読み進めようとして 右も左もわからずclispとかいうのをインストールしてみましたが、変数定義で (define a 2) とかやると *** - EVAL: undefined function DEFINE The following restarts are available: USE-VALUE :R1 Input a value to be used instead of (FDEFINITION 'DEFINE). RETRY :R2 Retry STORE-VALUE :R3 Input a new value for (FDEFINITION 'DEFINE). ABORT :R4 Abort main loop Break 1 [2]> a とか言われて失敗します。一体どうすれば?
>>488 「計算機プログラムの構造と解釈」が扱ってるのはLisp処理系のうちschemeって呼ばれている物
clispはCommon Lisp処理系
どちらもLisp族だけど書籍のコードを動かしたいなら「scheme処理系」でググって使ってるOSに合う物をいれなされ
>>489 apt-cache search scheme で山ほどヒットして、その中にmit-schemeとかいう一番それっぽいのがあって入れてみたらdefineのエラーが消えました!多謝!そしてさようならcommon lisp。;;
>>473 です
lispの出力は
(print "obj") (prin1 "obj") (princ "obj")
printとprin1では必ずダブルクォーテーション付きでobjを出力し、さらにダブルクォーテーション付きでobjを返す
princではダブルクォーテーション無しでobjを出力し、さらにダブルクォーテーション付きでobjを返す
(format t "obj") (format NIL "obj")
formatでは書式tだと標準出力にダブルクォーテーション無しでobjを出力し、さらに評価「NIL」を返す
それ以外の書式だとダブルクォーテーション付きストリングを生成して返す
ダブルクォーテーション無し、評価無しでobjだけ出力するには自分で出力関数を書かないといけない
ということでよろしいのでしょうか?
>>492 評価について何か勘違いしてる気がするよ
>>492 インタプリタのREPループの外で実行すればOK
>>492 基本的にREPL (sbclをコマンドラインなしで起動した画面の状態の事ね) では
式を入力すると必ず評価値が表示されるんよ
* (format t "asdf")
asdf
NIL
これはrubyのirbで
irb(main):001:0> puts "asdf"
asdf
=> nil
って表示されるのと一緒だと思いねえ。
REPLじゃなければNILは表示されないんで、 hoge.lisp ってファイルに
(format t "asdf")
って書き込んどいて
sbcl --script hoge.lisp
って実行すれば出力だけ表示されるよ
カブッタ
リスト操作の質問です リスト1とリスト2とリスト3があり、リスト1とリスト2には同数のatomがあります (defparameter *list1* '("あ" "ぃ" "い" "ぅ" "う" "ぇ" "え" "ぉ" "お")) (defparameter *list2* '("ア" "ィ" "イ" "ゥ" "ウ" "ェ" "エ" "ォ" "オ")) このリスト1とリスト2の順序には対応関係があります(「あ」<->「ア」) そして、リスト3中にリスト1に該当するものがあれば対応するリスト2のatomに置き換えたいのです (defparameter *list3* '("る" "く" "わ" "と" "て" "て" "ぶ" "い" "ね")) リスト3の走査と置き換えは↓のような感じになると思うのですが (mapcar (lambda (x) ;; memberを使ってxが*list1*内にあるか調べる (let ((rep (member x *list1* :test #'equal))) (if rep ; 置き換えする場合 ;; *list2* のうち対応する要素を返す ??? ;; それ以外はもとの要素を維持する x *list3*) 肝心の置き換え(???の部分)が分かりません。どうすればいいですか
*list1* *list2*のように分けるんじゃなくて 対のリストを作った方がいい '('("あ" "ア") '("ぃ" "ィ") '("い" "イ" ) ・・・
(defparameter *list1* '("あ" "ぃ" "い" "ぅ" "う" "ぇ" "え" "ぉ" "お")) (defparameter *list2* '("ア" "ィ" "イ" "ゥ" "ウ" "ェ" "エ" "ォ" "オ")) (defparameter *list3* '("る" "く" "わ" "と" "て" "て" "ぶ" "い" "ね")) (print (mapcar (lambda (x) (let ((rep (assoc x (mapcar #'cons *list1* *list2*) :test #'equal))) (if rep (cdr rep) x))) *list3*)) 何回も置き換えやるなら、assoc のところちゃんと最適化したがいいと思う。
>>501 ちょっと苦しいけど, こんな感じ?
(format t "~v,,,'*A~%" (funcall fn i) "")
それです!vでしたか。ありがとうございます。
(format t "~V@{*~}" (funcall fn i) t) とかでも行けるかも
506 :
デフォルトの名無しさん :2012/09/04(火) 03:09:50.10
mac OS X 10.6.8でsbclをソースからコンパイルしたのですが、sb-posixがうまくインストールされないらしく、警告が出ます。 WARNING! Some of the contrib modules did not build successfully or pass their self-tests. Failed contribs:" sb-posix 気にせずインストールしてquicklispを使うと、つぎのエラーが出ました。 #<SB-SYS:FD-STREAM for "file /usr/local/lib/sbcl/sb-posix/defpackage.fasl" {10054B8873}> was compiled for implementation X86, but this is a X86-64. sbcl 1.0.58と1.0.55で試しましたが同じでした。sh make.shのオプションは--fancyのみです。 64bit版macで問題なくsbclをソースからインストールできた方いますか?
自民党のすごい有力な議員に聞いたんですが「日韓関係どうなりますか?」。
すると「元に戻ることはありえない」と。
元に戻るとは、李明博大統領が竹島に来る前です。
「そこに戻ることはどんな状況になってもありえない。」
「日本は選挙をやって政権交代の可能性が高いでしょう。
韓国も大統領選挙で政権交代して、多少の歩み寄りはあるかもしれないが元に戻ることは絶対ない。」
ICJ提訴は官僚が動いています。
こいうとき官僚のいいところは動き始めたら止まらないこと。
政権が明示的に「やめろ」と言わない限りやめません。提訴されるでしょう。
日本国民の世論を考えると政権が「やめろ」と言うことはありえない。
単独提訴は確実にいくだろう。韓国政府は当然応じないでしょう。
その次どうするか。
日本は韓国が提訴に応じるまで、ひたすら圧力をかけないといけない。
島根県竹島ですよね。李明博は韓国軍の総司令官です。大統領ですから。
軍総司令官が不法に我が国の領土に入国したということは安全保障上の問題が成立しています。
安全保障上の問題が成立していたら一ついいことがあります。
いいことといったらあれですが。
例えば、日本が韓国に対して部品とか資本財をうらないとか、
あるいは輸出関税を100%、200%をかけてサムスンとか現代自動車が大打撃。
あきらかな経済制裁するのは基本的にはWTO違反。
ところが、安全保障上の場合は例外です。
ということで、韓国は通貨スワップもそうですが、
経済制裁を受けても日本側が理屈が立つ状況を作ったので
本当に後戻りできない状況になったなと思います。
http://www.youtube.com/watch?v=agWGEImnuoY#t=5m15s
510 :
デフォルトの名無しさん :2012/09/04(火) 15:21:41.39
>>507-508 ありがとうございます。
試してみましたが、パッチはどうやらテストを回避するためのもので、sb-posixのインストールを可能にするものではないようです。
また、コードを見たところ、1.0.58では元々パッチに似た変更が加えられていて、インストール自体は通るようになっています。
バイナリ版のsb-posixは正常に使えるので、方法はあるはずなのですが…。
>>510 反応遅くなって申し訳ない。
テストに引っかかって必要なものが正しくインストールされないのかと思ったけど、違うのかー。
それはそれとして、そのバイナリはどこから入手した物? sbcl.orgから? どこかのパッケージシステムの?
パッケージシステムでインストールしたものなら、独自のパッチをあててる可能性があるけども。
あと思い付くのは、ビルド処理に介入して、警告とかエラーが出てる部分を探ってみるとか。
うーん。こちらもMac持ってれば良かったんだけど。何かあんま力になれなくてごめんねー。
512 :
デフォルトの名無しさん :2012/09/07(金) 00:07:41.23
>>511 親切にありがとうございます。
パッチそのものは以前のバージョンへのパッチで、1.0.58ではパッチの当てられている箇所にいくつか変更が加えられています。
そのためそもそもこちらが正しくパッチを当てられている保証もないのですが。
結果的には、このバグのない以前のバージョンを採用することで解決しました。
1.0.39まではsb-posixは正しくインストールされ、1.0.40以降になると駄目のようです。
ずっと古い版を使うわけにもいかないので、近いリリースで解決してほしいところですが。
514 :
デフォルトの名無しさん :2012/09/07(金) 08:10:59.89
実用 Common Lisp と 実践Common Lisp どちらを先に読んだほうがいいですか?
516 :
デフォルトの名無しさん :2012/09/08(土) 00:39:02.55
>>513 パッチのdiffのうち、修正箇所をご指摘の部分のみに限定したところ、1.0.58でsb-posix込みのインストールに成功しました。
本当にありがとうございます。
残念なのは、流れを見るかぎり、当分本家での修正はなさそうですね。どうしてなのでしょう。
>>516 おー。良かった良かった。おめでとー。
多分、Mac OSの新しいバージョンだと、その辺りに変更があって、問題が発生しないんじゃないかな。
ビルド処理のバグとしてもう一度報告したら、改めて対応されることはあるかもしれない。
518 :
デフォルトの名無しさん :2012/09/08(土) 06:23:59.65
>>515 ありがとうございました。
注意点などございますか?
>>515 実用から入ると「なかなかの難問だ、ここはわたしのマクロで解決しましょう(眼鏡がキラリ)」てな感じのクールなハッカーになれる。
実践から入ると「うおおおおれとlispは最強のコンビだうおおお!!」みたいな熱いハッカーになれる。
実用と実践が逆じゃね? 実用にはマクロがそんなに出てこなかったような気がする
実践と実用まちがえた、てへぺろ
522 :
デフォルトの名無しさん :2012/09/08(土) 17:24:31.81
実践からでいいですよね?
523 :
デフォルトの名無しさん :2012/09/08(土) 20:03:39.61
>>522 どっちからでも大丈夫だよ。どっちもとても良い本。
個人的には実用を勧める。確実に技術レベルというか考え方が
変わる、AIの本。実践はCLの本。
実践からでいいよ。先に実践を読めば、 実用のほうでCLについて困ることはないので内容に集中できる。
そもそもCLってどういうことができてどういう部分が嬉しいの? ということを手っ取り早く知りたいなら、実践からの方が良い。 実践という本の存在目的がそれだし、実用に比べれば薄いから比較的素早く一巡できる。 そして、モヤモヤを抱えなくて済む。
526 :
デフォルトの名無しさん :2012/09/09(日) 04:56:16.81
どちらからでもいいですよね?
もちろん読みたい方から読めば良い
実用って読むのに数ヶ月かかりそうな鈍器みたいな本じゃなかったっけ
529 :
デフォルトの名無しさん :2012/09/10(月) 01:47:18.83
読み通してからじゃないとプログラミングできないってものでもないし むしろなにがしかの経験があった方がいい
531 :
デフォルトの名無しさん :2012/09/10(月) 02:27:36.37
そんな大層な話じゃない 自分でプログラミングしてつまったり分からなかったりという経験
533 :
デフォルトの名無しさん :2012/09/10(月) 06:28:42.24
535 :
デフォルトの名無しさん :2012/09/10(月) 23:51:31.75
迷わず行けよ、行けばわかるさ で初心者なのにOn Lisp表紙買いして撃沈して paul grahamのAnsi Common Lisp -> 実践と読み進めた。 実践は良書
537 :
デフォルトの名無しさん :2012/09/11(火) 00:11:24.77
案ずるより産むが易し。
539 :
デフォルトの名無しさん :2012/09/11(火) 10:58:37.01
>>443 CommonLisp なら、インタプリタや CUI のプロトタイプが
BNF とか無しで直ぐにできちゃいますよね。
541 :
デフォルトの名無しさん :2012/09/11(火) 18:19:14.69
H本を読むのと一緒だ とにかく読め。そして手を動かせ
そしてメール欄にsageと書くんだ
544 :
デフォルトの名無しさん :2012/09/12(水) 00:19:53.80
>>542 >>543 おまえら見たいなのは、ガイ・スティールやリチャード・ストールマンとは
相容れないバカ人間だ。
二度と Lisp を語るな。
沸点低すぎ あたまだいじょうぶ?
546 :
デフォルトの名無しさん :2012/09/12(水) 00:32:20.37
>>545 酔ってる。
見直したら、悪くなかった。
許せ、542, 543
絶対許さない
548 :
デフォルトの名無しさん :2012/09/12(水) 03:00:32.23
真面目に答えてくださいよ
お前ら釣られすぎだろw
550 :
デフォルトの名無しさん :2012/09/12(水) 03:39:27.63
>>548 読み方のコツか。
四の五の言わずにサッサと本を買ってきて本文を読め。
読んだ上でわからないことがあったら改めて質問せよ。
これ以上実際に読みもせずにウダウダ言っているのは、誰にとっての得にもならない。
以上。
toplevelでdefvarやdefconstantする変数や定数に*や+で耳あてするな! って主張してるのはどの本だっけ?
>>552 Let Over Lambdaの2.7節
554 :
デフォルトの名無しさん :2012/09/13(木) 00:58:13.43
>>552 そこまで強く言ってたっけ?
「主に主観的なもので、耳当ては暑苦しいからだ、読者のプログラムにはそう勧めるつもりはない」
って書いてあったような
初学の頃は、本に載っているコードは全部手で入力して実行するのを奨めます。
558 :
デフォルトの名無しさん :2012/09/18(火) 02:36:39.01
このスレに居る人はcommon lispで生計を立てている人が多数?
common lispの案件なんて見たことないな
Franzの中の人くらいじゃね?
>>559 生計は立ててないけど
業務で言語指定されない限りは CL つかうかな
指定されても, 使い捨てのツール類は CL だよな
ツールが生き延びる場合は, CL のコアイメージとソース渡しておしまいかな
突然失礼します MAXIMA使っててlispの存在を知ったのですが 今後のためにlisp層に降りるべく勉強をしてます とりあえず、「On Lisp」を読んでる最中ですが これを理解するうえで助けになる資料がありましたら 教えていただければ幸いです よろしくお願いします。
>>564 参考になりました
ありがとうございます
スレ汚し失礼しました
その二冊がOn Lispを理解するうえで助けになるか? On LispはOn Lisp単独で、ひとりで黙々と読めばいい。 時間はかかるが力になるよあの本は。
なんと中身の無いレス
lispのschemeを、やってみたい。 プログラミング初級ですが、できますかね?ニート26歳高卒。
grahamのansi common lisp p.43の (setf x '(b)) (push 'a x) x (setf y x) (pop x) x; => (B) y; => (A B) このxとyの最終結果の違いがなぜうまれるのかわかりません。 (pop x)によってyにも(pop y)と同じような効果がもたらされると思ったのですが。 (setf y x)の時点のxの情報をyに保存するのであって、(setf y x)以後はxをいじったとしてもyには 何も影響しない、ということでしょうか。
ポインタ図を書いてみれば? setfの第二引数は評価されることを念頭に置いて。
そうでもない。 (setf x '(b)) (push 'a x) (setf y x) (setf (cdr x) '(c)) (list x y) ;=> ((A C) (A C)) 正確には違うけど、popの動作が (prog1 (car place) (setf place (cdr place))) こんな感じなことを踏まえると、仕組みが分かるんじゃないだろうか。
576 :
572 :2012/10/03(水) 01:04:16.14
Cormenのintroduction to algorrithmsのinsertion-sortをcommon lispで
そのまま書いてみようとしたのですがうまく動きません
擬似コードは↓のノート中程にあります
http://www.catonmat.net/blog/wp-content/uploads/2008/08/mit-algorithms-lecture-01-01.jpg これをもとに
(defun insertion-sort (a)
(let (key i j)
(do ((j 1 (+ j 1)))
((= j (length a)) a)
(setf key (nth j a))
(let ((i 0)
(j 0))
(loop
when (and (> i 0)
(> (nth i a) key))
do
(setf (nth (+ i 1) a) (nth i a))
(setf i 0
j 0))
(setf (nth i a) key))
)
a))
と書いて
(insertion-sort '(5 2 4 6 1 3))
で何も値が返ってきませんでした
どこが間違っているのでしょうか
>>577 指摘したい部分はいくつかあるけど、無限ループになってるのはloopの部分。
マクロ展開すると終了しないのが分かる。
(BLOCK NIL
(TAGBODY
ANSI-LOOP::NEXT-LOOP (IF (AND (> I 0) (> (NTH I A) KEY))
(PROGN (SETF (NTH (+ I 1) A) (NTH I A))
(SETF I 0 J 0)))
(GO ANSI-LOOP::NEXT-LOOP)
ANSI-LOOP::END-LOOP))
多分whenじゃなくてwhileとか使いたかったんじゃないのかな。
Common Lisp: loopマクロ用法抄
http://smpl.seesaa.net/article/29800843.html
一応補足しておくけど、whileにしてもまだ正しく動かないはず。 自分で考えたいだろうから具体的どこが間違っているかは言わないけど。 擬似コードと比べてみれば分かると思う。 というか元のノートの字の汚さにびびったよw
壁紙にしても違和感がなさそう
581 :
577 :2012/10/12(金) 10:16:22.52
ありがとうございます。ご指摘の通りwhileを使うべきだったのに whenを使ってしまいました。 こう書き直したら動きました。 (defun insertion-sort (a) (do ((j 1 (+ j 1))) ((= j (length a)) a) (let ((key (nth j a)) (i (- j 1))) (loop while (and (>= i 0) (> (nth i a) key)) do (setf (nth (+ i 1) a) (nth i a)) (setf i (- i 1)) ) (setf (nth (+ i 1) a) key) )))
>>582 ありがとうございます。ご指摘の通りです。
DO一色やLOOP一色はすごいですね。
ところで、loopに:forとありますが:を使うのが主流なのでしょうか。
for を使うとシンボルが intern されてしまうので、 潔癖症の人は :for を使う。 以下、clispの対話実行。 [1]> (loop :for i :from 0 :to 1) NIL [2]> (find-symbol "FOR") NIL ; NIL [3]> (loop for i from 0 to 1) NIL [4]> (find-symbol "FOR") FOR ; :INTERNAL
Qiitaのを書いたのは別の人ね。見つけたのでせっかくだから紹介してみた。 :forとかはそこまで主流じゃないけど、たまに見かけることはある、って感じかなー。 Emacsとかだと色が付くし、loopのキーワードってことが分かりやすいのが利点だと思う。
なるほど、そうだったのですか。勉強になります。
ASDFの今のメンテナの人だね。
>>587 google mapのルート案内にCL使うんじゃないだろうな?
型クラスというより、1st-class "interface"だよね。
あのG社も使っているCL!キミも使おう!!
外部から買ったコードをメンテナンスするだけで 新規プロジェクトとかには使わないだろ
クラッシュ・バンディクーもLISPを使ってたらしい。
最近だとLuaが多いだろうな
使わないコードをわざわざ買収しないよw
luaは組み込み専門でしょ。 小さいシステム構築以外は 厳しい言語仕様。
CFFIとかiterate保守ってるLuis Oliveiraは幼女。メアド的な意味で。
slimeを使っていて、Lispコードの慣用句を よく忘れるんだけど、何か対策ない?
具体的には?
yasnippet とか使えばいいんでね。
おまえにLispは無理
みんなは家計簿ってつけていないの? 家計簿のためだけにOooを立ち上げるのがめんど くさくなってきた。マウスに触らないといけないし。 bash上で動く単純な家計簿システムならかなり 小さくなるかな。
> Ooo 今時は Libre じゃないの? (家計簿 (小遣い ...) (書籍 ...) ...) とかするんじゃねえの, lisper だったら?
すごく初心者的な質問かもしれないけどcommon lispでライブラリの読み込みってどうやればいいんでしょ 環境はWindows7 + GNU CLISP slimeからquicklispで >(ql:quickload "usocket") と打ってusocketをインストールしますわな その後例えば sockettest.lispというファイルを作って (require :usocket) ・・・ ・・・ と書いて $ clisp sockettest.lisp で実行したら当然動かない この場合sockettest.lisp内に (load "C:/Users/hogehoge/...lisp") みたいに必要なファイルを読み込む処理を入れる必要があるの? これってすごく環境依存になるので不味いと思ってる。 書いたコードがLinuxやWindowsでも動くようなポータブルなやり方を知りたい
>>607 ヒント:エラーメッセージないとエスパーにしか分からない
Quicklisp使ってるなら、わざわざrequireしないで素直に
(ql:quickload "usocket")
しなされ。マクロを使う場合は
(eval-when (:compile-toplevel :load-toplevel :execute)
(ql:quickload "usocket"))
しなされ。Quicklispがロードされてることを確認しなされ。
詳しくなりたいならASDFとQuicklispについてググりなされ。
loadは今だと直接使うことはほぼありませぬ。
>>608 ありがとうございます
common lispの仕組みを知りたかったので、それが聞きたかった答えです
quickloadしたらもうライブラリは読み込まれてるってことでいいんですかね
load やら asdf やら素人目にはやり方がいろいろあるように見えてしまいます
階層をなしてるんだから複数やり方があって当たり前。 open→fopen, ソケット→xmlhttprequest→jQueryみたいなもん。
Quicklispはパッケージ管理システム。他言語のRubyGemsやCPAN、Haskellに相当。 ASDFはビルドツール。多言語のmakeやRake、Apache Mavenに相当。 loadはCommon Lispの言語の機能。指定したファイルを読み込む関数。 QuicklispはASDFを利用して作られ、ASDFはloadを利用して作られている。
Haskellに相当てwHaskellのCabalねw
haskell→hackageと言いたいのかな? CPANも、cpanと書いた方がCPANシェルと分かりやすいと思う。 CPANはアーカイブの名前だから。
CPANで合ってる。QuicklispはAmazon S3上に構築されたシステムの名前。 ql:quickloadとかのフロントエンドとか全部ひっくるめてQuicklisp。
別の初心者が横から質問なんですけど 他の言語でのimportみたいなのは loadを使うのが一般的なんですか? ql:quickloadですか?
>>615 importっていうと、JavaとかPythonとかHaskellとかを連想するんですけど
名前空間の操作とモジュールの読み込みを一緒にやる感じでしたっけ?
自分が理解してる範囲では、モジュールの読み込みをする場合は、
* cl:load - 単にファイルを読んで評価するだけ
* cl:require - provideと組み合わせた古いスタイルのモジュールを読み込む
* asdf:load-system - ASDFに対応したライブラリを読み込む
* ql:quickload - Quicklispに収録されたASDF対応ライブラリを読み込む
を使いますが、Common Lispでは今時のライブラリはほぼASDFに対応しているので、
主にasdf:load-systemを使う感じでしょうか。Quicklispに収録されたライブラリを使ったり、
ローカルなASDFなライブラリでもQuicklispで管理する場合はql:quickloadを使います。
自分でライブラリを作る場合にどの仕組みに対応したものを作れば良いか、という話なら、
目的によって応相談だと思います。個人的には、自分用でもライブラリならASDFに対応させます。
手動でコンパイルしたり依存関係の面倒をみるのは面倒ですから。
名前空間については、モジュールの読み込みとは別の仕組みで管理します。
パッケージとシンボルって呼ばれるものの組み合わせですね。
名前空間全体を取り込む場合はcl:use-package、一部を取り込む場合はcl:importを使います。
そういうパッケージを作る場合は、cl:defpackageの中で:useや:import-fromを使う場合が多いです。
名前空間に関しては、プリフィックスを省略せずに書くスタイルの人や、
気にせずどんどんuse-packageしていくスタイルの人など十人十色な感じです。
詳しくは、
http://weitz.de/packages.html 辺りを読むと良いんじゃないでしょうか。
faviconがZappaだw
>>617 ,618
なるほど。ありがとうございました。
イメージがつかめてきた。
clackって使われてる? 将来性あるのかな?
cklack とかなんか恩恵あるの? 基本的に組み込み物が多いんで、 lisp でHTML 吐き出す parrenscript で javascrip 作る あとは, XMLHttpRequestだけで処理が普通なんだけど...
clackは作者のブログがうざいのが何より使いたくない理由。
そういうのはまあ誰しもあるから、それはそれで良いんじゃね? Oracleうざいから、GPLうざいから、って感じの似たような話は割とあったりするしな。
sbclをデーモン化したいので調べてみた screen、detachtty、save-lisp-and-die、sb-daemonとかあったけど ぶっちゃけおすすめはどれ?
初歩的な事ですみません lispbuilder+win+sbclでguiアプリをつくってるんですけど、 exeにして起動するとプロンプト?が出るのですが、 これを非表示にしたいですのですがどうすればよいでしょうか?
皆さんlispで普段何するプログラムを書いてるんですか?(仕事以外で)
確かに気になる 他の言語じゃなくてあえてcommon lispを選ぶ理由も。
仕事で使ってる人なんているんですか?
>>636 使っている側から言わせて貰うが、どうして使わないと決めつけられるんだ?
何書いても読まない人の発作 相手にすんな
少尉さんのほうが指揮上手いよね?
ちょっと前まで構文木を直接入力するようなキチガイ沙汰だとおもって大嫌いだったのに、今だとC++の方がキチガイ沙汰にみえる orz paredit-modeすげー
>>641 何を云ってるんだ?
C に輪をかけたあの変態構文に C++11 の変態構文まで加わってるんだ,
キチガイ沙汰じゃないほうがおかしいだろ?
pareditいいね 知らなかった 3q
>>633 > 皆さんlispで普段何するプログラムを書いてるんですか?(仕事以外で)
Podcastをwgetで落とすshスクリプトの方をイメージしちゃったのでLinux + emacsで書いちゃった。
自分のSBCLのボキャブラリーが少ないし、使える時間を割いてその数時間を費やして
ボキャブラリーを補完できずに、スクリプトが完成しない率が多い。
wgetに類する関数を覚えなくても、CL上でwgetコマンドを使えれば満足するんだけどね。
後日、wgetに類する関数を覚えて、修正版をできれば良いわけだし。
ちょっとしたスクリプトもCLで書くようにしないと覚えないかな。
非プログラマなんだけど、実用言語のGaucheに浮気しない方が良いよね?
ドキュメントとかが使いやすいGaucheだったら書けそうな気がするんだけど。
それは暗に肛門lispをディスってるんですか?
646 :
644 :2012/11/14(水) 21:22:10.31
>>645 > それは暗に肛門lispをディスってるんですか?
黄門Lisp?
アナルLisp?
ディスっていないよ。
Podcastスクリプトの機能拡張で数字→N進数、N進数→数字変換器等を作りたい
んだけど、それ関連でshスクリプトを書くために調べるのが馬鹿らしくなって
きた。調べれば具現化できるんだろうけど、shだとスマートじゃないし、あと
あとCLで使いまわしたい機能・知識なんだよね。
私が始めて書いたCommon Lispのプログラムは S式をGraphVizのソースに変換するトランスレータと 出力のグラフ上を飛び回る強盗エイリアンを探しだし射殺するゲームでした それはS式と高階関数の強力さを実感させてくれる素晴らしいものでした そんな私も今ではどうぶつの森に夢中 なぜなら彼もまた特別な存在だからです
Common Lispということか。
>>646 parse-integer、format、digit-char-p、digit-char
>>649 > parse-integer、format、digit-char-p、digit-char
thx.
CL-USER> (parse-integer "AA" :radix 36)
370
2
CL-USER> (parse-integer "aA" :radix 37)
; Evaluation aborted on #<TYPE-ERROR expected-type: (INTEGER 2 36) datum: 37>.
380
2
という結果が37進数でaAを区別して欲しいんですが、どうしたらいいんでしょうか?
今は速度を求めていないので愚直に対で対応させればいいのかな。あと記号も使って
64進数も変換できるとうれしいです。
それっぽいものを投げやりに書いてみた。0-9a-zA-Zと-と_で64進。 (defun parse-integer/64 (s &key (radix 10)) (let ((table "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-_")) (car (reduce (lambda (c r) (destructuring-bind (sum . pos) r (let ((n (position c table :end radix))) (cons (+ (* n (expt radix pos)) sum) (1+ pos))))) s :initial-value '(0 . 0) :from-end t))))
>>651 すばらしい。
こうやって書くんですね。
読解してみます。
連番のエロ画像をダウンロードするスクリプトください
>>655 つか、どお見てもうに甚のあのスレに対する誤爆だと思うんだが…
emacs + sbcl + slimeで、with-gensymsが style-warning: undefined function: WITH-GENSYMS になりす。 関数が無いのはなぜなんでしょうか?
>>658 ん?それは標準のマクロじゃないから、どっかからとってくるか何かしないと使えないよ
どんな形式のH画像もマクロでダウンロードできるようにならないとな 再帰で関連リンクも自動でたどるんだ sxpathあたりを駆使するんだ
スレ違いな話題な上に間違ってる。
663 :
デフォルトの名無しさん :2012/11/19(月) 18:58:57.84
CL-USER> (loop for i in '(1 2 3 4 "a" 5 "b") if (integerp i) collect i else collect "2ch") (1 2 3 4 "2ch" 5 "2ch") loopのif文はこう書くんだね。 (loop for i in '(1 2 3 4 "a" 5 "b") do (if (integerp i) collect i collect "2ch") と書けずに、 (loop for i in '(1 2 3 4 "a" 5 "b") collect (if (integerp i) i "2ch")) と書けるのか。 CL-USER> (loop for i in '(1 2 3 4 "a" 5 "b") if (integerp i) collect i) (1 2 3 4 5) と書こうとすると、 (loop for i in '(1 2 3 4 "a" 5 "b") collect (if (integerp i) i)) これだとnilが混じる。 あと(loop for i to 9 from 2 collect i)というのはありなんだね。loopのifもそうだけど S式の頭で考えると頭に入ってこなかった。 loopが茶帯ぐらいになってきたかも。
loopマクロで (loop :for i :in '(1 2 3 4 5) :if (evenp i) :collect i) みたいにloop内の構文シンボルをキーワードシンボルで書くのって少数派? エディタのハイライトで色がつくから、見やすくていいんだけど。 あと、ここでキーワードシンボル使うと、どっか他の部分でデメリットとかある?
>>665 ちょっと前にも同じような質問があったと思うけど。
自分で使ってる名前空間でインターンされるのが嫌な場合は
キーワードで書けば良いんじゃないの。デメリットは特にないと思う。
common lispのテキストの類いでは :forじゃなくてfor表記の方が多いきがする インターンの現象をデメリットだと執筆者は思っていないのかも
リストの再帰探索をやってくれるような標準関数はありますか?
REPLからCライブラリを呼び出してみたいとおもっています。
そこでclikiのFFIのページを見てみました。
http://www.cliki.net/FFI 色々あるようなのですが、今から始めるならどれがよいでしょうか。
CLの処理系としてはFreeBSD上で
Allegro CL Free Express Edition8.2を主に使っています。
SBCLを使う事もあります。
671 :
669 :2012/12/03(月) 18:30:09.84
ありがとうございます SWINGなんてのがあるんですね 早速勉強してみます
Nつけちゃ駄目だ
Shibuya.lispがまた動き出した感じ? また一部のマニアだけで盛り上がるトークセッションをやるのかね。
>>673 Lisp で大衆向けにしたら需要ないだろ…
ニッチだから盛り上がるんだよ。
ぶっちゃけどうでもいい。参加する人に任せとけば良いんだよ。
>>673 > また一部のマニアだけで盛り上がるトークセッションをやるのかね。
自分のトークセッション観と称して要望メールを出せばいいんじゃないの。
トークセッション観がまだ未熟なら随時出せば良い。
内容が薄けりゃ薄いで文句を言うんだよこういう手合いは。 ぶっちゃけいちゃもんを付けたいだけ。
一部のマニアだけだとしても、盛り上がってるんならそれでいいだろw
Lisperはこの世のゴミ
誤爆したスマン
いいってことよ
683 :
デフォルトの名無しさん :2012/12/07(金) 23:01:55.51
そのゴミを集めるのもLispです
ゴミ集めがうまいcommon lisp
集めるだけじゃなく解放してやれよ
昔の著名な小説家が死んだ後にノート公開みたいにプログラマのメモ帳・ (プライベート)スクリプトを公開とか、やらないかな。 その小説家は公開されると分かっていて、仕事しているだろうし、死後に 取捨選択・管理する役目を受ける人も決まっていそうだ。 ファンの要望に応えて、第二弾の公開。以下、ループ。 死後に評価される人もいるのかな。
>>686 まとめる人に相当の技量が必要になるから、
難しいんじゃないかな。
>>688 > まとめる人に相当の技量が必要になるから、
> 難しいんじゃないかな。
引き受ける人が任せた人が死ぬ前に死後に読み込む環境(*0)を整えるために
打ち合わせすることは可能だろうし、引き受けた人は高度なプログラムを
書ける必要はないけど、プログラムは読めないとダメだね。
大雑把に取捨選択して、高度なプログラムを評価できる専門家にそれを評価
してもらえばいい。そして引き受けた人が法的な権利関係もある程度(*1)把握
できていればいい。
あと全部精読する必要はないけど、流し読みはしないとダメなんだろうな。
量がいっぱいあるなら、何弾回かに分けるつもりでとりあえず当たりをつけて
手づかみした部分だけを解析して公開して、反響の度合いで解析量を増やす
感じになるのかな。
*0 独自の略語とか、暗号とか、ルールとか。
*1 どこに問い合わせればいいとか、どこに頼めば法的部分をクリアするとかを
知っている程度。
github 以降で自分が公開してないスクリプトって、小物すぎたり著作権や特許に引っかかってたり 自分専用でUIが無茶だったり公序良俗によろしくないとかで何かしら問題あるんからなんだが、 小説家のノートの場合そういうのどう解決してるんだろう
;; チラシの裏 90.txt 91.txt 80.txt 70.txt 60.txt 68.txtの順で出力したいんだが、bashで $cat [9876543210]*.txtってできないんだね。 bashを掘りたくないからSBCLで書こうかな。 $./hoge.lisp cat [z-0]*.txtとか、$./hoge.lisp cat [987z-a6Y-B0]*.txtとか、 できると便利じゃない? catは一例で$./hoge.lisp foo [9876543210]*.txtで動くようにしたい。 あと$rsync -h --progress *.iso /Another_HDD/で abc.iso 411.50M 9% 196.30MB/s 0:00:19 と表示されるんだけど、rsyncは騒がしいから簡易計測でいいから $./mv.lisp -h --progress *.iso /Another_HDD/が欲しい。 転送速度があまり変わらなそうだけど、多重mvできると便利。
>>691 > $./hoge.lisp cat [z-0]*.txtとか、$./hoge.lisp cat [987z-a6Y-B0]*.txtとか、
> できると便利じゃない?
bash, csh, zsh あたりだと, <command> {9,8,7,6,5,4,3,2,1,0}*.txt じゃダメ?
マッチしない奴のエラーが気になるのなら,
<command> {9,8,7,6,5,4,3,2,1,0}*.txt 2> /dev/null
とかじゃダメ?
上の例だと[!987z-a6Y-B0]とかで文字クラス反転された場合の解釈は?
Unix 系だと, どんな言語で書く(shell 関数の場合でも)としても, shell が
マッチしたファイル名をアルファベティカルにソートして引数リストとしてわたす
ので [987z-a6Y-B0]*.txt はクオートしてやらないとうまく動かない
ってな, 問題もある…
Windows はゲームしかやらないのでどうなってるかしらない.
unix風なら、sort がやるべきかもしれない。 外部から任意のソート順序を与えられる sort を sbcl で作る、というのなら結構嬉しいかも。 集合の反転は考えずに、[]内に出現しなかった文字は後ろに通常どおり辞書順にくっつけばいいよね。 リストにある文字列の集合を並び替えられると、コマンドラインツールとしても通常の関数としても使えるから便利そう。 sort用DSLからpredicateの作成。 既にありそうな気がするけど、どうなんだろ? rsync の例は xargs でなんとかなる問題なのかな?
cat $(for i in [0-9][0-9].txt; do echo "$i"; done | sort -nr) rsync --quiet
Linux標準コマンドの組み合わせで解決しそうだけど、リスト化してこう
してああしてこうすれば具現化できそうだよなあって思考していた方が
CLのレベルが上がるよね。
複数のLinuxが入っていて、1つのOSが瀕死の時にCLで作業を一部自動化
できると便利だろうなあと思って。
多重mv(実際は多重cp)を簡易計測して測ってみたけど、1.45倍ぐらい
速くなった。意外にも最高速度に張り付いている感じ。小さいファイルと
大きいファイルが混在の時にどのくらいの速度が出るのか、楽しみ。
CPUガラ空きだからmd5sumチェック機能もつけられるかも。まんまrsync
だけど、速度が出ないんだよなあ。
>>692 素晴らしい。こんなのあるんだね。
<command> [0123456789]*.txtより<command> {0,1,2,3,4,5,6,7,8,9}*.txtを
使い方として広めた方が使い勝手があるね。
> 上の例だと[!987z-a6Y-B0]とかで文字クラス反転された場合の解釈は?
反転ってどういう意味?
>>694 こう書けるんだね。
>>694 それだと, 91,90,80,70,68,60 にならないか?
>>695 > > 上の例だと[!987z-a6Y-B0]とかで文字クラス反転された場合の解釈は?
> 反転ってどういう意味?
[987z-a6Y-B0]に含まれない文字の集合
[] 内の先頭が ! または ^ の場合, 続く文字クラスに含まれない文字クラスを示す
実践Common Lispを25ページまで読みました
そうか。
>
>>695 ごめん。投稿前に反転と予想して確認したんだけど、結果を見間違っていた
みたいだ。
>>651 のように記号も含めて独自の文字テーブルを作って、その文字の集合を
反転ということなのかな。
独自テーブルは(loop :for i :to 130 :collect (code-char i))で出てくる
0-9A-Za-z -~で、記号はコードの昇順にする。
やる気はないけど、簡単にテーブルを作れるならひらがな・カタカナ・漢字って
やっても良いかな。grepの[:alnum:]みたいに[:hiragana:], [:katakana:],
[:kanji:]って表記はgrep拡張で便利なのかな?
実際に必要性ないとポイントが見えないし、作る気しないね。キッチリ作る人は
偉い。
sort 的なもの作るとしても, 空白, クオート, メタキャラクターを含んだ
ファイル名の扱いが問題. 結果は文字列にしかならないから,
うまくクオートした形で結果を表示しないと色々と問題が…
# Unix 的にはファイル名として禁止されている文字は '/' と '\0' だけだ
>>699 > grepの[:alnum:]みたいに
真面目にやるなら, posix 的には grep の [:xxxx:] は必須
grep の [...] の定義と同じもの + '!' でも反転が求められている
(歴史的な事情, grep の '^' のほうが後から?)
> [:hiragana:], [:katakana:],[:kanji:]
unnicode 的にはもっと細かい区分を考えないとまずそう
あれ、あんまりいいアイディアじゃなかったかな…。 (元質問者とは違うんだけどせっかく思いついたので) もう一度だけ説明させてください。 例えば '[g-d]' という指定の場合 (g f e d 0x00 0x01 ... a b c h i j k ...) という、 g-d の部分だけを通常のASCIIテーブルから抜き出して (より優先度の高い) 先頭の方に移動したリストを考えて、 さらにこれをつなげた表現 '[g-d][g-e]' がリストを (gg gf ge fg ff fe ... aa ab) の順に並べるような 文字列同士の大小を比較する predicate を生成する、と約束すると sort関数 に渡すだけで リスト内の文字列の昇順降順を自在に操ることができそうなんだけど、どうかな?
あればあったで楽できる気はするけど、そういうカスタマイズされたソートが必要なケース自体が、 多くの人にとってあまりない気がする。マッチングとかと違って。
比較関数生成するってだけの話でしょ。
Unicode前提だと \p{InHiragana} が使える処理系もあるんじゃないかな
>>702 むしろそういうソート条件のGenericな表記方法ってのを発明するのが楽しそう
あんまり自分は必要ないけど(特殊なときは泣きながら並べるw)
順序のフォーマルな表記法って面白そうなテーマだね。
比較は込み入った条件だと煩雑になるからな。
そういやsregexやperl 6 rulesでどうよ?
>>701 改めての文字列の昇順降順に興味ないけど、そんなに難しいことなの?
おおむね昇順・降順ができて、動けばいいや。難しいならあきらめるし。
>>705 具体的に泣きながら並べる例ってどういうのですか?
例えば 1 5 10 を辞書順に並べると 1 10 5 だけど、 Windows のエクスプローラだと 1 5 10 になってくれるよね。 漢数字も理解して欲しいもんだ。
>>701 いいアイデアだと思うんだけど, 日頃使ってるものと似てるようで別の制約
付けられると結構ストレスになると思うんだ
<なんとか>sort [<ソート順引数>...] [<シェルの展開したパスリスト>]
だとかなら, まだ許せるんだけど, そのあたりをどう設計するかだと思う
# おいらの特有の現象かも知れないけど…
# CL-ANNOT みたく, ここだけ lisp 書式じゃなくななるのは体が拒否する
# もう少し, 今までの表記法と親和性のある方法だってあっただろうに
どうせ作るなら, Unix 分化とかけ離れない表づらをしていて欲しい
そうしたほうが, おそらくたくさんの人に使ってもらえるだろうとも思う
たとえば, Unix の find って, 完全に他のコマンドとは別の文法持ってるよね?
でも, なんとか他のコマンドとの整合性を取ろうとしてるじゃん
# dd は, 完全に別文化から来たものだから仕方ないんだけど…
実践Common Lispを37ページまで読みました whereのマクロ化による効能に早速ビリビリきました
>>710 XPだと1 10 5だったような。
下品なのかもしれないけど、(裏でやっていいなら裏で)100001 100005 100010
とやるのはダメなの?
コンピュータ上での数字文字の理解ってこういうもんだと思っていたんだけど。
"1 ", "10 ", "5 "とコンピュータが理解しているのは逆にありがたいんだが。
場合分けとソートを一緒にやるようなコマンドがあったら便利なんじゃないか bucket-sort.lisp --bucket bucket-fn-1 sortfn-1 --bucket bucket-fn-2 sort-fn-2 ... target ... みたいな感じで、場合分け関数と、それを満たした要素の集合をソートするための関数の対を引数にしてやる。 で、関数の名前はLISPの任意の関数を指定できて、--load pred.lispとかでさらに追加できる、とか。
最低でも年一のニーズがないと存在する忘れそうなんだけど。 そんなに使うもの?
実践Common Lispを67ページまで読みました。 &optや&restや変数スコープなどについて。 端的な具体例を示すのが上手だなと思います。 (defparameter *fn* (let ((count 0)) (list #'(lambda () (incf count)) #'(lambda () (decf count)) #'(lambda () count))))
実践Common Lispを89ページまで読みました。 Lispプログラマは自分のコードの共通のパターンを見つけたら、自分自信でそのパターンをソースレベルで抽象化出来る。 Javaプログラマは、同じようにパターンを発見しても、その抽象化を言語に追加する価値があるとSunを納得させる必要がある。 うまく納得させることができたら、次はSunはJSRを発行してすべてを見当しつくすための「専門家集団」を産業界から広く収拾 しなければならない。この過程は、Sunによると平均で18ヶ月かかる。その後でコンパイラ製作者は新機能をサポートするように コンパイラをアップグレードさせる。そして、Javaプログラマ好みのコンパイラが新しいバージョンのJavaをサポートしたとしても、 まだ新しい機能を使うことはできない。古いバージョンのJavaとの間でソースレベルの互換性を壊す許可が出るまでは。 Common Lispプログラマが5分以内に解決できるような苛立ちが、長年に渡ってJavaプログラマを苦しめることになる。 面白いww
18ヶ月で新仕様が専門家のレビューを受けて決定するというのは、 LISPに比べるとかなり早いような気がするがどうか
>>717 日記代わりに使うなら誤変換とか誤用とかに気をつけながら書けば
少なくとも自分のためにはなるぞ
ニコニコ学会第3回
5th session「研究してみたマッドネス」
座長:デカこな(コメントアート研究会)、永井美智子(株式会社ドワンゴ)
審査員:栗原一貴(産業技術総合研究所)、塚田浩二(科学技術振興機構 さきがけ)
ttp://live.nicovideo.jp/watch/lv118857295 超IMEが大賞だって
超IMEとはチャット(2ch向けっぽい)で書く・ググる・流通しているベタ画像等を
表現力豊かにできるようにしてすべてをIMEですべてやってしまおうという
システムなんだとさ。
Emacsを知っている立場からするとコメントの反応がすごく良くて逆に驚いた。
Emacsで自明なことを再パッケージすることで日本向けならかなり需要はある
かもしれない。
>>720 どこぞかにあるかも知れない, emacs スレとか elisp スレでやってくれ
まぁ, 誤爆だとは思うが…
実践Common Lispを100ページまで読みました。 マクロに慣れ親しむためdo-primesというマクロを作ってみて、その漏れ(多重評価やgensym関連)を 修正する過程は、On Lispにおけるforのその過程を踏襲しているようだ。 once-onlyマクロの定義を一目見て笑いました。 次回読み解こうと思います。
アプリのユーザーインターフェースってみなさんはどうしてるんですか?
チョロいのならCLI,もちょっとチョロいのならTk がっつりはOpenGLで自前 Franzが安いならなーとおもわんでもない
>>724 組み込みでもない限り, ブラウザに丸投げ何じゃないか, 普通は?
LisperにとってUIって何? (a) Lispを1,000時間触ったことがある人向け。 (c) Lispを100時間触ったことがある人向け。 (e) Linuxを100時間触ったことがある人向け。 (g) いわゆるGUIを1,000時間触ったことがある人向け。 (i) いわゆるGUIを100時間触ったことがある人向け。 (k) スマホを100時間触ったことがある人向け。 (n) 19世紀初頭に生まれて、年齢は20歳の人向け。 (a)同士だったら、マクロとか、関数とか、コードも含めて超狭義のUIなんだ よね? 世間一般で存在が認知されている日常業務用道具で(a)のほとんどが挫折する 良い例が思い浮かばない。なんか違う気がするけど、カンナとかかな。今だっ たら電動サンダーでやった方が割と満足のいく仕上がりになる。カンナを 携帯性・汎用性を弱めて適用範囲をかなり狭めて2人ぐらいで協力して使って、 電動サンダー程度の仕上がりのカンナって作れそうな気がするんだけどな。 (n)はデジタルウォッチやウォシュレットを説明書ありで日常に忙殺されながら ちゃんと使えるか、疑問だ。デジタルウォッチは意外と速く使えるようになるの かな。日時秒数±1秒の精度の設定が自身ができてを使えると評価する。
>>729 > (a)同士だったら、マクロとか、関数とか、コードも含めて超狭義のUIなんだ
> よね?
それって、普通、APIとか言わない?
ユーザーインターフェースって言うのは、
「プログラム内部の問題ではなく、動作している何らかの物[1]と人間の
インタラクション部分のことをさす」
言葉だと思っているんだが?
[1] 何らかの物はソフトであってもハードであっても構わない
> (n)はデジタルウォッチやウォシュレットを説明書ありで日常に忙殺されながら
> ちゃんと使えるか、疑問だ。
おそらくウォシュレットの方が早く使えるようになる。
デジタルウォッチは個人的には今でも馴染めない。
針のある時計ってのは一種の計算尺。
つか、いちいち引き算するのはめんどくさい。
デジタル時計ってのは、後何分で何時って感覚が希薄になるような気がする
>>730 「人間」が関数やら何やらを呼出すことだってあるんじゃね?
プログラムが呼出すように設計された関数 (マクロ) 群は API で、
人間が直接呼出すことを想定したら (それがただの関数やマクロでも) UI だと思う。
つまり、ユーザが Liper かどうかよりもそのコードが想定する用途によってどこが UI といえるかが変わってくると思う。
すみません、クリスマスで実践Common Lispを読みませんでした。
>>731 > 「人間」が関数やら何やらを呼出すことだってあるんじゃね?
呼び出す関数やマクロの仕様はどうでもよくて, 呼び出し方法が UI なんじゃね?
shell の history 機能とか readline とか emacs の minibuffer とか
dired とか vi 系のキー割り当てとか ex コマンド呼び出しの方法とか...
機能的に異なっているものを, どれだけ統一がとれた方法で user に提示てきるか?
が UI の良し悪しを決定するし, 設計者のセンスが問われる部分なわけでしょ?
呼び出す関数やマクロの仕様が上で書いたことを左右する部分は大きいと思うけど
個々の関数やマクロの仕様は UI とは呼ばないんじゃね?
竹内郁雄のLISP入門の本、最後の35ページを使って書いてある付録のCLの 全景スケッチ、使えるじゃん。 前書き(嫌後書き)と称して書かれていることは買って読ませる気ゼロだし、 付録について触れられていないし、追加してのの17章はやりたいことが 見えてこないし、読ませたいターゲット層が見えてこないんだよな。 付録はゴーストライターが書いたのかな。加筆された注釈とも微妙に雰囲気が 違うんだよな。注釈でもリンクがされていないようだし。 LISP再入門 or 基礎固めと称して付録を0章にして基礎の本質を伝えることを 主眼に置いた注釈にして、注釈の大幅加筆分を入れると17章は要らないことに なる。他人が書いた物に注釈をつけているわけではないんだから、思いっきり 書けると思うんだけどねー。 一応、原書は古い時代の物ではあるが入門書の体をなしているんだから タイトルは入門者向けと称していいし、日本語のLISP本が枯渇しているん だからLisperは前書きぐらい読むでしょ。
735 :
デフォルトの名無しさん :2012/12/26(水) 09:13:50.37
対話によるCommon Lisp入門て本 少し高いけどわかりやすいね。
>>731 emacs+SLIME環境はGUIですって事だわなw
自分の開発環境だとまさにそんな感じだし。
それでも違和感あるなぁ
allegro common lispってなんで値段書いてないの?>>日本語サイト
あれのUIライブラリ環境すごいと思うけどご相談以外に購入方法無いとか売る気ないとしか
>>736 >allegro common lispってなんで値段書いてないの?>>日本語サイト
法人向けパッケージとかサービス販売では多いよ。
箱売り以外にも、支援見積りなどもある。
>>737 メールで応談ってところにメールして確認すればよいのかな?
売り物のruntimeライセンスとかすごく細かいので、手出すのがおっくうなんだよね。
年開けたら相談メールだしてみる事にします。
>>728 それはhunchentootなどを使って、ということですか?
>>727 Tkとかいくつか利用できるGUIがあるようですけど
どれもメンテされていないのが残念なんですよね。。
>>739 Tk は今年に入ってからもリリースされてるし、積極的にメンテナンスされてる。
Common Lisp から Tk を使うためのライブラリ (バインディング) がってことかな?
Tk はごく簡単な API で操作できるのであらためてライブラリに頼るほどでもないと思うよ。
>>740 そうなんですか!
食わず嫌いでした。まずは安心して試してみます。
教えてくださりありがとうございました。
Tkを知っている前提でCFFIで操作とかそういうのは「簡単」ではないと思うな……! と言っても仕方ないが
Tcl/Tk でいいやん。
Tk勧めるなら普通にLtkで良いと思うんだけど、何か問題あったっけ? あと、CommonQtとかgtk-cffi辺りはそんなに放置されてないと思う。 Windowsの話ならDoorsとかは確かに放置されてるかもしれない。 ただまあ、今時旧来のGUIツールキット頑張ってメンテしても報われんよね。 バックエンドだけCLで書いてブラウザにUIは任せた方が遙かに楽。
>>739 > それはhunchentootなどを使って、ということですか?
何でもいいんじゃね?
CGI系だと起動までの時間がもったいないので、それなりの細工はするけど
fast CGI 系だと, 素から作っても半日かかんないだろ?
747 :
746 :2012/12/27(木) 19:48:24.62
>>739 > fast CGI 系だと, 素から作っても半日かかんないだろ?
言っとくけど, 内部と fast CGI の糊の部分だけの話だ
>>744 > バックエンドだけCLで書いてブラウザにUIは任せた方が遙かに楽。
バックエンドCLじゃなくていいので、ブラウザでUIってどういうのを指して
いますか?
3枚ぐらい画像のリンクを頂けないでしょうか。
あともっと高度な物を望むならjavascriptを使って、Gmail、Google+みたいなヤツですか?
javascriptを使ってもあの程度だとUIの機能として満たされないことが多く
ないですか?
GUIに行くならGUIの良さがありますよね。激安サーバにCLが乗っていないと
いうのもありますし、(自宅)Web鯖を立ててセキュリティまでやるのもローカル
のみのサービスなら良いですが公開となると格段とレベルが上がりませんか?
使う人の幅を狭めますが、ブラウザでUIよりはCUIの方がもっと表現力が豊か
だし、サーバアプリも書いて運用した方がネットセキュリティの手間が少ないと
見積もっているんですが。
あとあとそのアプリを使うもっとも推奨のWebブラウザは何なんですか?
Common Lisp がバックエンドに向いてるっていうのは俺もそう思うけどさ、 折角 CL スレなんだから CL 的な GUI ライブラリの話とか出てこないもんかな? ただのバインディングじゃなくて CL によく馴染むような。
ncursesも良さそう
>>744 で挙げたじゃないですか、やだー!
そういうの好きな人はMcCLIM辺りに走れば良いんじゃないか。
関数的などうこうとかそういうのなら、今はHaskell方面がメインストリームだと思う。
手の混んだものでなければLtkが手軽で良かった気がする。 Webブラウザエンジン載せたアプリ作りたいとか、リッチなGUIがいいとかなら CommonQt使うのもいいと思うよ。 ただ、CommonQtだと、UIエディタ利用できないので結局素のC++/Qt使った方が 楽だったり。 あとは、LispWorksやAllegroCLがGUIライブラリ提供してるけど、商用だしね。
>>753 LispWorksは多バイト文字がアレなので駄目なんだよね。
Allegroは最強っぽいけどマジで値段がしゃれにならん。
ってなわけでごりごりするんだけど、やっぱりAllegroは憧憬のまなざしを送らざるを得ない。
せめてランタイムが安ければいいのに orz
756 :
デフォルトの名無しさん :2012/12/28(金) 06:53:08.72
実用 Common Lispと実践Common Lisp どちらを先に読んだらいいですか?
実践Common Lisp読んでるけどこれ初心者向けじゃないね。 早々にマクロ出てくるけどあれだけの解説でバッククォートと,@の感覚に 初心者は慣れ親しめないと思う。自分はOn Lispでさんざんやった後に 読んだからスラスラ読めて楽しめてるけど。実用は知らない。
『実用』の方は、最低限Common Lispの文法説明してから、 AIの分野でのプログラムをどんどんやってくみたいだ。まだ全部読んでないけど。 実践は確かに初めのほうでマクロが出てくるが、それはさわりで、 さわり部分が終わるとCommon Lispの文法を解説していく内容になっている。 Lispの入門書としてなら実践、Lispでできることが知りたいなら実用、じゃないか?
>>758 > Lispの入門書としてなら実践、Lispでできることが知りたいなら実用、じゃないか?
実践のasdf(今は2だっけ?)で挫折したんだけど。asdf2は使えるの?
asdfの所を省いて、パッケージのインストール・管理はquickloadがいいよ。
中の人に死ぬほど感謝している。slimeの人も。
>>757 実践のマクロの解説は短いよね。LISPはマクロ、マクロ言われているから気合い入れて
学ぼうとするんだけど、なんか分からないことが多すぎる。ドラクエの後半に使えるベギ
ラゴンだと思って、諦めている。
さて、lambda, mapcar, applyの基本的な使い方を記述できるのは、個々何の呪文なんでしょ?
覚えた呪文を組み合わせて、ちょっと踏み込んだ使い方できると個々は何の呪文?
サンプルコードありでこの程度はメラとか、関数の使い方の深さで呪文が対応している一覧表が
あるといいなあ。使い方のサンプルコードの作意を読み取るのは気づきもあるし、おもしろいん
じゃないかな。デカいコードを読んで気づくのも大事なんでしょうが。コメントを隠して作意を
コードだけで表現するのもありだけど、コメントでまんま作意を書いてもいいかも。どっちが
おもしろくなるのかは判断がつかぬ。注意としてコメントに重きを置き過ぎてコードの作意の
表現を怠るのは良くない。最大限努力する事。
あと呪文でレベルの度合いを示すのは親しみやすいけど、レベルの度合いを数値で表して複数人の
サンプルをまとめる事になった時にまとめやすいね。だから、数値の方に重きを置いた方が
いい。
;; 呪文:イオ、レベル6 作意:loop+mapcarの組み合わせ。目的はリスト内の全検索。
;; map系関数でこういうものがあるのかと思ったけどなかった。暫定関数
;; (mapcarall= list1 list2)として使っております。まだ熟成していないので作意がバラ
;; バラなのかな。
(loop :for i :to 9 :collect
(mapcar (lambda (x) (= i x))
(reverse (loop :for i :to 9 :collect i))))
試しに書いてみました。話の中で説明したコードの作意について説明できていないように感じる。
意外に難しかった。サンプルを書くのにかなりの実力がいるのかもしれません。
オイラも実践CL読んでます。 まったくのCL入門者にはちょっと手強いですがw 最初のCDのDBを真似てお小遣い帳作ってまーす! 最終的にはパーソナル会計アプリ作るんだ^^
分からないってのは自分が脳内で発する雑音が多すぎるからじゃね?
実践の訳者序文によると来年はLispコミュニティ55周年みたいだね。
CLOSってよく使いますか?
764 :
デフォルトの名無しさん :2012/12/28(金) 21:35:40.52
実践と実用どちらが難しいですか?
COMMON LISP 第2版 はみんさん持ってんですか?
実践も実用も、lisper に認められたいい本だよ。だからどっちも読んで後悔はしないよ。
767 :
デフォルトの名無しさん :2012/12/29(土) 00:38:16.86
↑どちらから先に読んでもいいですか?
話がLOOP
>>759 多重ループの抽象化は流石に言語仕様に入れんと思うよー。
全検索ってのがどんなものかは残念ながら良く分からんのですが、
mapcarを使って同じ処理を書くなら、内側のループは別の関数にして、
(defun =list (x l) (mapcar (lambda (y) (= x y)) l))
(defun mapcar/=list (l1 l2) (mapcar (lambda (x) (=list x l2)) l1))
(let ((0-9 (loop for n to 9 collect n))) (mapcar/=list 0-9 (reverse 0-9)))
こんなんするのが普通だと思いますよー。
>>770 違いがよくわかりません。関数にするか、lambdaにするのかの違いですよね。
let, let*は使えますが、突っ込んだ話まではわからないので省略しました。
slime環境前提の話とします。自分の稚拙なコードの正当性を主張するなら
(loop :for x :in list1 :collect x)とも書き換えられるし、物凄く細々と
した関数を自分で作ってしまうと管理もそうですし、忘れて使わなそう
なんでlambdaで書いた方が扱いやすいし使いやすいかな。もちろん、
関数化は狙っているし、関数化するなら割と汎用的にしないというのが
あって、関数化するのにブレーキがかかってしまいます。数ヶ月後に自分の
コードを見返したときに自作関数を多用した方が良いのか、lambdaで書いた
方が良いのかが整理されると思っています。こういう物を返したいとその
具現化に向けて最短で書くのはlambdaを使った方が今は個人的に合って
いる気がします。具現化の後は書き方の整理したり、関数化の是非を考えた
りする作業をしています。
何個も公開パッケージを書いた人は一発で整理されて書けるんでしょうが、
初めての時は自分の癖が入っているコードで具現化して、その後コードを
整理していると想像しています。一発の人も公開まではしないそのパッ
ケージの開発用(開発環境ではなくそのパッケージ寄り)のコードもある程度
存在するのかなと。ある機能をつけようと思っていたけど、今回は断念した
未実装の書きかけのコードとかもあるでしょうし。
>>771 考え方の違いっすよ。ひとかたまりの処理と考えると、そういうmap系関数がないと思うかもしれんですが、
処理を分解してあげれば、mapの考え方に素直にはまるよ、っつー。
関数なんて気軽に作って気軽に捨てりゃー良いんすよー。いくらでも作り直せるし。
世の中、特定の関数の中でしか使われない補助関数とかに溢れてるわけでー。
必要以上にlambdaでベタ書きしてると、デバッグでテストしづらくて死んだりとかー。
……書いてて思ったけど、我ながらこの語調マジうざいな。
>>771 の中の人は、書き込む前に、もっと発言を推敲した方が良いと私は思いますよ。
SLIMEなんかは引き合いに出す必要のない話の内容ですし、議論なのか質問なのか、
話題をふってるのか独り言なのか、冗長な部分が多くて良く分からないことになってます。
同意。スパゲッティを見てるみたい。
>>771 おれが, テストコードでよくやるやつだ
関数定義するのが面倒だからあちこちに labmda を突っ込む
でも, 少しでかくなると似たような lambda がでてきて…
以下繰り返し…
775 :
デフォルトの名無しさん :2012/12/30(日) 07:18:54.56
本の話どうなったんですか?
776 :
デフォルトの名無しさん :2013/01/02(水) 00:48:24.85
この前LisperにLisp最高って洗脳されて触り始めたが GUIをメインにやって行きたいから調べたら cl-openGLとGTK以外に良い環境はありますか
横だけどドットネットまであんだね 知らなかった
abclでswingとか言い出すとどこがCLなんじゃコラ!ってなるけど、案外使えるので困る。
781 :
デフォルトの名無しさん :2013/01/03(木) 14:27:18.28
common-lispはじめてみました。 マクロの使い道がまだわかんねえ。。。
個人が趣味だけでやってるものだと、興味を失ったり忙しくなったりして、 なかなか安定して保守していくのは難しいよね。 業務で使ってフィードバックしてくれる企業や個人と協力できれば良いんだけど、 ことGUIの分野だとCommon Lispではあまりやらないだろうし。
783 :
デフォルトの名無しさん :2013/01/03(木) 15:33:26.60
ファイルの内容を1行ずつではなく、1つの文字列にまとめる方法はありますか? Rubyでいう、open(path).readのことです。
>>781 いらっしゃい。
with-open-fileとかの「with-x」系のマクロとか、入門に良いんじゃないかな。
利点が分かりやすい例だと思う。
>>783 (with-open-file (s "abc.txt")
(let ((buf (make-string (file-length s))))
(read-sequence buf s)
buf))
大きなファイルの場合、32ビット環境だと文字列の大きさの制限に引っかかることがあるのでご注意。
most-positive-fixnumの値くらいまでは大体大丈夫。
間違えた。most-positive-fixnumじゃなくて、array-total-size-limitが正しい。
>>785-
>>786 ありがとうございます!
できた!と思ったら、日本語ファイルだと文字コード関係で怒られてます。。
#\HIRAGANA_LETTER_NA (code 12394) is not a LATIN-1 character.
>>787 (with-open-file (s "abc.txt" :direction :input :external-format :cp932)
(let ((buf (make-string (file-length s))))
(read-sequence buf s)
buf))
みたいに、with-open-fileで:external-formatを指定すればオーケー。
SBCLかCCLを使ってるなら、UTF-8なら:utf-8、Shift_JISなら:cp932、
EUC-JPなら:euc-jp辺りを指定すれば良い。CLISPはちょっと特殊だったと思う。
ついでにまとめた。
http://qiita.com/items/99a3c2537b9b34954967
>>780 簡単にできるんだけど、移植性まったく無いのでどこがCommonなんじゃーって話になるよね。
ま、FFIとか入ると結局ライブラリがプラットフォームにあるかないかで決まっちゃうのだけど。
Common LispのCommonがLisp側のみの縛りだから外部Lib使うものってどうしようもないのだろうけど。
>>788-789 ありがとうございます。ファイルオープンについては解決しました。
その文字列をGメール(cl-smtp)で送信したいのですが、
送信する場合に以下のエラーが発生するようですorz
#\HIRAGANA_LETTER_NA (code 12394) is not a LATIN-1 character.
ちなみに環境はUbuntu, sbclです。
まとめありがとうございます。あとで復習させていただきます。
>>791 CL-SMTP使ったことないけど、エラーが発生してるのってどこ?
with-smtp-mailとかなら、それにも:external-formatで指定できるようになってるみたい。
バックトレース見てエラーが起きてる場所が分かるなら教えて欲しい。
分かんないならその部分のコード見せて欲しい。
>>792 お返事ありがとうございます。
以下のコードです。external-formatを指定しているのですが。。
(defvar str (read-file "~/path/to/file.txt"))
(cl-smtp:send-email "smtp.gmail.com" "
[email protected] " "
[email protected] "
"subject" str :ssl :tls
:authentication '(:login "
[email protected] " "passwd")
:external-format :utf-8)
>>793 軽く調べた所、CL-SMTPが内部でexternal formatの情報を捨ててるみたい。
英語圏の人が作ったソフトウェアには結構ある例のあれ。
具体的にはsmtp-handshakeのconvert-connection-to-sslの中にある、
cl+ssl:make-ssl-client-streamとflexi-streams:make-flexi-streamで
それまでのflexi streamのexternal formatを引き継げば修正できるけど、
可能なら他のライブラリ使った方が良いかも。
>>794 おぉ。。。なるほど
わかりました。色々ありがとうございました
>>796 SUGEEEEEEE!自分のところでも動きました!
ありがたやありがたや
コードリーディングして吸収させていただきます。
>>784 レスありがとうございます。
初歩的な質問で恐縮ですが、そういったマクロはどのパスにあるのでしょうか?
>>798 CCLならlib/macros.lispでSBCLならcode/macros.lispで定義されてるみたい。
SLIMEを使ってるなら単語の上にカーソルを持っていって「M-.」で移動できると思う。
ちなみにCCLのはこんなん。
(defmacro with-open-file ((var filename . args) &body body &aux (stream (gensym))(done (gensym)))
"Use open to create a file stream to file named by filename. Filename is
the name of the file to be opened. Options are used as keyword arguments
to open."
`(let (,stream ,done)
(unwind-protect
(multiple-value-prog1
(let ((,var (setq ,stream (open ,filename ,@args))))
,@body)
(setq ,done t))
(when ,stream (close ,stream :abort (null ,done))))))
ちなみに、
(macroexpand '(with-open-file (s "x.txt") (read-line s)))
を評価すると、どう変換されるのか分かる。SLIMEならC-cM-mでも。
他の言語と感覚が違うので教えてください。 データベースに格納したデータを1つずつ取り出して表示するプログラムですが、 これでどうしてarrayがNILなのか理解できません。。 (ql:quickload :dbi) (dbi:with-connection (conn :mysql :database-name "test") (let* ((query (dbi:prepare conn "SELECT * FROM test_table")) (result (dbi:execute query)) (array '())) (loop for row = (dbi:fetch result) while row do (cons row array)) array)) ; => NIL
801 :
800 :2013/01/04(金) 14:42:32.04
"test_table"にはもちろんレコードは入っています。
多分、やりたいことって、 (dbi:with-connection (conn :mysql :database-name "test") (let* ((query (dbi:prepare conn "SELECT * FROM test_table")) (result (dbi:execute query))) (loop for row = (dbi:fetch result) while row collect row))) じゃないかなー。consかloopのdo節の動作を誤解してると思う。
803 :
800 :2013/01/04(金) 15:34:34.73
> consかloopのdo節の動作を誤解してると思う。 そのとおりでした。おそらくどっちも深く理解していません。。 やりたいことはできました。 そのあたり勉強してきます。
SBCL使っててEXCEPTION_ACCESS_VIOLATIONとか出たけど 原因が分からん\(^0^)/
806 :
デフォルトの名無しさん :2013/01/05(土) 09:17:59.44
>>805 多分、自分が悪い
どういう時にEXCEPTION_ACCESS_VIOLATIONてでるん?
thx! 解決したよ
809 :
デフォルトの名無しさん :2013/01/06(日) 04:16:04.64
実用 Common Lispと実践Common Lisp どちらを先に読んだらいいですか?
実用ってamazonでコメントないんだな
>>809 おれlispで書かれた自動巡回プログラムだけど、どっちから読んでも良いらしいよ
813 :
デフォルトの名無しさん :2013/01/07(月) 03:05:50.24
実践のp202の*acct*のaccount-typeが UNBOUND-SLOT となるんですが それでいいの?
815 :
デフォルトの名無しさん :2013/01/08(火) 05:19:39.63
CFFIの使い方わかりやすいサイト て知っていますか。
>>814 opening-bonus-percentage以降ならそれで良いと思う。
818 :
デフォルトの名無しさん :2013/01/08(火) 07:53:58.41
>>817 ありがとうございます。
では、account-typeのinitialize-instance :after と
opening-bonus-percentage のそれを両方を実行するには
どう書けばいいのでしょう?
Qiitaのcommon-lispタグのフォロワー少なすぎて泣ける
>>819 自分は知らないけど、:afterとか複数定義できたりするんだろうか。
CLOSに詳しい人いたら教えて欲しい。
(defmethod initialize-instance :after ((account bank-account)
&key opening-bonus-percentage)
(with-slots (balance account-type) account
(when opening-bonus-percentage
(incf balance (* balance (/ opening-bonus-percentage 100))))
(setf account-type
(cond ((>= balance 100000) :gold)
((>= balance 50000) :silver)
(t :bronze)))))
>>820 redditもそんなだから問題ない。むしろGoogleで検索して来いよ的な感じに割り切った。
stackoverflowで無問題。
823 :
デフォルトの名無しさん :2013/01/10(木) 08:26:49.80
Land of Lispの翻訳版て出ないのですか?
出処不明の噂によると、誰かが既に翻訳開始しているらしい。
和田さんじゃないことを祈る
R5RS Scheme処理系であるGaucheの開発者の川合史朗氏が翻訳してるとのこと。 プログラミングClojureを訳した人で、Common Lispにも精通してるから、 品質に問題はないはず。米国在住で日本語の文章も上手く、元ゲーム開発関係者。 Land of Lispの内容を考えても、翻訳者としてはこれ以上を望めないレベル。
このスレ見ててShiro知らない奴なんておらんだろ。
普通にいるだろ。Scheme使ってて知らないのは珍しいだろうが。
829 :
デフォルトの名無しさん :2013/01/10(木) 20:14:37.44
land of lisp おれも首を長くして待ってる。あのミュージックビデオは日本語訳されるのかな。
Land of lispは原書かっちゃったからなー 翻訳でても買うだろうけどepubがいいなー
833 :
デフォルトの名無しさん :2013/01/14(月) 02:26:59.64
個人のブログっぽいけど、こんな書き込みもある。
http://progn.cddddr.org/logview.cgi?2012-09-09 >>833 21:44:20 <g14008> この本はオライリーから出版される予定でしたが、著者の健康etcにより頓挫しました
21:45:08 <g14008> Common Lispの本がオライリーから出るかーと期待されたのですが…
21:45:46 <g14008> 頓挫した後完成しているところは、Creative Commons Attribution-NonCommercial-NoDerivs 3.0 で公開されています
初歩的な質問ですいません。 実践のスパムフィルタのp292(classify "Want to go to the movies?") を実行すると以下のエラーになります。 emacs + slime + sbcl です。 arithmetic error DIVISION-BY-ZERO signalled [Condition of type DIVISION-BY-ZERO] Restarts: 0: [RETRY] Retry SLIME REPL evaluation request. 1: [*ABORT] Return to SLIME's top level. 2: [ABORT] Abort thread (#<THREAD "repl-thread" RUNNING {10035E0063}>) Backtrace: 0: (SB-SYS:INVOKE-INTERRUPTION #<CLOSURE (FLET SB-UNIX::INTERRUPTION :IN SB-SYS:ENABLE-INTERRUPT) {7FFFF4A0D21B}>)[:EXTERNAL] 1: ((FLET SB-UNIX::RUN-HANDLER :IN SB-SYS:ENABLE-INTERRUPT) 8 #.(SB-SYS:INT-SAP #X7FFFF4A0D530) #.(SB-SYS:INT-SAP #X7FFFF4A0D400)) 2: ("foreign function: #x41961F") どこかで書き間違えてるのでしょうが どこで間違えてるのかこの情報だけでわかりますか? こういう場合どうやって問題箇所を探すのでしょうか? ひとつひとつコードを追いかけてくしかないんですか? vsやeclipseにばかりいじって来たので ちょっと戸惑ってます。。。 デバッグ中の変数の確認とかできないのでしょうか?
バックトレースそれだけだと自分には判断できない。
そんな感じだと、問題部分の特定のためにブレークポイント仕掛けるとかかなー。
あるいはデバッグ出力。それぞれbreakやprint使う。
ちなみに、まともにバックトレースが表示されてれば、ローカル変数表示できるよ。
「Backtrace:」以下に表示されてるスタックフレームの上でRETで切り替えできる。
http://cl.cddddr.org/index.cgi?SLIME%3ASLDB
839 :
デフォルトの名無しさん :2013/01/15(火) 06:33:48.22
エラーでたらググルしか対処法ないですか?
上の事例はちょっと特殊で普通は自己解決です。
841 :
デフォルトの名無しさん :2013/01/16(水) 04:04:52.95
英語わからなくてもだいじょうぶですか?
842 :
デフォルトの名無しさん :2013/01/16(水) 04:36:18.44
commonlisp学ぶのにプログラミングGaucheて本どうですか?
GaucheはScheme方言だから基本的にCommon Lispとは別物
> 英語わからなくても つか, ソフト業界の連中って英語読めない奴、意外と多いのな ハードだとデータシート英語の事のほうが多いんで, 読むくらいできなきゃやっていけないんだが… ある意味うらやましい
読むのは何とかなっても単語力ないからシンボル名を付けるのにいつも苦労してる みんなどうしてんの?
>>845 Google翻訳で、日本語--->英単語。
>>846 あれだめだよ
ジャーゴンファイル(出来れば昔の版)に目を通すことをおすすめする
おそらくこの図式だろう 読まない --> 辞書引くのがいや --> 単語忘れる --> 読めない でも、大学の教養まで入れると、8年くらいは英語やってるはずなんだよな
英語に限らないよ プログラマーは雑多な知識は多い割に 当面の仕事に関係なさそうと自分で決めた範囲にはまず時間を割けない
それ続けてると、多分どこかで行き詰まるぞ
最近行き詰まりを感じるからLISPより英語勉強してる
>>848 おもしろいね
欲しい語があんまり登録されてない...
技術文書の英語って、中学の文法レベルじゃダメなの?
>>847 > ジャーゴンファイル(出来れば昔の版)に目を通すことをおすすめする
具体的に昔の版のジャーゴンファイルって何?
>>849 大学受験レベルでマニアックでもない普通に使う3,500語ぐらいでほとんど知っていて
損はないレベルなんじゃないの。
>>854 英語に詳しくないけど、中学校の文法でだいたいの意味は読み取れると思うなあ。
+αを求められることもあるだろうけど、そん時に考えれば良い。
英語を読み解く環境を整えて入れば、それなりにいけるでしょ。時間かかるのは我慢するしかない。
東京に住んでいると併存英語案内がすごく多いから、日本語無視して英語と向き合うのはすごく
良いことだと思っている。駅名とか、英語で覚えちゃった方が良いくらい。日本で日本語無視して、
英語で暮らすのは割とできるんじゃないのかね。英語に詳しい人、ツッコミよろしく。
外国人向けに観光地にもなっていない非都市部は知らん。
どこからツッコめばよいものか・・・
( * )<ここで
高橋洋一が英語圏でFAXをファックスって発音すると恥をかくと 言っていたんだけど、POPをポップと言うと恥を書くのかな? 大文字略語は全部アルファベットで読んだ方が良い? あとインフレもinflationと言わないと通じないとも言っていた。 日本語においてのデフレはデフレーションの意味と ディプレッション(不況)の意味が混ざっているとも言っていた。 もっと余談だが、子供を英語圏で育てたので娘に発音が悪いと ボロクソに言われるらしいね。
861 :
デフォルトの名無しさん :2013/01/21(月) 01:59:47.35
methodの引数のクラスの優先順を通常の逆向き、つまり右から左にすることはできますか?
>>860 ”恥をかくかどうか”に拘ってたら、何年たっても話せないよ。
英語ネタ引っ張ってる連中いい加減にしろよ。 HyperSpecとかCLに絡めるならともかく、関係ない話を長々と。 マ板とか英語関係の板に行ってやれよ。
マ板で巻いた
実践Common Lispを169ページまで読みました。
lisp覚えるのって英単語を(目的語とか使用法を込みで)覚えるのとかなり似てるんだね 単語覚えないと何もわからない まぁある程度は他の言語でも同じだけど lispは得にその感が強いな
え、むしろ覚えること少ないよ
このスレの人たちって、CLを仕事で使ってるの?趣味で使ってるの?宗教上の理由?
俺は依存症だから
仕事かどうか気にしてるようじゃプログラミング道を極めることは不可能。将来的には霞を食って暮らすのだから仕事のことを考えても無駄。
わけわかんないこと言ってる男の人って マ板の話が分からなくなってム板へ来たんじゃないの?
普通に仕事で使ってる。
>>868 俺も、普通に仕事で使ってる。
つか、仕事で使って悪いような宗教上の理由とかがあるの?
Lisp使うってどんな案件ある?興味ある。
>>874 コンシューマゲームとかPCゲーム以外なら何でもあるぞ。(プラットフォーム上の縛りがあるからこれらは来ない)
>>874 社内のバックエンドは結構な率で CL 使ってるな
で、一応、 売り物にもしてる(あんま出て行ってないみたいだけど)
(4.2BSD 時代の franz から lisp 使ってたらしくってその名残みたい)
ネットワーク管理系とかは、ヒストリー調べて自己修正やらしてる所が
多いから S式ベースじゃないと結構辛い
(こっちは, ここ 10 年くらいかけて, うちのチームが開発した)
組込みだけど、使うライブラリの構成ツールとして使ってるな。 チップ・デバイスメーカーが標準化してくれればいいんだが。
よく分からないけれど、古典AIっぽいものを作る上では今も健在ってこと?
879 :
876 :2013/01/23(水) 22:59:26.71
すくなくともうちのネットワーク管理系はAIとはいわんな
>>878 AI作成に使われた、というよりAI関連のアイディア・仮説の検証・実装用言語作成に使われた。
少なくとも当時、AIとは何かについて大勢の意見がまとまっていたわけではないから、関連しそうなものなら何でも試すという雰囲気。
最近の研究は知らない。
>>874 データ処理のバックエンド側でそれなりに使ってるよ。
あとは実験的にあれこれ試行錯誤したい時のプロトタイプ実装の時とか。
最近のAI、特に機械学習やパターン認識の分野では、 統計解析のテクニックを多用するためか、MatlabやRを使う研究者が多い。 LispにもかつてLisp-statという統計解析ソフトがあったが、 実装はCLじゃなくてxlispという俺Lispだったし、その開発者はRの開発に回ってしまったと聞く。 CLにもcommon-lisp-statというのがあるけど、実用レベルとは言い難いな。
xlispは俺LispというよりSLISP後継の結構メジャーな処理系。 Common Lispではないという意味の「俺Lisp」ならその通りだが。
land of lisp 翻訳、来月らしいね。読みたい。
on lispやプログラミングClojureのようにebookも出るのかな。
land of lispが翻訳されるのか Grand Theft Autoのもじりのヒャッハーな感じがどう訳されているのか期待してる
>>79 > あとは定評のあるソースをたくさん読んで、とにかく何か自前で書く。
> どの言語でも入門がすんだ後の本はあまりない。他人のソースを参考に自前で書くのが一番。
亀レス。このソースの非Lispの割合ってどんな感じですか?
あと自前で書く意図は何ですか?
>>79 じゃないんだが
> 亀レス。このソースの非Lispの割合ってどんな感じですか?
どの言語でも, って書いてあるじゃん.
入門書 -> 間がない -> 中の上向け -> 飛びまくって -> 規格書
って, 構造の言語は結構ある
> あと自前で書く意図は何ですか?
同じ物を書くんじゃなくって,
自前で必要なものを他人のソースとか他の言語での実装を参考に書く
って, 趣旨じゃないか?
個人的には, 車輪の再発明がおすすめ
オレオレ簡易コンパイラを作るとか, オレオレ簡易リアルタイムモニター作るとか
Lispは入門後の書籍が豊富な稀有な言語。 他はC++と関数型言語くらい。
892 :
デフォルトの名無しさん :2013/01/29(火) 00:39:40.33
この酷いコードをエレガントにしてくだしあ! マクロの勉強をしているんで、できればいいマクロでお願いします (defun timestamp (country) (multiple-value-bind (sec min hour day month year) (get-decoded-time) (let ((japanese-style (concatenate 'string (princ-to-string year) "/" (princ-to-string month) "/" (princ-to-string day)\ )) (american-style (concatenate 'string (princ-to-string month) "/" (princ-to-string day) "/" (princ-to-string year)\ )) (usage "(timestamp \"ja\") or (timestamp \"en\")")) (cond ((equal country "ja") japanese-style) ((equal country "en") american-style) (t usage)))))
893 :
デフォルトの名無しさん :2013/01/29(火) 02:56:31.69
質問です。下記のコードでエラーが捕まらないのですがどうしてでしょうか?
コード:
(handler-case (progn (princ "before") (/ 1 0) (princ "after"))
(error (c) (princ "catch")))
印字:beforeafter
返り値:"after"
>>892 マクロでなくて恐縮ですが、自分なら国をオブジェクトにして表記ごとのクラスを作り、総称関数を使います。
(defmethod timestamp ((country country-using-american-style))
(concatenate 'string (princ-to-string month) "/" (princ-to-string day) "/" (princ-to-string year)))
(defmethod timestamp ((country country-using-japanese-style))
(concatenate 'string (princ-to-string month) "/" (princ-to-string day) "/" (princ-to-string year)))
894 :
デフォルトの名無しさん :2013/01/29(火) 02:58:45.55
>>893 訂正、defmethodのコードにmultiple-value-bindを忘れたので補完して見て下さい。
>>893 lambda式中の最後の式以外は副作用が目的なので、
そこで副作用なしの式を評価したら最適化の過程で無視されたということだろうと思います。
disassembleしてみるとそもそも除算命令が無いことがわかります。
なので副作用を必要とする場合はエラーを捕捉するはずです。
(handler-case
(progn (princ "before")
(princ (/ 1 0))
(princ "after"))
(error (c) (princ "catch")))
=> "catch"
>>892 こんなん書いといてなんだけど、普通に総称関数で良いと思う。
(defvar *behaviors* (make-hash-table :test #'eq))
(defmacro defcountry (id args &body body)
`(setf (gethash ,(intern (symbol-name id) :keyword) *behaviors*)
(lambda ,args ,@body)))
(defcountry ja (sec min hour day month year)
(declare (ignore sec min hour))
(format nil "~a/~a/~a" year month day))
(defcountry en (sec min hour day month year)
(declare (ignore sec min hour))
(format nil "~a/~a/~a" month day year))
(defcountry hour-min-sec (sec min hour &rest rest)
(declare (ignore rest))
(format nil "~a:~a:~a" hour min sec))
(defun timestamp (country)
(multiple-value-bind (sec min hour day month year) (get-decoded-time)
(funcall (gethash country *behaviors*) sec min hour day month year)))
(timestamp :hour-min-sec)
;=> "11:28:36"
(timestamp :ja)
;=> "2013/1/29"
(timestamp :en)
;=> "1/29/2013"
>>895 ありがとうございます、これは気づきませんでした。
SBCLでしたが、あらゆるコードはエラーが出れば副作用をもつので、これはバグなのでは…。
最適化の話であってバグではない
>>899 自分がコンパイラを書くなら、副作用がなく返り値を求められないコードは、コンパイル時に一度評価し、エラーが残ればエラーコードのみを残す設計にします。まあいずれにせよ大した問題ではないのですが…。
>>900 > コンパイル時に一度評価し
ちょっと冷静に考えてみろ
>>901 コンパイル時にコードを実行するなという意図であれば、self-compilingな言語ではあまり意味のないことかと思います。
ちなみにですが、CMUCLではエラーは捕まるようです。
コード:(handler-case (progn (princ "before") (/ 1 0) (princ "after")) (error (c) (princ "catch")))
印字:beforecatch
返り値:"catch"
>>902 いや、そうじゃなくてコンパイル時に評価出来るのは定数式だけという認識はあるのか?
CMUCLは知らないが、無意味だけどエラーになる定数式はコンパイル後も残って、
変数が入っていると最適化で削除されるなら、コンパイラに一貫性がないと考える事も出来る。
>>903 疑問点は、部分計算を行う場合にエラーの挙動を考慮しないことが仕様として許容されているのかということです。
副作用がなく意味がない事がわかってるコードを最適化で除いてるだけだ そのコードについて、ゼロ除算が起きる事が分かっている、という意味なら 「コンパイル時」にゼロ除算でエラーにする処理系もあるかもね
>>906 >>900 はその場合に、コンパイル時にコードを削除するのではなく、エラー関数をコードに残すべきなのではということです。
削除されてるのは(/ 1 0)だけだぞ、errorは残ってる (/ 1 0)を削除するなって主張なら、そういう最適化をしない 処理系を使うか、されないように設定しろ
>>908 何度も恐縮ですが、コンパイル時に(/ 1 0)を(error 'division-by-zero)に変換すべきではないかということです。
ちなみにSBCLでは下記のオプションを加えることで正常な挙動をするようになったので、問題ではないのですが、仕様ではどうなのでしょう。
(declaim (optimize (speed 0) (safety 3) (compilation-speed 0)))
SBCLならデバッガ入ればcompilation policyがdebug, safetyになるんじゃないかな? まあdebugger policyの設定にも依るんだけど。
>>909 policy通りの動作でなければバグです。
その処理系の最適化の方針によって決められるべきで 変換すべきと一律で決めつけられる話じゃない
>>912 最適化によって計算の結果が異なるというのは初めてだったのでやや驚いたのですが、SBCLとしてはエラー処理は「計算」の範疇外だというところでしょうか。
とにかくdeclaimで対処することにします。皆さんありがとうございました。
確かに気持ち悪さは残るが、 実際にプログラムを書くときに問題が起こるとも思えない。
> 最適化によって計算の結果が異なるというのは初めてだったので 最適化によっては動かない OS カーネルもあるし、 コンパイルできない、ソフトウェアもある これは言語によらない
prognの最後の式以外で副作用が無い時、それは実行する意味が無いコード という考えで最適化されている、って事も理解出来てなさげ 最適化を切る事で君の期待する挙動になったわけだけど それを"正常な挙動"とは言わないから
>>915 >>916 ありがとうございます。
>>917 どう読めばそうなるのか…。さらに、エラーは通常「計算外」の処理ではなく、仕様で厳密に決定された、勝手に削除されるべきではない計算の一部です。つまり(/ 1 0)は副作用を持ちます。
SBCLの場合は
>>914 に書かれた実際的な理由によりそれを削除していると理解しています。荒れそうなのでこれ以上は書き込みません。
エラーは副作用なのか? エラーが副作用だとすると、あらゆるコードは副作用を持つ可能性がある事になる。 本当にそれでいいの?
エラーを値として扱うのであれば 副作用ではなくなるとは思うが
除算が副作用をもつなんていったら、副作用をもたないプログラムなんて存在しないことになる ほぼ全ての関数呼び出しはスタックオーバーフローの可能性があるわけだし
エラーの捕捉は副作用を伴う処理だろ Haskellとかだってmonadを使う
エラーというか処理例外の捕捉だね
モナドで扱えるということはむしろ、副作用がないとみなせるということなんじゃないだろうか… モナドの関数だってあくまで純粋な関数なわけで、モナドは副作用を扱うための機構ではないから まあエラー処理系モナドは、副作用のあるものを純粋な枠組みでとらえるモナドなのだから、ある意味副作用があるとも言えるわけだけど Haskellでは、undefinedやゼロ除算みたいなエラー類は「どんな型にもなれる値」として扱われていて、評価されない限り副作用はないけれど、評価されるともろ副作用になる だからHaskellにおける「純粋な関数」は副作用の発生源になる可能性があるけれど、それでもその関数に副作用があるとは言わない そもそも何をもって「副作用がある」とするかってのはあまり厳密な決まりがない どんなプログラムも「世界」を暗黙の引数と返り値にしていると考えれば純粋だし だから「副作用」という言葉は文脈依存なところがある 副作用という言葉の意味のズレで話がこじれてるのもたまに見かけるし…
眠い時に文を書くとわけわからんくなるね ・モナドだから副作用ってわけじゃない ・エラーを発生しうる関数(あるいは関数的なもの)は副作用をもっていると言える ・でもそういう関数を「副作用がある」とは必ずしもいわない ・副作用という概念が文脈依存 と言いたかったのです
(progn (princ "before") (/ 1 0) (princ "after")) -> (progn (princ "before") (/ 1 0)) (progn (princ "before") (/ 1 0) (princ "after")) -> (progn (princ "before") (princ "after")) 結局のところ、どっちで最適化して欲しいかって事でしょ? 最適化って事なら後者でして欲しいし、単純にこのケースなら コンパイル時エラーになってくれるのが嬉しいかなぁ
副作用=代入or印字 という理解でいいのか
>>910 開発者の環境にもよるんじゃね
最近の slime だと, ^U^C^C とか, ^U 付けないとデフォでは
(optimize speed) が渡るみたいだし
Lisp-2のメリットって何なんでしょう。 意図せずに関数を変数で上書きしてしまう可能性があるとはいえ、 Warning出せばいいだけのような気がします。
Lisp-1から見たらそこで警告出されても鬱陶しいだけのような
>>929 今は歴史的な意義しかないと思うLisperが多いのでは?
MLの議論をまとめてCommon Lispの仕様を書いたSteele先生も、
どうせどのLispとも互換性ないんだから、
function cellとvalue cellはひとつにまとめといた方がよかったと発言。
関数名とかぶる変数名を使い慣れてしまってると 「なんでこんなエラー起こるんだ???」 と、小一時間時間を潰すこともあるので、このままでいい
937 :
933 :2013/02/08(金) 22:00:21.28
>>934 最初からネームスペースは一つにしておけば funarg 問題とかも起こらなくて、
funcall とか書かなくても良かったんだろうし, 933 に書いたような問題も
起きなかったんだろうけど
# C の "struct foo {...}; struct foo foo; ..." も似たようなもんだけど、
# おいらはそれが当然になっちゃったしな
funarg問題は変数のキャプチャの問題だからちょっと違うんじゃ?
初めてterminal emulator for Xを考え込んで整理した。まあ基本、全画面で使うんだけど。 CLでのcygwinとLinuxのterminal上の出力で互換性が高くやる方法って整理されているの? topが理想だけど、なんかのモニターとしてn秒毎に単純なshスクリプトで出力する感じで満足なんだけどなあ。
じゃあシェルスクリプトスレで。
反知性主義者だろ
>>941 他の言語ユーザーから見ると って書いてあるだろ
>>929 たとえば (f) みたいな式があった場合、
Lisp-1 だと f が関数か毎回調べる必要があるけど、
Lisp-2 だと束縛する時点で関数だと判明しているので、型チェックが不要になる。
なので速度上少し有利。
ってのもある。
はあ?
>>941 o'reillyでこの表紙か。。。
何本と読んだらいいのw?
Lisp alien本?
land of lisp → lol →laugh out loudly →ワロス ワロス本
既にLet over Lambdaがあるからだめだろう
ラリ本
キモ本
確かにキモい。でも、lisp に慣れるに従って、だんだんとあの姿にも理由があることが分かってくる。他のオライリー動物と同じく、知的で愛らしいんだ。 ひょっとすると、他の動物よりlispエイリアンの方が好きになるかもしれない。 そう、まるで映画アバターに出てくる青い肌の異星人のようにね。
アバターもえくぼ
「マンガで分かるLisp」も日本語版・英語版で書籍化すべき。 日本にも変態LISP文化があることを世界に知らしめるべき。
オーム社とNo Starchのずぶずぶタッグならやりかねない
>>953 アバター観てないの?あの映画に出てくるエイリアンも、最初はキモいけどそのうち慣れて、途中からは色っぽくさえ見えるんだよ。監督がすごく計算し尽くして作ってる作品。
ランドオブリスプもそんな風に、リスプエイリアンがかわいく観えるといいなあ、と思ったんだ。
あじゃぱー
>>961 このロゴ自体は好きだけど
lispにとかげのイメージってありますかねー?
>>961 ActiveStateのロゴとかぶるからなあ…
>>959 そんなに気持ち悪いとも思わなかったしなぁ…
まあでもそういう意味で言ってたのか。納得
>>959 リザードマンなアバター作るようなRPG好きの私に死角はなかったが言いたいことは何となくわかる。
#むしろProduction IGの作る3Dアニメの方がキモイ
land of lisp 、カバー動物の説明ないらしいぞ。超がっかりだ。第二版での修正を強く希望。
lang of lispの著者の経歴って、医学博士じゃなくて薬学?博士ではないかな
sbclって、いつのまにかwindowsポートが一番最新になったのか? kittenメッセージもなくしてくれよ
しかし未だに64bit WindowsはPort in progressである
970 :
デフォルトの名無しさん :2013/02/15(金) 18:42:58.09
実践Common Lispを211ページまで読みました
俺はもう5回読んだ
学びて思わざれば則ち罔く、思いて学ばざれば則ち殆し
973 :
933 :2013/02/15(金) 20:03:01.74
>>968 > sbclって、いつのまにかwindowsポートが一番最新になったのか?
ほかは, thread 関連以外は変わらず安定しているってことで.
NEWS みても git log 見ても windows 関連の変更が多いし…
いいことなんじゃないの, 使用する人の裾野が広がるのは???
変な反応…
SBCLはずっと前からWindows版を地道に改良してた物が取り込まれて、 その周辺がまだ固まってないからWindowsの変更多いだけだよ。 特別力を入れてるとかそんなんじゃない。 相変わらずLinuxがメインターゲット。
976 :
デフォルトの名無しさん :2013/02/18(月) 21:22:16.05
実践Common Lispを224ページまで読みました FORMATの章でした。 (format nil "(~{(~{~a~^ ~})~^ ~})" '((1 2 3 4) (one two three))) ~^は便利そうですね
60進法で角度を扱うのにreplで 例えば、45.3015と入力して45度30分15秒を表したいのですが 10進法の43.3015と区別するのに45.3015degと入力してもいいです。 こういうのはどういうふうに作るのでしょうか? "45-30-15"等と文字列扱いも考えたのですが できればダブルクォートなしで扱いたいのです。
978 :
デフォルトの名無しさん :2013/02/19(火) 23:37:50.31
実践Common Lispを235ページまで読みました。 第19章 例外処理を超えて:コンディションと再起動 でした。 ;; サンプルを作ってみました。 (define-condition my-error (error) ((text :initarg :text :reader text))) (handler-case (error 'my-error :text "test desu") (my-error (c) (text c))) (handler-bind ((my-error #'(lambda (c) (invoke-restart 'use-value "restart test")))) (restart-case (error 'my-error :text "test desu") (use-value (value) value))) 現在処理している場所はそのままで、巻き戻らずに、色々な事ができるというのが面白かったです。 ひと月になったのがエラーのキャッチの構文(handler-case)と、再起動のキャッチの構文(handler-bind)が違うということです。 同じでもよさそうです。(前者のほうが簡潔ですし)
979 :
デフォルトの名無しさん :2013/02/20(水) 01:29:03.79
lispやってみて、階乗から始まってフィボナッチ、ハノイの塔、クイックソート 正規表現抹茶あたり組んでみたけど、なんか飽きちゃったなあ。 なんか面白いテーマないかな。 プログラマとして勉強になるのかな、と思ってたけど、CでもRubyでもできるよ ねこんなのは。
>>979 そろそろ自分の作りたいものを作ってみれば?
特にアイデアがなくていかにもlispっぽい物をやってみたいなら記号微分・記号積分とか遺伝的プログラミングなんかも面白いと思うよ。
もちろんオレオレlisp処理系作ってみるのも良い。
進数操作の質問です (format nil "~vR" 36 120) ; => "3C" 10進数->36進数への変換は分かったのですが、 逆に36進数->10進数に変換するにはどうすればよいでしょうか
(parse-integer "3C" :radix 36)
>>979 On Lispは読んだか?
あれ読み終われば一皮むけるぜ。
Webで読める。
>>985 中の文を一切読まずにマンガだけ眺めて書いたような書評だなあ
次スレ立ててきます
>>979 まさしく俺がそんな感じだ
Project Eulerの問題いくつか解いてたけど、やっぱ速度が出ないからこういう用途には向かないなーとか思った
速度はおいておくとしても、一時変数が即座に宣言できないところも慣れない・・・
マクロだとかLispの良さみたいなのが知りたかったんだけど
やっぱOn Lispとか実践Common Lisp?辺りを読むほうがいいのかな
Lisp関係の本の読書歴は竹内本を半分ぐらい読んだ程度
ずっと気になっていたんだけど 真偽を返す関数名には-pとpで終わるパターンの二つがあるけれど 一定の法則があれば知りたい
昔々、どこぞでは branch-p? nil とかって会話してるとかしてないとかいう話があったが ただの笑い話だったのかな
セックルピー
nori-p
sortは何故nsortにしなかったんだろう?
>>979 アルゴリズムの実装も楽しいよ。ちょっと複雑な奴。
geri-p
998 :
981 :2013/02/21(木) 00:06:17.27
>>990 なるほど、ハイフンがあるものは原則として-pと考えてよく、
ただ例外的にpどまりのもの(string-lessはless + string-と捉え直す)もあるということですね。
すっきりしました。
1000 :
デフォルトの名無しさん :2013/02/21(木) 00:55:59.78
,,_
ノ `'ーァ、 このスレッドは999を超えました
,,.- ‐、ノ ./゙/ @ 新しいスレッドを立ててください
;<,.-‐ァ|実| `ヽ,//
`ヽi,. / |況| .,∧ l l 実況はサッカー実況板で
.l |禁| ,l .l l l ∧,,∧
http://live2ch.net/ | ヽ止ヽLiヘ_l,l \ ミ゚Д゚;,彡つ彡
.l, .l, ヽ、__.l \\ (⊃ J ミ´
.l 'l l. l ,|. Σ⊂゙,,, ,,,ミ〜
゙i,,__'|,l,._l,_l \)
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。