【入門】Common Lisp その7【質問よろず】
((お勧めの Common Lisp 処理系)
(SBCL:
http://sbcl.sourceforge.net/ :プラットフォーム UNIX, Linux, Mac, Windows(移植中)
:開発 活発
:日本語 使える(UCS4, UTF8, EUC)
:特徴 一番お勧めのコンパイラ。)
(CLISP:
http://clisp.cons.org/ :プラットフォーム UNIX, Linux, Mac, Windows
:開発 そこそこ活発
:日本語 使える
:特徴 バーチャルマシン。遅いがフットプリントが小さい。)
(CMUCL:
http://www.cons.org/cmucl/ :プラットフォーム UNIX, Linux, Mac
:開発 そこそこ活発
:日本語 Unicode
:特徴 高速コンパイラ。SBCL の元になった。)
(Clozure CL:
http://openmcl.clozure.com/index.html :プラットフォーム Windows, Linux, MacOSX, FreeBSD, Solaris
:開発 そこそこ活発
:日本語 CP932、EUC-JP、Unicode系全般。ISO-2022-JP未対応
:特徴 元々商用のコンパイラ。ネイティブスレッドが使える。))
1 乙
余裕の 8 ゲット
いつの間にかスレ立ってたのね。乙です
この前おちてたね。
それとXCLがこの前出たみたいだが、コレはまだだめなのか?
http://armedbear.org/ 日本語は一応使えるが微妙な印象
ちゃんとは見てないからわからんけど。
CL-USER(1): (princ "あいうえお")
あいうえお -> "あいうえお"
CL-USER(2): (char "あいう" 1)
#\ <- (「#\い」にならない)
CL-USER(3): (char "abc" 1)
#\b
>CL-USER(2): (char "あいう" 1) >#\ <- (「#\い」にならない 細かい環境がわからんからアレだが ウチのMeadow+Slime+ABCL+JDK1.6では #\い が返る、slimeの設定で指定してるのは slime-net-coding-system が 'utf-8-unix な事くらい
>>12 やABCLじゃなくてXCLの話な。SBCLとかでもうまくいくよ。
ちなみにXCLをslimeで起動したらエラーになった。
まだ対応してないのかも。
; Loading /home/user/.el/slime-2009-01-02/swank-loader.lisp ...
Debugger invoked on condition of type PROGRAM-ERROR:
Wrong number of arguments for #<FUNCTION (LAMBDA (SYSTEM:NAME SYSTEM::INITIAL-VALUE &OPTIONAL (SYSTEM::DOC NIL SYSTEM::DOCP)$
Restarts (invokable by number):
0: RETRY Retry loading "/home/user/.el/slime-2009-01-02/swank-loader.lisp"
1: SKIP Skip loading "/home/user/.el/slime-2009-01-02/swank-loader.lisp"
2: TOP-LEVEL Return to top level.
そろそろClozure CL 1.5が出そう。RCが出てる。
ttp://ccl.clozure.com/blog/?p=83 faslとヒープイメージのバージョンが上がったので、要再構築。
擬似乱数生成器が、周期が約2^185のMRG321k3pになって、
ベクタストリームが追加された。メモリ解析ツールの改良と機能追加も。
>>11 XCLは前にABCL調べてたときに見付けたけど、
まだ新しいし、どういう路線なのかが分からなかったんで、スルーしてた。
簡単でもいいから、方向性とか示してくれてると、wktkできるんだけども。
ふと立ち寄ったんだが、ClojureじゃなくてClozureってのもあるのか。やれやれw
>>15 元々の名前はOpenMCLっていうんだけど、
それとは別にMCLってのがあるんだぜw
苦労じゃのう
(^^)
そら無駄って物さ
20 :
デフォルトの名無しさん :2010/04/19(月) 22:15:51
どう書く?orgのcommonlispのページが変な表示なんですけど どうしてでしょうか?
>>20 評価の高い投稿だけ表示したらまともになった
lispboxというのwinXPに入れてみた lispなんて全然やったことないんのにw lispの本は難しそうだから、ネットの入門サイト見ながらいろいろ試してるとこ 括弧に抵抗なくなったら、一番やさしそうな本でも読んみる
27 :
25 :2010/04/25(日) 16:48:56
>>26 レスありがとう
その本なら知ってます
しかし、自分にはレベル高すぎのような気が・・・
いずれ読もうとは思ってるけどね
まずは「対話によるCommon Lisp入門」や「これがLISPだ! 」あたりから読もうかと
28 :
25 :2010/04/25(日) 16:52:37
初めてのためのLISPの付録のところで ドット対は (a b c . c) って描きかたしてもいいみたいな記述あったんだけど ドット対の右側って複数の要素ならべてもいいの? それともこの本だけ?
30 :
29 :2010/04/29(木) 12:14:04
ちなみに 付録Lispのまとめ の A1.6コンス のところね
31 :
29 :2010/04/29(木) 12:16:06
ごめん大まちがいした 誤>ドット対の右側って複数の要素ならべてもいいの? 正>ドット対の左側って複数の要素ならべてもいいの? 右側は理屈上S式1個しか書けないよね
ドット表記にすれば分り易い? '(a . (b . (c . c)))
33 :
29 :2010/04/29(木) 23:20:31
>>32 ありがとう
意味は了解しますた。
ところでこれってCommonn LispとかLispの一般的な記法なんですか?
ドット使った記法ってペアしかダメだと思い込んでたもので。
あとたとえば( . b )
って書き方はCommon Lisp ではOKですか?
理屈の上では ( . b ) = b な気がするんですが。
36 :
29 :2010/04/30(金) 01:48:50
>>34 どうもありがとうです。了解しました
( . x)はやっぱだめですか
ちなみにcar に何が入ってるというか、
(a b . c)
/\
a /\
b c
(b . c)
/\
b c
( . c)
c
というふうに左の項が1つ減るたびに
「aへ」 が減ってく感じで類推してたんですが、、
>>36 それだと、記法の整合性が取れないのでは??
cdr部がリストのときは、carとcdr部間のドットとcdr部の一対の括弧が省略される。
なので、cdr部がアトムだとドットが省略されない。
nilはリストでもあるから、cdr部がnilの場合は隠されてしまう。
(a . nil) と (a) は同じ。
(a . nil)と(a . ()) は同じ。
ドット対は基本的にはコンスセルを表現する記法 (a . b) = [ a | b ]
最初の頃は (p . q) とかが顔に見えて困った 今はもう慣れたけど
consはただのコンテナ 印字表現とデータ構造を混同するな
>>42 > consはただのコンテナ
どういう意味?
「ただの」って。
44 :
29 :2010/04/30(金) 22:17:41
整合性ってだけなら ( a ) = (a .())を>34のdotted listとして一般化して ( … )=(… . ()) の…が空の場合を考えれば nil = () =( . ()) = ( . nil) でしょうし、 nil = ( . nil) なら a = ( . a)でもおかしくないんじゃないかと、、 でもまあ結局のところ >42の人のいうとおり仕様というか決めの問題なわけで 実際Common Lispではこんな変な記法は仕様にないことは十分納得しましたです。 ありがとうございました
() = ( . ()) という点があやしい気がするな。...が空の場合考えれば という部分で、無の文字列に意味をもたせちゃった事で矛盾が生じている。 (cons X Y) = (X . Y) なんであって、 NIL = () はドット記法ではあらわせない。 () はアトムでもあってそれ以上分割できない。単位元みたいな存在。 CONS で表現できないドット対があると、ドット対の定義から変更する必要がでて きちゃうからねぇ。でも深く考えてみるのはいいことだと思う。学生の頃の俺は そんな深く考えなかったよ…最近の若者はすごいな。
>>44 (i) アトムは S 式である。
(ii) S1, S2ともに S 式ならそのドット対 (S1 . S2) も S 式である。
(iii) (i) と (ii) で定義されるものだけが S 式である。
( . ()) は car に S 式がないじゃん
>>45 ドット表記って単なる糖衣構文だと思ってたんだけど、
糖衣構文なら( . ()) = ()とするLispがあっても良い気はする。
もちろん、CLHSにあるように、CLではNGだけど。
ただ、上でも書いたけど、それによる利点が無いし、
ドット表記でcarとcdrを明示的に書く習慣とも一致しないし、
多値の導入における対称性みたいな、課題の解決とかもないから、
あえてそうする意味も無いとは思う。
深く考えるのは良い事というのには同意。
今回色々調べてみて自分も勉強になった。
>>47 > ドット表記って単なる糖衣構文だと思ってたんだけど、
そんなこと思う人間は珍しい。
どっちかというとプリミティブな記法。
>>43 こういう文脈で使われる「ただの」ってのは、「それ以上でもそれ以下でもない」
ってな意味じゃねーの。
(1 . (2 . (3 . ()))) がプリミティブで (1 2 3) が糖衣構文だと思うけどなぁ
そこでM式ですね
>>45 () = ( . ()) という点があやしい気がするな。
'nil = (cdr 'nil) とか
(たぶん関係ない)
関係なくはないけど、そっちからの類推だったとすると (car nil) = nil から nil = (nil . nil) 的なかんじになるんじゃないか? CL では規格で car, cdr は「引数が NIL だったら NIL を返す」と決まっているから そうなっているのであって、NILという値のcar/cdr部の値が NIL なわけじゃない。 CLでは NILは generalized boolean として false と空リストの両方の意味を兼ねているからね。 これは設計上のトレードオフなので、Schemeなんかは空リストに対するcar/cdrはエラーになるし、 そもそも空リストと偽 #f は別の値だ。
nilのcarはまだしもnilのcdrはちょっとヤだな
(a b c . d) →(b c . d) →(c . d) →X (a b c . d)= (a . (b . (c . d)))→(b . (c . d))→(c . d)→d ∴X=d
3 * 1/3 = 1 2 * 1/2 = 1 1 * 1/1 = 1 ∴ 0 * 1/0 = 1
こんなマクロ書いたとして (define-syntax sample (syntax-rules () ((_ (a ...) b) '(a ... . b)))) こう使うと… (sample () d) こうなる 'd 素直に解釈するとマクロ変数 a がはからっぽで b には d が入ったわけだから マクロ展開の結果は '( . d) なはず。 これが 'd ということになるのはなんだか不思議な気がする。
>>57 なんでこのスレで Scheme の話すんの?
泥んこ玉は何がどうなっても泥んこ玉ってことは派生した 言語も泥んこ玉だからってことじゃないの? いや、詳しくは知らないが
それは独自解釈を追加しちゃっているよ。リストが「からっぽ」というのは Scheme でも空リスト相当だが、君は空リストではない「からっぽ」を考えてしまっている。 Schemeでも ( . d) なんてのは不正なので、それに「なるはず」というのはちょっと無理があるね。 特異点があるのが許せないのかもしれないけど、数学の世界にだってあるしねぇ。 SRFI-1 の cons* でもこう。 (cons*) => () (cons* 1) => 1 (cons* 1 2) => (1 . 2) (cons* 1 2 3) => (1 2 . 3)
>>57 不思議じゃない。
syntax-rulesを実装してみれば君の勘違いが分かる。
>>55 な感じの再帰になる。
ま、初めたての頃は多くの?にぶつかるんだから、大した問題ではないと思う。 Lispは拡張していく言語だっていうから、それを実感して良かったのでは?
全然考えたことなかったけど、( . b) が b でも基本的に問題がないような気がしてきた
( . b)はデータ構造としてありえない状態なんだよ ) . (を解釈しないのはおかしいと言ってるのと同じ
そういえば、Clozure CL 1.4をWindowsでSLIMEと使っていると、 いつの間にか接続が切れててイラッとするバグ、1.5で直ったね。 手を焼かされてたから良かった。
実用Common Lispなる本を買った 寝っ転がって読もうとしたが、その質量にあえなく挫折した 今は正座している
腕の筋肉を鍛えるいいチャンスではないか
>67 今日本屋で見かけて俺もビビった PAIPの邦訳が本当に出てるという事実だけでも驚いた
72 :
67 :2010/05/06(木) 01:41:19
>>71 それはしらなんだ
俺が買ったのはピーター・ノヴィグの方ね、
CLTL2より質量があって中身も濃いんだわ
とりあえずゆっくり寝転んで音読楽しもうとしたら
>>67 になったので正座して速読したのだけど
速読でも20分かかるよ!
てか速読中に手が疲れたの久々だよ!
ああ、岩本町の書泉に積んであったね でかすぎて立ち読みしようとは思わなかったけど 評判がいいなら買うかも
何が書いてあるの
俺も昨日新宿の紀伊國屋で見た そして持ち上げる気も起こらなかった
まじだでてる。英語のを買って読もうと思ってた矢先に・・・。 邦訳するなよ。俺の英語力が上がらないではないか。 でも¥9660wたけえww
まだlet over lambda読み終わってないのに しかしAIと絡めた話が読めるのはうれしい
オマエらお金あんのな。そっちのがウラヤマシイ。
図書館に購入申請すれば、通ったりするかも。
女の子とのデートを一、二回止めれば十分買える値段だろ 愛とAIどっちが大事なんだよ
>>81 お前二行目が言いたかっただけだろ(棒読み
>>81 デート二回とか………一度だって人生に無い俺に謝れ
LOLとかOn Lispとか買ってたらもう要らんでしょw 9kも払うほどの内容か?
AIだろAI
永瀬乙
>>81 いやむしろ一行目を声を大にして言いたかったんだろお前
くやしいのう
まぁ俺はAIに生きるがな
ホテルに行かないデートなのか、ホテルしか行かないデートなのか、それが疑問。金額的に。
AIがいいならそれ専門の本を買えばいいんじゃないの。 AIの研究所か研究室に来るLisp知らん学生向け講義の教科書になるように書いたのかな
>>84 そこに AI があれば、それでいいじゃないか。
91 :
デフォルトの名無しさん :2010/05/10(月) 20:50:25
clozure cl 1.5の 付属coca-ide 64bit 立ち上げると alt-consoleが出て 落っこちるだけど、動いた人いる?
上級者ともなると ( を打ち込んだ時点で果てる
]で海老反りですが何か-p
>>92 そのうち、lisp制御のtengaを作るんですね!
>>92 うずらみたないのを作って女の子言葉だけネットワーク上で選らんで学習させてちょっと悦に入ってた時期がボクにもありました
いい気になって好き勝手にURL読ませたら2chばっかり拾いやがって……
シクシク
うずらってまだ生きてたんだ…今何歳だあいつ?
SLIME使ってるけど、SKKで何故か漢字変換できない人(つまり自分)用の設定。 (defun slime-space/skk (n) (interactive "p") (if (and (boundp 'skk-henkan-mode) skk-henkan-mode) (skk-insert n) (slime-space n))) (add-hook 'slime-mode-hook (lambda () (define-key slime-mode-map " " 'slime-space/skk))) SLIMEのキーバインドが、SKKのキーバインドをシャドウしてしまうのが原因。
ASDFが2になって変わり過ぎ。どうしてこうなった。 いきなり*enable-binary-locations*とか削除されてたからびっくりした。
clbuildで久しぶりにupdateかけてみたら 全然つながらない
102 :
デフォルトの名無しさん :2010/05/26(水) 23:07:50
女1匹よりもPAIPの方が価値あるよ。 女なんて所詮、生けるテンガ。
涙拭けよ
(apply #'and '(1 2 3)) andなんて定義されてませんよ というエラー出る
>>104 andはマクロであって関数ではない。というのが答え。
マクロは便利だけど高階関数に使いたいとき困るな。 関数のつもりで使ったらエラーになって、実はマクロでしたと判明するとガックシ。
lambdaでくるむ
maximaはcommon lispなのに静的スコープでないの納得いかない
maxima は maxima 。 CommonLisp ではない。
110 :
デフォルトの名無しさん :2010/05/30(日) 03:36:12
SBCLってのはコンパイラなの?インタープリタなの? 実行バイナリってどうやって作るんだよ?
生成された実行ファイルの大きさにびびるに一票。
113 :
デフォルトの名無しさん :2010/05/30(日) 11:44:13
>>111 さんくす!
>>112 マジでけえwww
SBCLでアプリ作って、実行バイナリで配布しようとしたらこんなサイズになっちまうのか・・・
まぁ C で言ったら libc や crt や cc に加えて、各種ライブラリを丸抱えしている様なもんだからね…
コンパイラも入れてやれ
逆に考えれば周辺ライブラリとの互換性無視で動かせるってことになりのかな?
>>113 メモリイメージ込みだから。逆に、メモリイメージを保存するということで、
色々融通が利くというメリットもある。重い処理済んだ所で保存するとか、
そういうのが凄い簡単。
でも実際、AllegroだかLispWorksだかにあるとかいう、
必要ない部分は省く機能とかは、あった方が嬉しいよね。
マイクロソフトさんvisual lispマダー?
>>121 がっかりしちゃうかもしれないけどL#って実装が一応ある
俺はclojureの.net移植でいい気がする
Autodeskので我慢してくれ。
schemeで、演算子を比較する関数ってありますか? 例えば+と+なら同じだからtrueを返し、+と−なら異なるのでfalseを返すといった感じです。
(eq? + +) => #t (eq? + 1) => #f
FreeBSDでsbclを使う場合のasdfのパスはどうするのがいいのでしょうか portsでいれたcl-fooが(require :foo)で動きません
>>127 ASDF1なら、asdf:*central-registry*に、
cl-fooのasdファイルがある場所を追加すればオーケー。
多分、どっかの下にあるsystemsってディレクトリに、
asdファイルのシンボリックリンク作ってると思うから、
そこをpushしとけばいいんじゃないかな。
(push "/home/foobar/share/lisp/systems/" asdf:*central-registry*)
みたいな感じ。
ASDF2なら、仕様が劇的に変化したから、公式のドキュメント読んでくれ。
最近「ANSI Common Lisp」をやりはじめたんだが練習問題を解くときに 反復やsetf、letなんかを使うと負けた気分になるんだけどこれって正しい?
>>129 最初のうちは、反復やsetfを使わないように意識するのは良いことだよ。
基本が身についたら反復もsetfもloopマクロも遠慮なく使うべきだ。
loopマクロはグレアム本では毛嫌いされていて載ってない
asdf2なんてできてたのか せっかく慣れたのに
133 :
デフォルトの名無しさん :2010/06/14(月) 11:28:42
>>132 この書き込みから、LISP信者は勉強ギライだということが分かりました
最近「Common Lisp」を勉強はじめたんだが固定長の配列を使えばすむところを listを使って再帰でループを回したら勝った気分になったんだけどこれって正しい? A 勝手に何でも使って勝った負けたと喜んでいてください。 ループの固定回で違う処理を追加するために制御変数を渡すようにしたら不格 好に見えるんだけどこれって間違っている? A 不格好かどうかは本人の主観です。勝手に間違っていると思っていてください。
>>132 つい最近出来た。仕様が変わりまくりで、良く言えば柔軟になった。
悪く言えば、は略。一応、後方互換も多少は残ってる。
>>134 速度の必要な場所ならベクタ(配列)使うべきだろうけど、
問題にならない場所なら、概ねリストの方が扱い易い。
ルックアップテーブルにリストを使うとかしなければ。
それと、状態を持ち回らないといけない場合は状態を渡すけど、
制御変数という表現には微妙に引っ掛かりを感じる。
なんとなくLispのイディオムから外れてる気もするので、
>>135 の言うように、例を挙げてもらうといいかも。
>>135 ,
>>136 レスサンクス
最初が16個の0-255の整数のlistを受け取って16進ダンプする関数。
(defun l16-dump (l16)
(format t "~10,'0x :" addr)
(l16-hdump l16 0)
(do '(i (length l16) (+ i 1))
((> i 15) )
(format t " "))
(format t " : ")
(l16-cdump l16)
(format t "~%"))
(defun l16-hdump (l16 i)
(cond
((setq ch (car l16))
(format t (if (and (/= i 0) (= (mod i 4) 0)) "-" " "))
(format t "~2,'0x" ch)
(l16-hdump (cdr l16) (+ i 1)))))
続く
(defun l16-cdump (l16) (cond ((setq ch (car l16)) (format t "~c" (code-char (if (or (< ch 32) (> ch 126)) (setq ch 46) ch))) (l16-cdump (cdr l16))))) 次が16個の0-255の整数の配列と長さを受け取って16進ダンプする関数。 (defun l16-dump (l16 len) (format t "~10,'0x :" *addr*) (do ((i 0 (+ i 1))) ((> i 15)) (format t (if (and (/= i 0) (= (mod i 4) 0)) "-" " ")) (format t (if (< i len) "~2,'0x" " ") (aref l16 i))) (format t " : ") (do ((i 0 (+ i 1))) ((= i len) ) (setq ch (aref l16 i)) (format t "~c" (code-char (if (or (< ch 32) (> ch 126)) (setq ch 46) ch)))) (format t "~%"))
>>137-138 なんか色々変だな
cond の条件節に setq ?
そもそも ch ってどこで宣言してるんだ?
140 :
139 :2010/06/14(月) 22:21:48
あと addr と *addr* ってのもどこで定義してるんだろう 直感的には loop マクロ一発で書ける気がする
>>137 色々抜けてるけど(外からやってきたと思われるaddrとか)、
ざっと見てとりあえず、
* アドレスをダンプする処理はl16-dumpには必要ない(呼び出し元でやるべき)
* リストを走査する処理がLispのセオリーとかけ離れている
* letとsetqの理解が曖昧
辺りは気になった。
関数ごとの機能を小さく作って、複数の機能を持たせないのが関数型の基本だし、
リストの処理をするときは、carで先頭を取って、残りをcdrで次に回すのが普通。
setqの部分は普通letを使ってchに束縛する。
わざわざ再帰にしなくても、doでこんな風に書けるし、 (defun dump (l16) (do ((l l16 (cdr l))) ((null l)) (let ((ch (car l))) (print ch)))) dolistの方が良い気がするし、敢えて再帰で書くなら、 (defun rdump (l) (when l (let ((ch (car l))) (print ch)) (dump (cdr l)))) こんな風だと思う。
ほぼネタだけど (defun dump (addr l16) (format t "~10,'0x : ~{~3@{~2,'0x ~}~2,'0x~^-~} : ~{~c~}~%" addr l16 (mapcar #'(lambda (c) (if (<= 32 c 126) (code-char c) #\.)) l16))) きっちり小分けにして書くならhdump部はloopマクロ、cdump部はdolistかなぁ。
>>139 chは宣言していない。setqは代入された値を返すからlistの終端でnilを返し
再帰が終わる。addr と *addr*はともに別のところで大域変数宣言している。
*の有無は慣習を知らなかったため。
loop マクロ一発で書けるだろうが簡単になるとは思えない。
>>141 アドレスのダンプは1行分の処理をまとめたかったのでこうしている。
あとの二つは恥ずかしながらまったくわからない。letは局所変数宣言と
初期設定だと思っていた。letを使うべきでsetqがなぜダメなのかは知りたい。
最後の2行目はその通りにしている。
>>142 listで受けてdoを使ったのも書いてみた。制御変数(と言わないかもしれ
ないが)が必須なので若干違っている。
く、俺もおめーらみたいなLisperになってやるならまってろよ!
すまんw iphoneで書き込んだら変な変換かかってしまったw 実践Common Lisp 読みながら寝るぜ
>>144 なら、アドレスもダンプする関数に渡すとかしたらどうだろう。
元のコードだと、外部の状態に処理が依存していて、関数型っぽくない。
参照透過性について調べてみて。これ無視すると関数型の威力激減。
二番目はこちらの勘違い。ごめん、忘れて。
letとsetqは慣習の話。仕様的にはsetqでもダメじゃない。
letは値に名前を付ける。setqはその名前に結び付けられた値を書き換える。
だから、setqを見たLisperは、どこかの変数の値を書き換えてるんだな、と思う。
典型例は
>>139 。要するに紛らわしい。
>>143 マジレスすると16より少ない場合があるからたぶん使えない。
>(if (<= 32 c 126) (code-char c) #\.)
なるほどこれはいい。
>>148 >なら、アドレスもダンプする関数に渡すとかしたらどうだろう。
以前は必ずそういう書き方をしてたのだが最近になってしなくなった。
なぜしなくなったか書くと私にとってくだらない議論になるだけだから書かない。
あのソースを出したのは不用意だった。こういう展開になるのを予想できていた
らそのように書いたのを見せていただろう。再帰については
>>142 のやり方が綺
麗に見える。
予防線を張りまくりな割につつかれると後出しで何かブツブツ言ってくる質問者は 対話型の学習には向いていないのでテンプレのリンク集を試してみて下さい
>>149 何か色々話が逸れたけど、本題のiの扱いについてはちょっと考えてみた。
まず、データを読み込むときに、16に足りない分はnil辺りで埋めておけば、
l16-dumpで空白を出力する部分もl16-hdumpにまとめられる。
あとは、あらかじめ区切りの並びを作っておけば、一応数をカウントしなくて済む。
(defun hex-dump (dat sep)
(let ((c (car dat))
(sep (if sep sep '("-" " " " " " "))))
(when c
(format t "~a~2,'0x" (car sep) c)
(hex-dump (cdr dat) (cdr sep)))))
こんな風。最初に呼ぶ時は、sepに'(" " " " " " " ")渡せばいい。
誰もつっこんでないけど
>>137 のdoの後ろのクォートは
とってもアレだから気を付けようね。
* (let'(a 1)(list quote a))
(NIL 1)
sbclがチューンするとCと同じ速度出せるというのが信じられない 動的型なのに
>>148 続き
>letは値に名前を付ける。setqはその名前に結び付けられた値を書き換える。
このあたり抽象的すぎて理解できていない。メモリ上のデータが両者でどう違
うか分かるまでは分かったような気にならない人間だからこういう説明は結構
辛い。説明が悪いといっているのではなくアセンブリ言語から入った人は多少
はこういう感覚を持っていると思う。
>>150 > 対話型の学習には向いていない
いえいえそんなことはありません。
>>134 以来皆さんのレスのおかげで随分
学習が進んでいます。あらためてお礼を申し上げます。この程度ならlisperが
違和感無く見られるソースを書けるようになっていると思います。
>>151 レスサンクス。
>まず、データを読み込むときに、16に足りない分はnil辺りで埋めておけば、
これだとlengthで位置がとれる(今やってみた)のでそちらの方が簡単かと。
>>152 これを書くときはwebを見てコピペしたみたいだ。自分の参考書2冊ともこん
な書き方をしてなかった。なぜアレなのかは想像もつかないがこれでなぜ動
いているのかの方がもっと不思議。
>>155 letはxを1として、コードを実行する。setqはそこから見えるxの値を1に書き換える。
舞台裏まで知りたいなら、処理系のコードでも読んでください。
あと、どうも誤解させた気がするけど、
>>151 で言ってるnilでのパディングは、
(defun hex-dump (dat sep)
(unless (endp dat)
(let ((c (car dat))
(sep (if sep sep '("-" " " " " " "))))
(format t "~a~a"
(if c (car sep) " ")
(if c (format nil "~2,'0x" c) " "))
(hex-dump (cdr dat) (cdr sep)))))
こういう意味。これなら、不足バイト分後から空白で埋める必要ないから。
ああ、処理系のコード読むより、もっと良いのがあるじゃん。 どうぞ、disassemble関数(ANSI標準)で心ゆくまで納得してください。
>>156 すげぇ。lisperってこんなん普通に書いちゃうわけですね... orz
sep に渡す引数って、使いきっちゃうと nil 渡したときのデフォルトが使われ始めるけど
これを最初に渡した sep で繰り替えしたいときはどうするのが一番スマートですか?
リーダーマクロ使って循環リストを引数に渡す、ってのは思いつきましたけど
lisperならフツウどうするんですか?
>>156 letとsetqの違いを理解できないのは私がアホなだけで説明する人のせいではあり
ません。
もともとは再帰関数で制御変数みたいなのをを持って回るのがカッコ悪いのでは
ないかという疑問だったのです。listを持って回るのは再帰的構造をしているので
違和感はないのですが渡すのが一つで済むならそちらがいいのではないかと思
ったわけで好みの問題だと思います。
>>157 サンクス gclでやってみたけど違いはsetqではグローバル変数を作ってそれに値
を入れるということでいいのだろうか?そこしか違いが分からないがもしそうだとす
れば気持ち悪いソースを書いていたんだと思う。
teste
readで読んだ文字列をS式として実行とかできるん?
(eval (read-from-string "(+ 1 2)")) ってか
>>159 要はひとつのサイクルを持ち回すことができれば良いので、
(defun f (l n)
(loop repeat n
with cycle = l
for y = l then (if (cdr y) (cdr y) cycle)
do (format t "~a" (car y))))
こういうノリでloopを使って邪悪に書きました。(f '(+ - - -) 50)みたいに呼んでください。
再帰で書きたいなら、defunをletで囲んでレキシカル変数にサイクルを保存したり、
毎度サイクルを丸ごと渡したり、labelsで関数内関数を作ってそちらを再帰したり、
ネタっぽい方法しか思い付かなかったので、普通に循環リスト使うのが良いと思います。楽だし。
ごめんなさい。cycle要らないですね。 (defun f (l n) (loop repeat n for y = l then (if (cdr y) (cdr y) l) do (format t "~a" (car y)))) で。
>>160 必要な状態を持って回るのは普通だと思う。不要な物まで持ってく必要はないけど。
再帰の定石を知りたいなら、Schemeのコードが参考になるんじゃないかと。
CLerは普通loopとかdoとか使うし。
setqは、ローカル変数の宣言次第でまた違うけど、件のコードだとまさにそう。
>>167 サンクス 関数のなかでグローバル変数を作れてしまうのに逆に驚いてしまった。
皆さんのおかげで最初の一歩を踏み出す準備ができました。とくにソースを示して
くれた人、どれも示唆に富んでいました。ありがとうございました。
今日立ち読みで、実践CommonLisp読んできたんだが、初めて Lisp の format がちょっと理解できた。
そして何故 Lisper は printf じゃないのかを垣間見た気がする。format に比べたら printf はおもちゃだ。
Lisp っぽくはないから諸派あるらしいけど、printf系しか知らなかったから新鮮。
というわけで
>>143 を練習で書き換えてみた。
(defun dump (addr l16)
(format t "~10,'0x : ~{~3@{~:[ ~;~:*~2,'0x~]~^ ~}~1@{~:[ ~;~:*~2,'0x~]~^-~}~} : ~{~c~}~%"
addr l16 (mapcar #'(lambda (c) (if c (if (<= 32 c 126) (code-char c) #\.) #\ )) l16)))
区切りを - と space で切り替えるのに、3回、1回でそれぞれ回してるのが気になるけどどうにかならない?
見なかったことにする
カオス過ぎるw CLも使うけど、元々SchemerだからCLのformatには付いて行けないw
CLの変態formatを使いこなせる人は変態だと思う。
~{ とか ~[ とかはLispらしい、と思うな。 formatterマクロを通してどんな関数に変換されてるのか想像しながら書くと楽しいんじゃないか。 ~Rとか~@Rみたいなのはどうかと思うけど、年に2回くらい感謝する時があるから困る
whileがよくわからない… GIMPのScript-fuを勉強してるのですけど while が出てくるんですよ でも、勉強用にインストールした DrScheme 上で、 言語選択でR5RSにして while を使おうとしても「そんなのねえよ」と言われてしまう たぶん、GIMP上では while が独自に実装されてるんでしょうけど R5RSでは while が無いということは… while でループをするのは、 Lisp系の言語にとって「筋が悪い」ことなのでしょうか? できるだけ再帰でループしたほうが「筋がいい」のでしょうか? Lisp系の中で、while の扱い・立場がよくわかりません
>173 変態の称号授与
>>177 知らない人が見たら罵倒でも
CLerには称号なんだよな〜
なんでこんなとんがった言語扱いなんだろう、こんなにも平べったいのに
Scheme 的に while が駄目ってのじゃなくて、 最小限必要な機能の中にはないってことだと思う。 R5RS は言語コアで何でも解決しようっていうものじゃないから、 規格にあるか無いかは筋の良さとはあまり関係がない。 while くらいなら自前で書いても大した手間じゃないから、 それほどポータビリティが損なわれるわけでもない。 while で書くのが自然だと思うなら while で書けばいい。
do「・・・・」
clisp のソースコードを眺めてみたんだけど、なんで C で書かれているの? (最小の?) lisp からのブートストラップで CommonLisp を構築、っていう方向性の実装はありますか?
>>174 shiro さんの format じゃないけど, 普通見るだろ, manual を?
# まぁ unix の man はすりへらなからなぁ
# ls のオプション全部覚えてる人っているのかな?
>>181 SBCL とか Clozure とか。
最小の Lisp からブートストラップと言うより、既存の CL 処理系を使って
ブートストラップする感じだけど、ANSI で標準化されている言語だから
最小に拘る必要も無いのよね。C のコードは少ないから、まあ見てみなよ。
繰り返しはなんでもかんでもloopで書いちゃう癖はどうにかしたい。たまにはdolistとかも使ってやりたい。
do ならschemeでも動く
doで書くと変数を整理しやすい
そういえば、PC9801DOってあったな。
Yes, they do.
Do Do Do, De Da Da Da
ポリスかと思いきやDeってなんですかDeって
『ANSI Common Lisp』の125p.の図8.2の関数seeの定義
(let ((prev `|.|))
(defun see (symb)
(let ((pair (assoc symb (gethash prev *words*))))
(if (null pair)
(push (cons symb 1) (gethash prev *words*))
(incf (cdr pair))))
(setf prev symb)))
参照:
http://lib.store.yahoo.net/lib/paulgraham/acl2.lisp の (prev `|.|) の ` はどういう意味があるんでしょうか?
クオートではなくバッククオートなのはどうしてでしょうか?
直前のpunc関数書き終わって一息ついた所で、バッククォート使ってれば タイピングがはるかに楽だったという事に気付いてorzってなったと見た
「どう書く?」のスパムはいつになったら消えるんだ?
どう書く 問題がいつも無いから見るのやめた
Schemeに関して質問です。 与えられた数と演算子から、リストを狭めるfilter関数を作れと言われています。 例えば(list 3 7 4 1 6)に対して、数字5と演算子>=が与えられれば、リストの中から 5以上の要素だけを抜き出した(list 7 6)を返す、というものです。ここで、 (define (reduce op base L) (cond [(empty? L) base] [else (op (first L) (reduce op base (rest L)))])) というreduce関数を使えと指示がありました。 reduce関数の挙動はLに(list 1 2 3)を入れれば(op 1 (op 2 (op 3 base)))となる感じです。 そこで私は局所関数fを用いて以下のように定義しました。 (define (filter rel_op L t) (local ((define (f n L) (cond [(rel_op n t) (cons n L)] [else L])))) (reduce f empty L)) ……(☆) これに対して (filter >= (list 3 7 4 1 6) 5) と実行すると、 filter関数の挙動は、(f 3 (f 7 (f 4 (f 1 (f 6 empty)))))となるので、あとは関数fに従って(list 7 6)が 返ってくる筈なのですが、(☆)の行で、関数に対して無駄な部分がある というメッセージと共に エラーが出ます。何処が間違っているのか、ご教授頂けないでしょうか。
>>200 ここはSchemeスレじゃNEEEEE!!
というか、Schemeだと関数内関数は、
(define (f x)
(define (aux x)
...)
...)
みたいに普通に入れ子でdefineで定義できるぞ。
というか、そのlocalはどこから出てきた。
>>201 学校で局所関数を用いる時はlocalを使って上のように書く、と教わったもので…
>>202 処理系(コンパイラあるいはインタプリタ)はどれ?
>>206 >local式内で定義された変数、関数などは、そのlocal式の中でのみ有効
本当ですね…括弧閉じの位置が違うせいで、fがlocal外に出ていました…。
解決することが出来ました。本当に有り難うございました。
ちなみにどうして大学バレたし
>>207 次Schemeの質問ここでしたら、Common Lispに改宗な。
国内でScheme教えてて、DrScheme使ってて、独自拡張のlocal文教えてる所なんて、
超レアなんだから、ググったら一発。
みんなやさしいなぁ
>>209 宿題丸投げじゃなくて悩んで書いた事がわかるときはLispスレって妙に親切だよね
あとやっぱりCommonLisp単独でのネタはなかなか来ないからってのもあるのかもね
鳩 < もはや大学の存在理由がわからない。
>>211 Lispの処理系ばっか増えてライブラリー作りを誰もしないからな
勉強がてらログ解析してレポート出力するバッチプログラム作ろうと考えているんですが、Common Lisp の場合、これを自動実行させたい場合、どうやって実行させるのが一般的でしょうか? サーバにsbcl等の処理系入れて、コンパイルしたfaslファイルをおいてcronからコマンドでって感じでしょうか?
SBCLなら、--scriptオプション使うか、 sb-ext:save-lisp-and-dieで実行バイナリ作れば良いよ。
cl-cronっていうのもあるみたいね。 repl上でcron作れるからrepl抜ける必要がないみたい。
> cl-cronっていうのもあるみたいね。
>>214 じゃないんだが感謝。
cron のまがいのものを、必要に迫られて作ってる最中。
day of month で carry が出るときの day of week の処理が、とてもめんどっちい
時系列処理が必要な時こそ 継続とdelayの出番
>>218 cron は、時系列処理じゃないことに留意
# 簡単な例
m 月と n 月の x1, x2 日と毎週 y1曜日とy2曜日に処理する
m と n が連続してればいいけど, してなかった場合, 処理を実行すべき
y? 曜日ってどうやって決定する?
220 :
デフォルトの名無しさん :2010/07/25(日) 04:56:15
>>215-216 サンクスです。規制されてて書き込めませんでした。
cl-cron なんてのもあるんですね。
cl からHadoopっていじれねーかなー 結構Lisp向きのデータ構造だと思うんだが。
>>213 を、昨日は lambdassociates.org に接続できなかったけど今日はOKだた。
たまぁに接続できなくなるのはなんでだろ。
>>223 これからweb検索するのがえらくめんどくさい事になりそうでやだなぁ
>>224 それに映ってるLISPのロゴ入ったノートPCがほしい
これからブログにlispの記事書く時は、ゆのっちネタも必ず書かねば
阿澄佳奈「ブログはxyzzyで書いてます」
〜〜pで質問したらtかnilで答えてくれればいい
×
#t #fで返されたらどーする?
公式サイトは当然weblocksだよな
俺は鷹揚なんでnilかそれ以外で。 このスレにはそんな人が多いと信じていた。
ラジオ 電波 DE リカージョンの開始はいつからですか しかしSchemeスレよりこっちのほうが否定的でないのには驚いた
236 :
デフォルトの名無しさん :2010/07/27(火) 23:53:30
CLで文字列分割したいんだけど、デリミタに文字列指定できる関数かマクロみたことないっすか? split-sequenceもkmrcl:delimited-string-to-list もダメぽでした。
ごめん読み間違えてた。文字じゃなくて文字列で分割か。
伝統に従うとこうなる 阿澄 「coffee-p?」 片岡 「tea.」
あのネットブック、 LISP マシンらしいぜ
244 :
デフォルトの名無しさん :2010/07/28(水) 23:49:07
>>240 おぉ、サンクスです!できました!
参考までに教えていただきたいんですが、こういうのってどうやって調べてるんですか?
245 :
デフォルトの名無しさん :2010/07/29(木) 00:52:17
申し訳ないが今回は単なる勘。まず、正規表現ならそういうのがありそうだと思い、 次に、マッチングする関数を提供するなら、それを使った操作も一緒に提供するだろうと、 cl-ppcre見に行ったらビンゴだった。 普段は、逆引きCommonLispやThe Common Lisp Cookbookを見たり、 適当なキーワードでググったりしてる。
246 :
デフォルトの名無しさん :2010/07/29(木) 01:28:12
SBCLで(require 'xxx)したときのメッセージを抑止する方法ってない? ; loading system definition from /root/.sbcl/systems/jp.asd into ; #<PACKAGE "ASDF0"> ; registering #<SYSTEM :JP> as JP ; registering #<SYSTEM :JP-TEST> as JP-TEST こういうヤツ。
null なストリーム作って捨てるとか出来ないか?
>>244 240じゃないけど、asdf-install や cl-build でありったけライブラリ入れておいて、
その状態のコアイメージ作成する。
で自分の欲しい機能や関数をM-x slime-aproposで検索して探すのがいいんじゃないかな。
>>252 それこのスレの4か5位で復刊してほしいとか言う話があったはず、もっと前スレかもしれんけど
>>252 みつけた
【入門】Common Lisp その3【質問よろず】
352 :デフォルトの名無しさん :sage :2007/08/05(日) 06:57:04
CLOS の良い日本語解説書ってないかな?
bit別冊 Common Lisp オブジェクトシステム -- CLOSとその周辺
というのがいいらしいのだが、絶版で
(p)
ttp://www.fukkan.com/fk/VoteDetail?no=20616 あと、1 桁のところで、復刊リクエストまで行ってないんだ…orz
ちょうど三周年なので記念に購入してきた
井田先生の、復刊に寄せた言葉は収録されるのかな? それともサイトに載せるだけなのだろうか。
地球資源を守れ! みんなの青い星 あと、参院予算委員会をみてるにょ
>>252 昔書泉で見つけて、あの時買っておけば良かったなーとか思ってたけど、復刊してたのか。
そういや、bitも無くなってるんだな。
>>252 CLOSが設計されるに至った経緯の部分は読み物として今も面白いと思うし、
示唆に富む部分もあると思う。
thinlispのドキュメントほとんど消されてて笑った 誰か使い方分かる人いる?
comp.lang.lisp に2004年ぐらいにあがってた thinlisp-1.1.tar.gz というファイルをおもちの方は誰かいませんか?
thinpo
いつのまにやらclisp2.49来てたのね
自分で定義したマクロだけ展開して デフォルトで入ってるloopなどのマクロを展開させないことはできますか?
>>264 そうゆうマクロを書けばええんちゃうの?
つか、なんのための package?
266 :
デフォルトの名無しさん :2010/08/14(土) 11:14:48
test
そうかloopを関数として定義を上書きすればいいじゃん
loopはマクロだ。 何がやりたいのかを説明したほうが、 より良いアドバイスをもらえると思うぞ。
自分で書いたマクロのデバックがしたい
macroexpand-1
プログラムのどこかで大量にコンシングしているようでメモリ使用量が大変なことになっています。 プロファイルのように、実行中のプログラムのどの関数でコンシングが起こっているか調べる方法はないでしょうか。 処理系はSBCLです。
CommonLisp のことはよくしらんが、そのメモリ確保が本当にコンスであることがわかっているのなら、 cons 関数を適当に上書き (再定義) してみるとかってどうだろう。
追記: (profile-soundex) ってところね。
weblocls少し前まではやってたけど最近きかないね
weblocksはドキュメントがほとんどない clはscheme(特にplt)と比べるとドキュメント少ないね ソース読めってことなのかな
CLHSと処理系のマニュアル以外にドキュメントって何が必要なの?
それは単に、Weblocksがドキュメント書くのさぼってるだけだよ。 Schemeのドキュメントが豊富とか全く思ったことがない。 「PLTの」ドキュメントが充実しているだけで、SchemeもCLも似たようなもん。
thinLispのサイトが死んでしまったようなんですが ドキュメントを保存している人いませんでしょうか
同じ質問が前にもあったので、 サイトがとまるのか、DNSが引けないのか そこらへんかね
redirection loopが起きているので連絡してやってくれ。
clispとsbclで挙動が違うのだけど、どっちが正しいのだろう global変数の何かが違うみたい
>>285 どっちも間違ってる可能性もあるし、どちらも規格上妥当かもしれない。
HyperSpecかCLtL2、あるいはANSIを参照するのが一番確実。
あとは、コードとかの具体的な情報を貼っておけば、偉い人が答えてくれるかも。
287 :
デフォルトの名無しさん :2010/09/12(日) 19:33:07
スレ違いかもしれませんが、統計ソフトのRの操作方法やコマンド などをファイルで落とせるとこ誰か知りませんか? あれも、LISPの仲間なので…
>あれも、LISPの仲間なので… 確かにRはアルゴルシンタックスのLispと言えなくもないから、 まったくスレ違いじゃないな。
rjpwikiあたりで聞けばそれなりな答えが帰ってくると思う
Rってマクロあるの?
数学板のRスレ落ちてなくなったのか 最近規制多いからな
kamomeサーバー死亡時の巻き添えじゃね?
aptパッケージで入るのがが /usr/share/common-lisp asdf-installが入れるのが /opt/common-lisp か ~/share/common-lisp clbuidが入れるのが ~/clbuild 同じパッケージのバージョン違いが これらのasdfのpathの中にあるのだけど どうしたものか
clbuild使うならasdfはclbuildで入れられないリボジトリ公開してないの専用にした方がいいし、apt使うならclbuildのdepなんとかっていう依存関係書いてあるファイルからapt経由のを消せばよし
debianとか使ってるなら、common-lisp-controllerを使うのもいいかも。 clbuildをベースにしているみたいなので、使い勝手もそんな変わらないし、 処理系毎に、faslを管理してくれるし。
drakmaで日本語webサイト読もうとしたら化けまくる sbclでない処理系使えばいいのだろうか
make-vectorやmake-char-tableなどで作られた領域をクリア(削除?)する関数は何になりますでしょうか。
>>297 簡単に書けるだろ?
EUC <-> ISO-2022-JP 変換
GR 呼び出しでまかなえなけりゃシングルシフトするだけだし…
>>296 化けてるって、具体的にはどうなってんの?
単に内容がベクタで返ってくるとかでなく?
>>298 何のためにガーベッジコレクタがあるんだ。
要らないなら捨てて新しいの使っとけ。
301 :
デフォルトの名無しさん :2010/09/17(金) 02:58:05
(defun hoge (&rest args) (print args)) とかで出てくる &rest みたいな & 付きのキーワードみたいなものは、一体何者なのでしょうか? 記号がググりにくくてしょうがないので聞いてみました。
optional parametersとかでググってみたらいいよ
タグが閉じてなかったり、いろいろ不備のあるhtmlをsxmlに変換できるパッケージってないのかな
>>303 Scheme なら htmlprag が定番だが、あれってどういう仕組なんだろうな。
CL へ移植するついでに解説してくれ。
306 :
デフォルトの名無しさん :2010/09/21(火) 15:41:33
CLの勉強がてら、windowsのxyzzyをANSI CLにできるだけ準拠するよう拡張したいと思っています。 気になったのはwindowsのxyzzyではCLOSが実装されていないことですが、 xyzzyに実装されているCLの関数やマクロで、 CLOSをなんとかしてエミュレートできないものでしょうか。 どこかの本で、CLOSの正体はCLの基本的な?機能により実装されたものである、みたいなことを見かけた気がしますので。
308 :
306 :2010/09/21(火) 15:49:53
訂正です。 ANSI Common LispじゃなくてCLtL2でした。
オススメの入門書ありませんか? 一冊買って一通りやったのですがプログラム例少なくていまいち直感が掴めません サンプルプログラムが多い本かHPあったら教えてください
その一冊とは何か
Let Over Lambdaのscheme版ってないのでしょうか
>>316 ここはCommon Lispのスレだから、
Schemeの話はLisp Schemeスレでお願いしたいところ。
あと、その質問の仕方じゃ、LOL読んだ人以外、
どれだけ良書知ってても紹介できない。
マクロの応用例が豊富に紹介されてる本ってことでいいの?
というか、伝統的マクロも健全なマクロも本質は同じで、
アプローチが違うだけなので、Schemeでも大抵似たようなことはできる。
318 :
デフォルトの名無しさん :2010/09/22(水) 21:51:30
初めて手を出すプログラム言語がlispってハードル高すぎですか? emacsとSBCLはなんとかインストールしたんですが
気合いの問題。
ハードルというのはやりたいことに応じて高くなるもんで
>>318 プログラミングというものを覚える手段としてなら、
そんなハードルは高くない。むしろ楽な方。
じゃなきゃ、教育でLispなんて使わない。
ただ、とにかく何か作ってみたい、とか思っていて、
それがWindowsのゲームとかだったりすると、
割と茨の道確定。優劣ではなく、適正の問題で。
clispやGaucheでCGI楽しいです
少なくと日本語じゃ、プログラミング初心者向けのlisp書籍やサイトなんてないぞ
あるよ。 CommonLisp か Scheme か Emacs Lisp なら。
>>324 むしろ中間が無い
どちらかというと入門の方が多いかもしれん。
上の方だといつも決まった名前しかでてこないし。
言語の入門書ならともかく、プログラミングの入門書として読めるLisp本なんて Emacs Lispのものくらいじゃないか?
みんなが言っている「プログラミングの入門書」という意味が掴めないけど、
VBS程度しか知らない初心者の俺が今読んでいるのが「初めての人のためのLISP」。
併行して「入門CommonLisp」と
>>315 のサイトで勉強してるんだが、初LISPは
凄く丁寧な説明で納得しながら進む事ができてる。
妙なテンションには引いたけど。実際に動かす為の例題として他2つを使っている感じ。
実は昔、グレアムのANSI CommonLispを読んで挫折してる。
絵的には 「俺が養分になっているうちに皆逃げるんだ!!」 「そう・・・それでいい・・・・ごふっ」
Cでポインタにつまづく人が多いって話を考えると consすらプログラミング初心者にはきついんじゃないかね 理解できないというより必要性を感じられない話題が多く、日常的な場面で役に立つような知識もなかなか出てこない 入門書は軽く十年以上前の本ばっかで環境の差異を自力で吸収しなきゃならなかったりと とにかく必要以上に苦しむ気がする 学校でアルゴリズムやら何やらキッチリ叩き込んでもらいながら、勉強として覚えていくなら Lispは入門用に適してるかもしれんけど 独学者が最初の一歩として選ぶ理由は無いと思う
> 必要性を感じられない話題 > 日常的な場面で役に立つような知識 これが具体的にどういうものであるかによるな
必要性を感じられないとかほとんどのことじゃねーか
Cでポインタにつまずきconsでつまずくなら、Cをやったって苦労は同じじゃないかなあ。 初心者はCよりlispを選ぶべきだとか言いたいわけじゃないが。 どういう言語であれ、最初は短い断片的なプログラムをちょっとずつ動かして 自分なりにいじって遊んで覚えていくと思うんだが、そういう時間的な余裕のない人ということか?
独学の場合、時間よりもモチベーションの問題が一番大きかろ 学者は初心者に対してやたらと、抽象化された純粋な知識ばかり教えたがる傾向があるけれど それを独学で受け止められる奴はそうそういないぞ 簡単で強力なライブラリを豊富に持つ言語で、簡単なゲームや自分用のスクリプトを書けるようになってから それでもなお学ぶ意欲があるならLispって道が一番楽だと思う
昔はBASICで数当てゲームやライフゲームなんか作って覚えていったもんだ
>>336 あの頃に今のCommon Lispがあったら狂喜乱舞したと思う
たとえば
なんとなく名前が想像付きそうな機能を探す
BASICだとわずかな書籍(当時)
CommonLisp ならaproposで一覧 -> describe
目の前の機械からヒントもらえるとか当時はなかったもの。
まぁ今時ならどの言語でもggrksで済むけどな
>>335 >学者は初心者に対してやたらと、抽象化された純粋な知識ばかり教えたがる傾向があるけれど
これって誰がわるいん?
>>335 最初にLispの是非はさておき、純粋な知識だけ教えても退屈、というところには同意。
リストやツリーなどのデータ構造。ソートやサーチのアルゴリズム。
こういったものをそれだけでwktkして聞ける奴ってのは少ないと思う。一種のマニア。
普通は、実際にそれがどう実用的に応用できるか、ってのを聞いて初めてwktkする。
Practical Common Lispなんかは、その点ある程度考えてると思う。
On Lispとかも地味だけど面白い。
そんなもん下手に流行られたら、いらん情報が検索に混じるようになって困る
>>339 Practical Common Lisp、On Lisp
こっちのほうが言語マニアっぽいが…
>>341 とかいってThe Little Lisperの朗読CDとか出たら買っちゃうんだろ?
>>343 曲のタイトルが
普通のやつらの上を行け
とか
百年の言語
ファンクラブの名前はY Combinator
左から、car、cdr、cons 後ろにいる黒いのが lambda
> 必要性を感じられない話題 > 日常的な場面で役に立つような知識 馬鹿に優しくしても馬鹿は馬鹿のまんまだ
まぁ、馬鹿は馬鹿向けのもん使っとけっていうのがいつも繰替えされる結論
勉強順序やモチベーションの議論がなんで頭の良し悪しの議論になっちゃうんだろうか
こんぷー
351 :
デフォルトの名無しさん :2010/09/27(月) 14:08:52
352 :
デフォルトの名無しさん :2010/09/30(木) 09:12:41
SBCLでsetfやdefunで出てくる印字を消すことはできますか?
再帰を使ってリストから全てのペアの組み合わせを探します (a b c d) => (a b)(a c)(a d)......(c d) さっぱりわかりません。どなたか模範解答をください 一応努力の結果を (defun my-pair (l &optional z) . . (if (equalp l z) . . . . .nil . . . . .(progn (if (atom z) . . . . . . . . . . . . (setq z l) . . . . . . . . . . . . .nil) . . . . . . . . . . (setq z (append (cdr z)(cons (car z) nil))) . . . . . . . . . . (print (mapcar #'cons l z)) . . . . . . . . . . (my-pair l z))))
(defun my-pair (lst) (if (null lst) nil (nconc (mapcar #'(lambda (x) (list (car lst) x)) (cdr lst)) (my-pair (cdr lst)))))
模範じゃない例 (defun my-pair (l) (mapcon #'(lambda (x) (mapcar #'(lambda (y) (list (car x) y)) (cdr x))) l))
>>353 (defun comb (set)
(labels ((rec-1 (x list result)
(if list
(rec-1 x (cdr list) (cons (list x (car list)) result))
(nreverse result)))
(rec (list result)
(let ((rest (cdr list)))
(if rest
(rec rest (nconc result (rec-1 (car list) rest nil)))
result))))
(rec set nil)))
再帰と言われたので、再帰だけで書いた。末尾再帰なので最適化可能。
>>353 あと気になったこと色々。
その条件のときだけ何かしたい、って場合は、ifよりもwhenを使う方が意図が分かり易い。
場合で返る値を変えたい場合はif。場合で処理を変えたい場合はcond(condはprogn要らない)。
printしたいだけならconsすると勿体無い。#'(lambda (x y) (format t "(~a ~a)" x y))とかで良い。
新しくコンスセルが作られちゃうので、メモリが無駄になるし遅くなる。
(cons ... nil)ってのはリストを作りたいと思うんだけど、(list ...)で良い。さらに言えば、順番関係無い、
あるいは最後にリストを反転して良いなら、appendは(cons ... list)で良い。pushってのもある。
シンボルの比較ならeqで良い。equalpは色々な物を比較できるけど遅い。
そこでそういう風にsetqするとグローバルな変数が誕生する。letの使用を検討すべき。
実際のプログラムでは、探した組み合わせをどうこうしたい場合がほとんどなので、
どうせなら組み合わせをリストとかで返したい。
以上、分かるところだけ直すと良いと思う。多少は先生の覚えがめでたくなるはず。
あー、消そうとしてて忘れた。シンボルの比較云々は単に勘違い。気にしないで。
359 :
353 :2010/10/09(土) 11:49:58
理解に時間がかかりましたが
>>354 .355.356全てできました
>>357 大変参考になります。皆さんありがとうございました
最近はじめたんだけどSchemeにくらべてずいぶん過疎ですね
いやいや、最近ちょくちょくのぞいてたけどずっと動かなかったから 初心者はいないのかなって
いやまて 過疎ってないSchemeがどれなのかどこなのか聞いてみようじゃないか
書き込みたいタイミングで規制されていることが良くある。
>>359 Schemeも割とそうだけど、Common Lispをガンガン使ってる人って、
あんまり2chには常駐してない。ブログ界隈とかツイッター方面にはちらほらいる。
あとは、ネタ振ってくれれば、反応してくれる人も結構いると思う。
>>363 CommonLispって国内だと園城さんのサイトだけで十分おなかがいっぱいで幸せになれちゃうからね
>>357 > その条件のときだけ何かしたい、って場合は、ifよりもwhenを使う方が意図が分かり易い。
はあ?
英語の語感のもんだいぢゃないの? if when unless
>>365 > はあ?
当たり前の事だけど、君には理解できないの?
>>365 これは恥ずかしい。もしシラフで書き込んだんなら首を吊るレベル。
>>364 kwsk
著作は出てくるけどサイトがみつからない
>>366 もうちょっと詳しく補足すると、英単語としての語感の問題もあるけど、
whenはelse-formが無いから、条件付きの処理という意図を読み易い。
ifはelse-formがあるかどうかで、単なる条件付きの処理なのか、
分岐する処理なのか判断するから、僅かに文意が曖昧になる。
もちろんスタイルの問題であって、汎用的にifやcondを使う人もいるし、
R5RS Schemeなんかにはwhenやunlessは無い。
ASDFはいいんだけど、ASDF-Installとか使ってると、 たまに、作りのad hocさに足を引っ張られて、イラッとくることがある。 そういう意味でもQuicklispには期待する。
FreeBSD 8.1-ReleaseでSBCL 1.0.34を使っています。 テストフレームワークでおすすめのものを教えてくれませんか? 出来ればASDFでインストール出来るものがいいです。
379 :
デフォルトの名無しさん :2010/10/13(水) 08:53:02
ファイルのたとえば10MB目から読み込むような処理ってできますか?
>>379 こんな感じ。もちろんread-byteでもいいし、テキストデータならread-charでもいいし、
文字列に読み込みたいならmake-stringでもいいし、以下略。
(with-open-file (in ".emacs")
(file-position in 255)
(let ((buf (make-array 16 :initial-element nil)))
(read-sequence buf in)
buf))
; => #(#\h #\e #\n #\- #\w #\i #\n #\d #\o #\w #\s #\ #\( #\& #\r #\e)
384 :
379 :2010/10/13(水) 12:49:41
drakmaで日本語ホームページ読みこむとhtmlじゃなくてベクトル列が出てくるんですが、 自動で日本語コード判別してhtmlへの変換なんてできますか?
386 :
デフォルトの名無しさん :2010/10/15(金) 22:10:50
自分で作っちゃえ
>>385 Drakmaは確か、ベースにしているflexi streamsが、
Shift_JISやEUC-JP、ISO-2022-JPに対応してない。
UTF-8、UTF-16、UTF-32なら対応してるんだけど。
で、対応してないexternal formatだとベクタで返ってくる。
自動でエンコーディング判別するのは、
>>386 のが使える。
Gauche由来。GaucheのはMozillaを参考にしたとか昔聞いた覚えが。
うろ覚え。
ttp://lispuser.net/commonlisp/japanese.html で、あとは、SBCLならsb-ext:octets-to-stringとか、
CCLならccl:decode-string-from-octetsとか使って変換できる。
CLikiのnewlispのページが削除されていて(´・ω・`)ショボーン いや、CLとあまり関係ない処理系なんだけどね
それはまぁ仕方ないだろ 面白い処理系なんだけどね
391 :
デフォルトの名無しさん :2010/10/18(月) 08:42:45
イエス、アスミス!
声優オタキモイしね
クダーかわいいよクダー
不動小数点型について質問なんですが sbclで (* (- 1.0 0.6) 1.0) とやると 0.39999998 となります 精度を上げることはできないのでしょうか? CLには四種類の不動小数点型があるそうなんですが デフォルトでどの型を使用するか指定することってでき ないんでしょうか?
>>394 四則演算のプロシージャを再定義したら?
>>395 それってlockされてできないようになってませんでしたっけ?
>>394 (* (- (coerce 1 'double-float) 0.6) 1.0)
気になったから自分もやってみた。@clisp
(format nil "~,20F" (* (- 1.0 0.6) 1.0)) で出るんじゃねーの、とか思ったら、違った... orz
clisp だと、
>>397 のやりかたでも 0.39999998 ってなる。どうしたらいいんだろう。w
>>394 (setf *read-default-float-format* 'double-float)
* (let ((*read-default-float-format* 'double-float)) (eval (read-from-string "(* (- 1.0 0.6) 1.0)"))) 0.4d0
>>394 > (* (- 1.0 0.6) 1.0)
0.39999998
> (* (- 1.0d0 0.6d0) 1.0d0)
0.4D0
CCLだけど、SBCLでも同じじゃない? ANSIでどうなってるかは調べてない。
速度を重要視しない場合、有理数で計算するのもありだとは思う。
>>398 CLISP 2.48でも、全部の精度合わせれば0.4d0になるよ。
> (* (- 1.0d0 0.6d0) 1.0d0)
0.4d0
macports のsbclが壊れたままだいぶ時間がたったが 治りそうな気配がない sbclだけ古いバージョンの入れることってできたかな
バグトラッカーとかないの?
同じバグレポートが2009年ぐらいからされてる
sbclはLinux以外放置プレイだろ。 他の処理系選べよ。
Linux以外でまともに動くコンパイラがこの世に存在しない
なんとなく満開製作所を思い出したw
mankaiほーくす
Modern Kyoto CL からManKai CLなのだろうか
それ確か、速攻で名前の由来聞かれてたな。 みんな考えることは一緒っぽい。
>>407 Macの流儀は知らないけど、適当に/optみたいな場所に手動で突っ込んどけば?
そもそもLisp人口が少ないんだから、自分がメンテナになるくらいの勢いじゃないと、
パッケージシステムには期待できない。
>>418 MacPorts がデフォルトでは /opt/local 以下にインストールされるから
出来れば名前を変えた方がいいかもしれないが、言っている事には同意。
common lispを一から勉強しようと思い、 基本的な処理をスタックベースで実装したいです 竹内先生の本と3imp.pdf(ただしこれはscheme処理系)を読んで大体の雰囲気はつかめたのですが 実際にどこから手を付けてよいのかわかりません。 参考ページはありますか?
Common Lisp のインタプリタを作りたいの?
>>422 ええ、ごく簡単なリスト処理とreplその他をカバーするものを
作ってみたいです
> CAMPUS LIsP Lemon キャンパスリップほそみとかそういうノリか。
426 :
デフォルトの名無しさん :2010/10/31(日) 09:25:44
SICPとOn Lispって、どっちを先に読んだ方がいいと思う? いまはCLを勉強中。まだ基本的なことしかわかってないけど。 schemeはまったくわからん。 ひととおりCLについてわかったら、どっちかに手を出そうと思う。 ちなみに、Lispを使ってきちんとしたプログラムを作る気は (今のところ)ない。 こんなことができるのか!って驚きを得たいってのが動機。
マクロの全てをやりたいか マクロ以外の全てをやりたいか どっち? あとSICPはSchemeなので(事前知識はいらないけど)。
428 :
デフォルトの名無しさん :2010/10/31(日) 09:42:31
>>427 レスありがとう。
マクロがやりたいかどうかより、両方やるんだけど説明が丁寧な方を
先に読みたい。敷居が高いと挫折しそうだから。
429 :
428 :2010/10/31(日) 10:07:07
>>428 の補足
ただ、どちらも敷居が高いことはわかってるんだ。
それでも段階を少しずつ上げていくことができたら、
挫折しなくて済むかなと思って。
文章がわかりにくかったので訂正を
>マクロがやりたいかどうかより、両方やるんだけど説明が丁寧な方を
>先に読みたい。
マクロもそれ以外もいずれやるつもりだから
内容で順番を決めるつもりはなくて、
それよりも説明が丁寧な方を先にやりたいと思ってる。
On Lisp は Lisp 初心者が読む本じゃないよ。 それなりのLisperがより高度なマクロを学んでより高度なコーディングができるようになるための本。 マクロに関する話は (よほど基本的なところを除けば) 順を追って丁寧に記述されてるけど 標準ライブラリのことは当然知っているものとして書かれているから、 基本的なことしかわかってない、という程度の人が読んでも挫折するのがオチ。 SICPは、そもそもプログラミング言語とは何か?的な講義のテキストだから 段階を追って勉強したい人にはそっちから読んだ方が良いと思う。
SICP も On Lisp も根本的には「抽象化」の話だと思う。
SICP は問題の表現の仕方というか、概念的なモデルの組み立て方を教えている。
言語として Scheme を使っているのはあくまでも解説のための記法のような位置付け。
Scheme 自体については大して説明していない。
On Lisp はそのタイトルが示す通り、 Lisp を前面に出してる。
ちょっとだけ Scheme も取り上げているけどほぼ Common Lisp が主役。
概念モデルのバリエーションは SICP で説明されているものよりは少ない。
但し、「Lisp で」表現するための具体的なテクニックを教えている。
>>426 > こんなことができるのか!って驚きを得たいってのが動機。
と、言うことであればどちらかというと SICP かなと思う。
SICP の思いきったパラダイムの転換は驚きが大きい。
On Lisp では現実的な部分からそういった抽象へと繋げようとしている感じがする。
ちゃうよ. SICP は computer science の教科書. たいしたパラダイム転換は存在してないよ. # ただし, ある意味, 書いてある内容は computer science の王道だ ぶっちゃけ, 言語は scheme でなくても OK たまたま, scheme が採用されていただけ(つか, 書いた人が...)
433 :
428 :2010/10/31(日) 22:06:39
>>430 -
>>432 さんアドバイスありがとうございます。
とても参考になります。
話を参考にして考えると、SICPの方が良いみたいですね。
SICPを読みながら、気分転換にCLの知識を増やして
On Lispに臨むことにします。
どうもありがとうございました。m(_ _)m
そしてたぶん最近のSchemeでは *** ERROR: unbound variable: nil となるのにはまる。
nil に #f が束縛されてる手元環境の SCM 5e1 は良い子だぞぉ 多分な
>>433 CLというかLispについては基礎レベルをこなしているって事?
437 :
433 :2010/11/02(火) 20:38:07
>>436 人によっては、基礎できてないやんって思われる程度ですけど。
mapcar関数の使い方とかマクロの作り方(本当に基礎的なレベル)とか
くらいならわかります。
じゃあ入門書の方がいいかもね。 SICP、On Lispよりも先に。SICPは挫折する人も多いらしいから。
439 :
433 :2010/11/02(火) 22:36:08
>>438 そうなんですか。
やっぱ、自分でマクロを不自由なく書けないと、
On Lispは難しいのかもしれないですね。
もう少しCLを勉強したらSICPに臨むつもりでしたが、
CLの勉強を続けてマクロが脳内ですぐに展開、あるいは作成
できるくらいまでやってみることにします。
>>439 on lisp と sicp は対象領域が全く別物
on lisp: common lisp の macro を極めよう!!!
sicp: 計算機科学の教科書
で, on lisp は, しつこく読んで例題やってりゃそのうち何とかなるが
sicp はプログラミングの知識だけじゃそのうちついていけなくなる.
442 :
433 :2010/11/03(水) 16:02:11
>>440 >>441 書き込みありがとうございます。
正直なところ、みなさんに、ここまで親切にしてもらえるとは
思っていませんでした。
>>440 のぞいてみました。
変数捕捉ってgensymで解消するんじゃないの?って思ってたら、
一部にそれっぽいことが書いてあったので、やっぱりそうかと思えました。
あと、意外にサンプルコードが短いですね(もちろん、理解は難しいの
でしょうけど)。
少し臆病になりすぎていた部分に気づけたのは良かったです。
>>441 SICPはプログラミングだけの知識だけじゃそのうちついていけなくなる
というのは、具体的にはどんな知識が要求されるのでしょうか?
それとも高い理解力が要求されるのでしょうか?
>>442 微分方程式の知識が必要になったりとか...
大学 1 年 で要求される他の知識も必要となる.
他のスロットも同時に更新されるstructureのアクセサを作りたいのですが, (defstruct hoge x y) (defun (setf hoge-x) (new-x h) (setf (hoge-x h) new-x) (setf (hoge-y h) (x-to-y new-x))) としても,hoge-yが更新されません. どのようにすれば,他のスロットも更新されますか? 教えて下さい.
445 :
433 :2010/11/03(水) 18:51:45
>>443 微分方程式ですか・・・対象をモデリングするときに使うのですか?
他の本を読んで思い出せば、大丈夫だとは思いますが・・・orz
数学は記憶の彼方です。
ただ一度理解したものなので、マクロの使い方よりは自信があります。
(本当に思い出せるのかは、正直不安ですが)
On LispもSICPも無料で公開されてるんだから ごちゃごちゃ言ってる暇があったら読んでみればいいだけだろ
447 :
433 :2010/11/03(水) 19:02:36
>>446 そうですね。
CLの勉強をしたら、さっそくSICPを読んでみようと思います。
不愉快な思いをさせたみたいで、すいません。
臆するなかれ侮るなかれだ
>>444 defsetf や define-setf-method で定義した setf の方が (setf HOGE) より優先されるんだったような
defstruct がどっちで setf するようになってるかは処理系依存のはず
>>444 classの方でやればできるな。
(defun x-to-y (a)
"Dummy implementation"
(1+ a))
(defclass hoge ()
((x :accessor my-hoge-x :initarg :x :initform 0)
(y :accessor hoge-y :initarg :y :initform 0)))
(defun hoge-x-setter (h new-x)
"Exposed writer for the slot X of HOGE"
(setf (my-hoge-x h) new-x)
(setf (hoge-y h) (x-to-y new-x)))
(defsetf hoge-x hoge-x-setter)
(defun hoge-x (h)
"Exposed reader for the slot X of HOGE"
(my-hoge-x h))
>>450 に補足。
:accessor my-hoge-x の代わりに:wirterと:readerを別に設定するとシンプルにできるね。
>>449 この辺りの過程を規定した自作の structure を作らない限り,避けた方が良さそうですね.
ありがとうございます.
>>450 ,451
ありがとうございます.綺麗に使うことができる様になりました.
教えて頂いた:accessor版を:writerと:readerを使用する様に変更した版です.
(defun x-to-y (a)
"Dummy implementation"
(1+ a))
(defclass hoge ()
((x :writer (setf hoge-x) :reader hoge-x :initarg :x :initform 0)
(y :accessor hoge-y :initarg :y :initform 0)))
(defun hoge-x-setter (h new-x)
"Exposed writer for the slot X of HOGE"
(setf (hoge-x h) new-x)
(setf (hoge-y h) (x-to-y new-x)))
(defsetf hoge-x hoge-x-setter)
>>452 訂正です.
>>452 はSBCLでは動きますが,CMUCLでは動きません.
# 何故SBCLでは動いてしまうんだろう・・・
(defun x-to-y (a)
"Dummy implementation"
(1+ a))
(defclass hoge ()
((x :writer (setf my-hoge-x) :reader hoge-x :initarg :x :initform 0)
(y :accessor hoge-y :initarg :y :initform 0)))
(defun hoge-x-setter (h new-x)
"Exposed writer for the slot X of HOGE"
(setf (my-hoge-x h) new-x)
(setf (hoge-y h) (x-to-y new-x)))
(defsetf hoge-x hoge-x-setter)
度々申し訳ありせん.
さらに,
>>453 を短縮しました.
(defun x-to-y (a)
"Dummy implementation"
(1+ a))
(defclass hoge ()
((x :writer (setf my-hoge-x) :reader hoge-x :initarg :x :initform 0)
(y :accessor hoge-y :initarg :y :initform 0)))
(defun (setf hoge-x) (new-x h)
(setf (my-hoge-x h) new-x)
(setf (hoge-y h) (x-to-y new-x)))
SICPのストリームとambのあたりをCommon Lispで動かすことってできるのでしょうか
ストリームは簡単に出来るだろ。 amb は面倒だと思うが可能。 CPS 変換を手書きする方法と、マクロで隠蔽するヒントが On Lisp に載ってるよ。
CCL 1.6 RC1が出てるから、CCL使ってる人は協力してあげてー。 1.6での主な変更点は、 * ARM対応 * ASDF2対応 * コードカバレッジ機能改良 * cl:loadでネットワーク上のファイルを読めるように * WindowsとLinuxでのクリティカルなバグの修正
LetOverLambdaは無駄な補足説明が多い気がする このマクロはすごいとかLispはすごいとか それはわかってるからこの本読んでるわけで 本題だけを手短に説明してほしい
あの本の目的はクイックリファレンスを提供することじゃないんだから仕方がないだろ むしろLispとかマクロとかの凄さをわかってるつもりになっていて実はまだまだ って層のために書かれたんだろうし。
Common Lisp で外部ファイルにアクセスするにはどうすればいいのでしょうか? with-open-file で出来るのかと思ったら上手くいかなくて… あ、DRAKMA は使わない方法で、です
外部ファイルってなによ。なにがどうなって欲しいのさ。with-open-fileでなにがおかしいのか書いてくれ。 with-open-fileってローカルのファイル操作で、drakmaってhttpとかですよ? 用途が違う。
規格上は Common Lisp にネットワーク関係は含まれない。 「Common Lisp で」というのが処理系の拡張やライブラリ類を含まないとするなら回答としては「出来ない」
>>462 ANSI Common LispはISO Cとかと一緒で委員会言語だから、
標準化の難しい機能まで規格には入れないよ。成立した時代の関係もあるけど。
Cだって、ソケットは、ISO CじゃなくてPOSIXで定義してるでしょ?
あと、何でDrakma使いたくないの? 処理系ごとのネットワークAPIばらばらだし、
基本上位ライブラリ使った方が楽なんだけど。しっかりした理由があるなら聞きたい。
本当は smb/cifs の \\server\export\file でした… みたいな後付設定くるで
ゴクリ、
CLでWindowsプログラミングをしたい人は興味あるかも。
ttp://love5an.wordpress.com/2010/11/14/intro/ Doors:
COMやOLE含むWindows APIのバインディング
LDX:
LisperフレンドリーなDirectXのラッパー。まだ未着手
Virgil:
新しいFFIフレームワーク。DoorsとLDXのベースライブラリ
まだまだ開発中みたい。
でもこういうのって大抵、Windows APIの膨大さで、失踪か放置か開発中止に追い込まれるよね。
結局は使う範囲だけ自分でFFIのコードを書くことになりがち。
>>465 ありがとうございます。レスが遅れてすみません
やはりライブラリを使わないと出来ないんですね。素直に DRAKMA を使います
>>466 何となく DRAKMA 使わないで出来るかやってみようと思いまして
>>467 いやいやいや
>>470 知的好奇心を満たしたい、って話なら、各処理系のマニュアル読めば、
直でソケット触れるAPIがどの処理系にもあるから、読んでみると良いよ。
あとはCとかと同じ。
あと、ライブラリを使わないとできない、ってのはちょっと意味合いが違うというか。
正確には処理系独自の拡張である、ネットワーク機能を使わないとできない。
基本的に、ライブラリで処理系にネットワーク機能付けられる訳じゃないから。
あと、これまた独自拡張だけど、Foreign Function Interface(FFI)を使えば、
POSIX APIでもWinsockでも呼び放題だから、それを使うという手もある。
良くあるパターンは、FFI経由でlibcurlとかへアクセスして、SSL通信するとか。
ただ、手間とか考えると、Drakmaとかを使えるなら使った方が、どう見ても楽。
楽にならなきゃライブラリの甲斐がないしな。
Newton法でsqrtを求めるプログラムなんですが、 (defun sqrt% (x) (labels ((foo (a b) (if (> (abs (- a (* b b))) 0.00001) (foo a (/ (+ b (/ a b)) 2)) b))) (foo x (/ (1+ x) 2)))) (labels ((foo (a b) (if (> (abs (- a (* b b))) 0.00001) (foo a (/ (+ b (/ a b)) 2)) b))) (defun sqrt%% (x) (foo x (/ 1+ x) 2)))) に違いはありますか? disassembleした結果は全く同じだったんですが、宣言を追加したときの 最適化されやすさなど違いがあったらお願いします。
abclってsbclで動くものならほとんど何も考えずに動くのかな
>>473 そういう書き換えが可能だということ自体、環境の独立性を示しているわけで、
違いが出る道理はなさそうだね。もし違ったら危険信号かも。
>>473 comp.lang.lisp辺りで聞いてみると面白そうな気がする。
477 :
デフォルトの名無しさん :2010/11/18(木) 10:47:24
time以外にオブジェクトのメモリ上のサイズを知る方法はありますか?
>>477 あるけど、処理系依存だと思う。常用してる処理系だと、
> (ccl:object-direct-size "abc")
16
> (defstruct foo x y z)
foo
> (ccl:object-direct-size (make-foo))
24
みたいにできる。
479 :
デフォルトの名無しさん :2010/11/19(金) 16:33:18
>>478 なるほど、ありがとうございます。処理系のマニュアルを見てみます。
480 :
473 :2010/11/22(月) 00:00:15
レスありがとうございます。
>>475 「環境の独立性」というのは何に対して非依存なんですか?
>>476 英語はハードルが高いです。
>>473 CPS 変換かけてラムダ持ち上げやると同型の式が得られると思う
>>480 英語っても、複雑な質問じゃないし、短く質問して解答もらったらお礼言うだけじゃない。
規格の隅っこ突付く質問に、2chでまともな解答もらうより、よっぽど楽だよ。
一応、HyperSpecに、
> The scope of the declarations between the list of local function/macro definitions and
> the body forms in flet and labels does not include the bodies of the locally defined functions,
> except that for labels, any inline, notinline, or ftype declarations that refer to the locally
> defined functions do apply to the local function bodies. That is, their scope is the same as
> the function name that they affect.
とはある。引数の所でdeclarationがnot evaluatedともある。だから、labelsがdefunの外にある場合、
内部で(declare (optimize (speed 3)))とかしても、ANSI complianceがきっちりしてる処理系だと、
評価されないかもしれない。まあ、最適化され易さには関係ないんだけど。
ぶっちゃけ、気にし過ぎ。disassembleして結果が違ってから気にすれば良いと思う。
>>480 「環境の独立性」で言いたかったのは、
fooの中の変数が、sqrt%の中の局所変数と束縛関係を持たない、みたいな。
ごめん、言い回しが正確じゃないかもw
>>481 CPS変換ができません。
一旦labelsが消えるんですか?
>>483 except that [for labels, any inline, notinline, or
ftype declarations that refer to the locally defined
functions do apply to the local function bodies].
と節をつくるのでは?
おそらく、
(labels ((foo (x) ...)
(bar (y) (foo y))) ;展開される
(declare (inline foo))
(foo a) ;展開
...)
(flet ((foo (x) ...)
(bar (y) (foo y))) ;展開しない
(declare (inline foo))
(foo a) ;展開
...)
ってことだと思います。
ローカル関数は書き換えができないみたいだし、どっちも変わんないんですね。
>>484 fooも, sqrt%(%)も自分の引数しか使ってないってことですか?
>>486 CPS変換云々ってのは、処理系が末尾再帰を最適化するときに、
そういうことをするってことだと思うんだけど。ラムダリフティングも。
だから、labelsも当然展開されると思うんだけど、違うの?
いえ、無学なもんで. sqrt%をCPS変換するとどうなるんですか?
元のsqrt%が末尾再帰になってるんだから、CPS変換する意味なくない? というかできなくない? labelsの展開とlambda liftingはできても。
末尾再帰しているのはfooですよね? ラムダリフティングはCPS変換で出てきたラムダをグローバルに 名前付けして順序を入れ替える操作、でいいんですか?
だから、lambda liftingするだけで、
(defun foo (a b)
(if (> (abs (- a (* b b))) 0.00001) (foo a (/ (+ b (/ a b)) 2)) b))
(defun sqrt (x)
(foo x (/ (1+ x) 2)))
両方こうなる、はず。俺も
>>481 見て調べた口だから間違ってたらごめん。
あと、sqrt%はCPSだとこうなのか? (defun sqrt% (x k) (labels ((foo (a b k) (if (> (abs (- a (* b b))) 0.00001) (foo a (/ (+ b (/ a b)) 2) #'(lambda (x) (funcall k x))) (funcall k b)))) (foo x (/ (1+ x) 2) #'(lambda (x) (funcall k x))))) (sqrt% 2 #'(lambda (x) (float x))) ;; => 1.4142157
exampleがLISPじゃないorz
JavaScriptで書いてあるじゃん! 手がかじかんで動かないよ! ;; 最初 (defun sum (n) (labels ((f (x) (+ n x))) (if (= n 1) 1 (f (sum (1- n)))))) ;; 自由変数を引数に変更 (defun sum (n) (labels ((f (w x) (+ w x))) (if (= n 1) 1 (f n (sum (1- n)))))) ;; リフティングする (defun f (w x) (+ w x)) (defun sum (n) (if (= n 1) 1 (f (sum (1- n)))))
>>496 ありがとうございます。
表計算ソフトを使ってるときも思うんですが、どうせカッコだらけに
なるんだからLispと同じシンタックスにすればいいのに.
>>492 >>496 結局リフティングするのにCPS変換はいらないんですか?
寝たいのに寝れん。しかも寒い。
>>497 全部自作自演でした……ということはないが、それ両方とも俺だ。
lambda liftingは自由変数をローカル関数から排除する仕組みで、
CPS変換は継続を明示的に渡していく仕組みだから、直交する概念のはずー。
でも、最近の関数型のコンパイラだと大抵は両方やってるっぽい。
499 :
デフォルトの名無しさん :2010/11/25(木) 17:49:15
SBCLで明示的にゴミ集めをする方法が分かりません。 単にどこからも参照されないようにしてからsb-ext:gcを呼べばいいかと思って次のようにしても、topとかで見るとメモリ使用量が減っていないので。 (defparameter object 超巨大なリスト) (setf object nil) (gc) ちなみにSBCL 1.0.34 で環境は FreeBSD 8.0R/ amd64 です。
ゴミ集めしたからと言って、 malloc(3)したメモリをfree(3)で返すとは限らない。
>>499 更には free したからといってそのメモリがシステムに返却されるとは限らない。
最近の BSD は積極的にシステムに返す方針みたいだけど。
BSD を使おうという人ならその程度のことは知ってなきゃだめだよ。
どうでも良いけどLisperって早起きの印象があるなぁ shiroさんなんて夜中の3時とかに何か書いたりしてる、いつ寝てるんだろう
3時って日本時間のか? そうだとしたら shiro さんがいるハワイは8時頃だ
現代のunixのmalloc(3)ならmmap(2)でメモリ確保してるはずなので アプリがOSにメモリを返す事は技術的には可能だが 実際の実装はケースバイケース
505 :
502 :2010/11/27(土) 09:27:33
>>503 べ、別に知らなかったわけじゃないんだからねっ!
ちょっと勘違いしてただけなんだから!
(///)
〃´⌒ヽ
. , -―― メ/_´⌒ヽ
/ / ̄ ´ヽ ヽ
. / , /// ト. ! 、 丶ヽ
l / /(((リ从 リノ)) '
| i l . ヽノ .V l
l ,=! l /// ///l l ねんがんのLISPましんをてにいれたぞ!
l ヾ! ', l ヽ_フ l l
| ヽヽヽ //
l ヾ≧ , __ , イ〃
li (´`)l {ニ0ニ}、 |_"____
li /l, l└ タl」/l´ LISP `l
リヽ/ l l__ ./ |_________|
,/ L__[]っ / /
ttp://twitter.com/#!/nekoallergie/status/8449374745001984
伝説のポケコンか
>>506 いいなぁ、あれ欲しかったんだけど買えなかったんだよ
ポケコンコレクションで欠けてる部分結構でかいんだよな
大文字小文字を混合で使えるCommon Lispは 高価なアレグロしかないのでしょうか
いや、AI-1000はそういうのを期待しちゃダメだw
>>509 どういうレベルで言ってるのか知らないけど、
|aaa|で小文字のシンボルで、|Abc|で混合のシンボル。
エスケープしたくないって話なら、CLISP辺りには普通に機能がある。
>>510 1990年ごろには汎用のワークステーション使ったほうが安くて同じくらいの性能出るよね、
という話になったということなので、SPARCstation 1ぐらいということになるのかな。
>>513 はAI-1000の話じゃなくてLISPマシンの話ね
AI-1000は今のコンピュータに例えると電気釜くらいの性能。
>>513 SPARC機に刺すシンボリックスのワンボードLispマシンあったけどね。
もともと環境が売りなので、性能比べても仕方ないけど。
>>516 CLHS見てみたけど、ANSIにあるんだね。独自拡張だと思ってた。
ACLのModernモードの仕組みってこれ?
cl-yaccのサンプルに '#.*package* という構文があるのですが、なんのためにこんなもの使うのでしょう
マクロの質問です 最終的には↓のように出力するマクロを作りたいのですが、うまくいきません [ foo, bar piyo, hoge ] 文字の部分はformat関数を使って表示させています (defun print-foo-etc () (format t "~A~%" "foo") (format t "~A~%" "bar")) (defun print-piyo-etc () (format t "~A~%" "piyo") (format t "~A~%" "hoge")) 関数版は意図した通り動きます (defun print-test-func-ver () (format t "~A~%" "[") (print-foo-etc) (print-piyo-etc) (format t "~A" "]")) 他方、マクロ版は動きません (defmacro print-test-macro-ver (&body body) (format t "~A~%" "[") `(progn ,@body) (format t "~A~%" "]")) `(progn ,@body)がおかしいようなのですが、どう修正すればよいでしょうか?
すみません書き間違えました `(progn ,@body)ではなく`(progn ,body)でした
>>519 これでどうよ?
(defmacro print-test-macro-ver (&body body)
`(progn
(format t "~A~%" "[")
,@body
(format t "~A~%" "]")))
>(print-test-macro-ver (print-foo-etc) (print-piyo-etc))
[
foo
bar
piyo
hoge
]
>>521 ありがとうございます。
意図したとおりできました。
なるほど、prognをはじめに使うのですね
勉強します
>>519 そのマクロだと、マクロが展開されるときにformatが実行されちゃうので、
意図した通りに動かない。CLのマクロは、マクロ定義を評価した結果のリストを、
単純に呼び出しの所に置き換えるだけだから。仕組み自体はとてもシンプル。
これがSchemeのhygienic macroだと色々ややこしいんだけど。
>>520 それは,@bodyで合ってると思う。
>>522 あと、マクロが上手く動いてない場合、実際に展開してみると良いよー。
というか、展開せずにデバッグするのは難しい。
(macroexpand-1 '(print-test-macro-ver (print-foo-etc) (print-piyo-etc)))
みたいにmacroexpandやmacroexpand-1を使うか、
SLIME使ってるなら、C-c C-mとかすると、新しいバッファに展開してくれるよー。
OSの仮想記憶に頼らずに、自前で仮想記憶みたいなのを実装してる 処理系ってありますか?
今は無いんじゃないかな CP/M時代にはMuMathがやっていたような気がするけど。
527 :
525 :2010/12/05(日) 18:14:47
MuMathってMS-DOS版も売ってましたね。
>>526 WindowsCE上にMaxima載せてrun_testsuite()する野望が…
>>525 cmucl とか sbcl あたりは 自前の仮想記憶を mmap と mprotect で
シミュレートしてる感じ
# thread とかの話が出てくるとややこしくなるけど、基本的にはってことで…
今から関数型言語やるのならLispとHaskellのどっちがいいんだろう
どっちもやってみればいいんじゃね
>>530 もっとも CL は関数型とかいいながら手続き型要素てんこ盛りだけどね…
clojureが、関数型っぽく変化しない値中心に組み立ててあるけど、 haskel,mlと、scheme,clは、それぞれひとつづつ知ってたほうがいいと思う。
CommonLisp はマルチパラダイムだって規格に明記されてる。 Scheme も色んなパラダイムをサポートするよって冒頭に書いてある。 関数型的な性質が中核に据えられてはいるけど、言語として関数型には分類できない。 まぁ、そもそも「関数型とは何か」ってのもそれほど明確な定義は無い。 どちらが良いかという質問に対して正解は無い。 選択があるだけ。
lispもhaskellも仕事は無いんだから 趣味として両方遊べばいいじゃない
536 :
525 :2010/12/08(水) 12:31:32
>>528 HLISPみたいなリストの共通部分の共有って、他の実装では見られないみたい
ですけど、あんまりメリットが無いのでしょうか?
537 :
デフォルトの名無しさん :2010/12/08(水) 12:59:56
例えばクロージャを使おうとすると手続きの中に内部状態を持たせるわけだから、しばしば代入が必要になって関数プログラミング的じゃないよね。 CLOSを使ってるとスロットへの代入がしょっちゅう出てきて関数プログラミング的じゃないよね。
それはクロージャの使い方次第だと思うが
>>536 マルチパラダイム言語であるLispとしては、
破壊代入があるから不都合なことが多い。
540 :
デフォルトの名無しさん :2010/12/08(水) 18:51:54
>>539 破壊代入があるから不都合なことって何?
破壊代入があるから結果としてマルチパラダイム言語になっているんじゃいのか
多分、HLISPのように、共通の内容だったら共用しちゃうと、 意図しない共用が起きてそれを破壊しちゃうことが起きうるので、 破壊代入とハッシュによる共通部分は相性が悪い、とか、 そんなことだろうと思うが。
第四回欧州LISPシンポジウム
http://www.european-lisp-symposium.org/ The purpose of the European Lisp Symposium is to provide a forum for
the discussion and dissemination of all aspects of design, implementation and
application of any of the Lisp dialects, including Common Lisp, Scheme, Emacs
Lisp, AutoLisp, ISLISP, Dylan, Clojure, ACL2, ECMAScript, Racket and so on.
We encourage everyone interested in Lisp to participate.
Lisp方言で、schemeからracketが分離されてる
あと、第四回って最近はじまったのかな
ECMAScriptってw
Land of Lisp で B のヒツジさんを選んじゃったぜ …しかし熱い本だ。初めての Perl を彷彿とさせる
>>543 EuLispが入ってない!って感覚は古いのですか?
それともいとこのISLISPが入っているからよしとすべきでしょうか?
547 :
デフォルトの名無しさん :2010/12/23(木) 01:42:32
WindowsのLispBoxだと、入力した関数の構文が身にバッファ表示され、今から入力する箇所が色づけ強調表示されて便利なんですが、 これってどうやって設定してるんでしょう?
LispBox を使ったことないから知らんけど、 eldoc のことかな
>> slimeとsbclがいっしょにpackageされてるだけじゃなかったっけ? < LispBox
550 :
574 :2010/12/23(木) 14:01:57
>>548 slime-setup の silime-fancy でできました。
>>550 未来からいらっしゃい。
contributeされたパッケージにある、slime-autodoc-modeですね。
SLIMEはデバッガやインスペクタまで揃ってて、慣れると離れられなくなりますぜー。
lispbox(
http://common-lisp.net/project/lispbox/ )のwindows版を入れたらエラーメッセージが出ました
初回起動でまずエラーが出て、一旦閉じて再起動してもまたエラーになりました
; Warning: These Swank interfaces are unimplemented:
; (ACTIVATE-STEPPING ADD-FD-HANDLER ADD-SIGIO-HANDLER DUP EXEC-IMAGE
; MAKE-FD-STREAM REMOVE-FD-HANDLERS REMOVE-SIGIO-HANDLERS
; SLDB-BREAK-AT-START SLDB-BREAK-ON-RETURN SLDB-STEP-INTO
; SLDB-STEP-NEXT SLDB-STEP-OUT SOCKET-FD)
; While executing: SWANK-BACKEND::WARN-UNIMPLEMENTED-INTERFACES, in process listener(1).
;Compiler warnings for "z:/LISPBO~1.7/slime-20100514.151447/site-init.lisp" :
; In an anonymous lambda form at position 1132: Unused lexical variable VALUE
;Compiler warnings for "z:/LISPBO~1.7/asdf.lisp" :
; In PARSE-COMPONENT-FORM: In the call to CHECK-COMPONENT-INPUT with arguments (TYPE NAME DEPENDS-ON COMPONENTS IN-ORDER-TO),
; 5 arguments were provided, but at least 6 are required
; by the current global definition of CHECK-COMPONENT-INPUT
;; Swank started at port: 52781.
52781
?
どうすればよいのでしょうか?
最後に出ている?のあとに何かコマンドを打ち込むということなら
どんなコマンドを入れればいいのでしょうか
>>552 見た感じ、エラーではなく、警告しか出ていない気がします。
一部の機能がサポートされていない、変数が宣言されているのに使われていない、
関数に渡す引数の数が合っていない、という警告が出ています。無視していいです。
その「?」っていうのは、CCLのプロンプトです。コマンドプロンプトでいう「>」と一緒。
そこにLispの式を入力すると、結果が帰ってきます。REPLという環境です。
試しに、「(+ 1 2)」とか「(* 4 5)」とか入力してみてください。
あと、そこからダウンロードできるLispboxが使っているClozure CL 1.5は、 Windowsでかなり致命的なバグがあるので、できれば1.6に更新するか、 CLISPとかの別の処理系を使った方が良いです。 ちなみに、LispboxはEmacsというテキストエディタと、SLIMEという開発環境、 Common Lispの処理系を一緒に配布しているものなので、使い方が分からなかったら、 それぞれの名前でググると情報が色々出てきます。
555 :
552 :2010/12/29(水) 23:03:42
>>553-554 ご丁寧にありがとうございます。わかりました。CLISPを使ってみます。
あとは適当に、
>>556 にもある、
(add-hook 'lisp-mode-hook
(lambda ()
(slime-mode t)
(show-paren-mode)))
とかを追加しておけばいいと思います。
slime-modeというのは、Lispのコードを編集するときにSLIMEがサポートしてくれる機能で、
SLIMEが起動しているときは、lisp-modeになると自動的にslime-modeも実行されるんですが、
この設定だと、SLIMEが起動していないときにも、lisp-modeになったら、slime-modeを実行します。
show-paren-modeというのは、対応する括弧を強調してくれる機能です。
Lispだと括弧をたくさん使うので、コードが読み易くなります。
>>558 文章が抜けてました。slime-current.tgzも解凍してから、できたフォルダをsite-lispにコピーしてください。
多分、普通にEmacsとか使ったことある人な気がするんで、蛇足だとは思うんですが。
clbuild2 でweblocks入れようとした clsqlが入らないのでweblocksのサイトみたら clsql-fluidとかいうのを入れろと書いてあった clbuild2でclsql-fluidを入れようとしたら、そんなアプリないぞと言われる
Let Over Lambdaの人はemacsよりvimを勧めてるけど eclipseにもVisualStudioにもemacsキーバインドはあってもvimキーバインドはない 結局慣れて特なのはemacs
キーバインドよりもカスタマイズの話。 楽に入力できる環境を整えるよりも、 言語の側で下層 (DSL) を作り込もうということ。
lolで書いてあるのは、統合環境はコード生産に集中出来ない(生産性が落ちる)からviでコード生産に集中しろというような内容だったと思う。
構文チェックやコード補完、リファクタリング、デバッグ、GUIビルダーとか必要ない語彙力と簡潔な関数名と簡潔に書ける動的言語が前提だとおもう。 文章書くのに、ワードの補完やTeX、HTMLのタグづけより 真っさらなメモ用紙にアイディア浮かべるのにまず集中しろみたいな感じかな。
>>563 は、lolでvi勧めてる理由の要約なのか
なるほど。そういうもんなのか。thx!
タイピングするのが楽なように、 (DSLを含めて)プログラムを作っていくと、 すっきりした構造になり易いってのは分かるけど、 グダグダなAPIを持つGUIウィジェット使わざるを得ない場合、 ラッピング書くだけで大仕事ですよね。 まあそういうのはある程度割りきってやるしかないけれど。
LispをWEBサイトのフォーム内で実行して結果を表示してくれるサービスってどこかにございますでしょうか?
javascriptという名前のlispもあるが javascript lispでググって
ミスプリすげーと感動した
実用common lispを買ったので windowsにlispboxを入れようとしたら lispboxの配布が終わっていたことに気づきました。 実用common lispではclispのエラーメッセージを示しながら説明しているので、 clisp + slimeの環境をどうにかして入れたいです。 slimeはemacs+slimeパッケージ?というものらしいのですが、 emacsの設定ファイルをどこに置けばいいのかわからず、自力では設定できませんでした。
はい
>>576 以下でOKだったと思う。 Windowsはゲーム以外に使わないので間違ってたらごめん
1. HOMEって環境変数つくってemacsの設定ファイルを格納するフォルダーを指定する
2. 上記ディレクトリに .emacs って名前のファイルを作ってslimeの設定を書き込む
580 :
576 :2011/01/26(水) 12:16:56
みなさん、ありがとうございます。
環境変数のHOMEに.emacsへのパスを追加して再起動しても、
何かうまくいきませんでした。
どこかの設定を変に書き換えてしまったのかもしれません。
>>579 やってみます。
好きなフォルダというと勘違いさせそうなので。 %HOME%を設定する方法でも、%APPDATA%に置く方法でも、 好きな方でどうぞ、という意味です。 あと、どこかの設定を変に書き換える、っていう心配はしないで良いです。 Emacsはレジストリは使いません。初期の設定ファイルもありません。 .emacsなどの設定ファイルでカスタマイズします。.emacsを消せば、最初の状態に戻ります。 付属のファイルを間違って消してしまった、なんて場合を除いて、 おかしなことになったりしません。安心していじってください。
先月末に首になっちゃって、サンデープログラマなんだけど、OS:Ubuntu8.04LTSから10.04LTSへと移行して、emacs22も23へ移行するか検討して、SBCLの環境を作り直そうかな。 Ubuntuも作り直さないといけないし、Slimeの環境ももっと見直さないといけないしなあ。clispだと動かないんだよなあ。 実践ComonLispの付録Aの日本語処理もどうにかして物にしたい。AllegroServeの章もどうにかして英語処理でいいからクリアしたいんだよなあ。なんか途中でうまくいかなくなる。 時間を割くとしても趣味の時間なんであんまり時間を避けないんだけどね。先月末締め切りだった簿記の試験を受けるか、どうか迷って、lispの勉強の方を選んだ。
そっか
首になるのも納得だわ
個人的な、あんまCLに関係ない事情を、CLのスレに書き込みに来る辺り、
あんまり仕事がばりばりできる人には見えない。
他人が話に絡めるような内容でもないし、助け舟を出そうにも、エスパーすら難しい情報量の無さ。
文章の整形も杜撰で、内容も散漫。国語力も怪しい。
Twitterかブログに書いておけば良いのに、と思った。
>>585 じゃないけど。
俺もそう思う。 自分の状況を書いてるだけだもんな。 それが何か? としか反応できん。 何か求めていることがあるのならそれを表現できてないし、 自分のメモでしかなく対話する気がないなら掲示板に書くことじゃないだろ。
lisp本の多くが詐欺ということなんじゃね
そんなこともないだろ。 そもそも LISP を取り上げた本はそんなに多くない。 需要が限られた中にあえて低品質のものを投入したって無駄になるだけじゃね?
死亡フラグだな、家にまず帰れんw
コンパイラ型の場合、lispのマクロってコンパイル時に展開されるの?
>>595 ありがとうございます。
ふと、lispのマクロは関数も使えたからどうなってるのかなと思ったもので。
(※1)マクロやシンボルマクロだけを呼ぶマクロならmacro form
(※2)funcallや関数なんかを含んだマクロならcompiler macro form
※1はトップレベルで展開。コンパイル時でも実行時でも展開可
※2はトップレベルで結果が展開されるとは限らなくてコンパイル時/実行時ともに有り??
2番目というのは※1のことですね
597 :
閃き :2011/02/07(月) 21:59:31
.。o(日本語キーボードは()を打ちにくい) <⌒/ヽ-、___ /<_/____/ \ __ / _ (m) _ ピコーン |ミ| / .`´ \ <⌒/ヽ-、___ /<_/____/ 英語キーボード使えばいいんじゃね? ∧∧ ∩ (`・ω・)/ ⊂ ノ (つノ (ノ ___/(___ / (___/
>>597 その理屈はおかしい、むしろスペース脇にある「変換」「無変換」あたりをhyperシフトにしてhyper+アルファベットで任意の文字を打ち込めるようにした方がべんりだぞ
英語キーボードほどスペースが幅食ってもったいないよ(昔のLispマシンのキーボード的につかおうぜ、109とか106キーを)
>>599 キーサイズ違うようなうろ覚え感があるけど、親指の器用さをうまく使うと入力が楽になるのは本当
手が小さいせいで数字キーの段がめちゃ遠い自分は「無変換(super)+YUIHJKNM,OL.」がテンキーもどきになるようになってる
変換キーはさすがに日本語入力で使ってる
そのようなわけでemacs以外だと1段目のキーを使う入力がめさ遅い orz
(`・ω・)キーボード色々あるのだな、びっくりした (`・ω・)俺は片手キーボードを覚えてみたいぞ
そろそろ括弧の場所を推論してくれるシステムがあっても良いと思う
代わりにオフサイドルールが導入されます
具体的な例を付け足し。つまり、例えば (defmacro add2 (x) (list '+ 2 x)) っていうマクロを定義した場合、コンパイルするとき、実際にlistが呼ばれるってことです。 listはあんまり使われませんけど、mapcarとかloopとか、labelsでの再帰とかは定番です。 それで、上のマクロを使った式は、 (add2 1) ; → (+ 2 1) みたいに置き換えられてコンパイルされます。実行時にはコンパイルされたコードが評価されます。 マクロを変更しても、もう一度コンパイルされるまで、変更の影響は受けません。
>>599 Windows だと ChgKey ってなフリーソフトがある
Unix系だとxmodmapつかえばOK
おいらは, 日本語キーボードのキーマップをむりやりHHK配列にして使ってる
LISPでイベント駆動ってできるんですか?
イベント駆動なんて無限ループとコールバックさえあれば実装出来るんだから 言語に依存しないでしょ。ちゃんとした奴を作りたければ kqueue を使ったり イベント伝播システムとかを実装したりするけど、それも言語に依存しないよ。 REPL 自体がある種のイベント駆動でもある訳だから Lisp はイベント駆動と 相性が良いと豪語する人も居るかもしれない。
なるほど。 ではたとえばC#のdelegateでやるイベントみたいなのは LISPならどうなんでしょうか?
C# の delegate って ObjC の delegate と一緒?
delegate でやるイベントって chain of responsibility みたいなのの事?
何か論点がずれてるような
>>609 が言ってるのは、御約束のイベント処理が決まってる話じゃねぇの?
だとしたら、Lisper は本質的に、*そんなものは好まない*
ごめんなさい。難しいの分からなくて。。。
>>613 中で何をやってるかって分かってれば lisp では別の簡単な方法がいくつでもある
lisp に限らず、コア部分はおそらく
(let ((event (wait-for-something))
(cond
((prop-p a-thing event) ...)
((prop-p another-thing event) ...)
...
てなことを、やってるんじゃね?
event を振り分けるやり方何てのは、いくらでもあるだろ?
そんなわかりきったことならマクロ書けば何でもできるじゃん
ごめん、一文抜けてた > event を振り分けるやり方何てのは、いくらでもあるだろ? だとしたら自分の定義でもかまわないし、 > そんなわかりきったことならマクロ書けば何でもできるじゃん # ちなみに、Lisp の最悪の部分はこの考え方にあるんだけどね # でも、自由度求めようと思うと必要悪
>>614 ああごめん。
>>613 は『論点がずれてる』って所に対するレスね。
>>609 はイベントループじゃなくてイベント伝播について聞きたいのかと思ったんだけどな。
その回答は『決まった方法は無い』で良いと思うよ。
>>616 CL の場合
> イベント伝播
って、普通にコンディションの伝搬でええんちゃうの?
# unwind-protect が言語 coreで 規定されてるので throw しまくるし…
# condition メカニズムなんてこれないと成り立たないし…
# condition に比べても gcc の try ... catch 遅いし…
話が噛み合ってないなw
自分は
>>609 が求めてるのは condition じゃないと思うけど、
それなら何かと言うのは
>>609 にもう少し詳しく聞いてみないと
何とも言えない。
609です・・
たくさんレスありがとうございます。
LISPは数日前にはじめたばっかりなのでよくわからないですが
たぶん
>>616 『決まった方法は無い』けどどうとでもできる。なんでしょう。
C#で典型的な button1.Click += new EventHandler(button1_Click);
みたいなやつです。
メッセージループな方法じゃなくて言語で(delegate)処理するほう。
>>619 そういう時は、コールバックとして実行したい処理を、クロージャにして渡すだけじゃないかな
なるほど。勉強不足でまだよく理解できないんですが できるんですね。 ひとつ懸念が晴れました。 ありがとうございました。
というか、Lisp以外が出来るようになったのがずっと遅い。
CLOSのslot使ったイベントドリブンとか、CellsでCLOS拡張してractiveは、CLOS知らない身からすると、面倒くさいのではないか、と勝手に思ってる。
>>621 おもしろそうだけどweblocksとどう違うの?
そういえばquicklispってclbuildから置き換わる野?
>>625 継続ベースなのはWeblocksと同じ。記述の短さを最優先にしていて、
Arcを強く意識していたはず。リーダーマクロベースのテンプレート機能を持ってる。
永続化はElephant。開発者が日本人。開発は停止してる模様。
Quicklisp登場後は、clbuildはもう過去の遺物って印象。
Quicklispも完全には程遠いし、個人に強く依存してる、っていう弱点もあるんだけど。
それでも、深く考えずに(ql:quickload "foo")で良いのは便利過ぎる。
thinlispを最近のclispで動かそうとしたけど動かなかった どこに質問すればいいんだろ comp.lang.lispとかってこういう質問するのダメなのかな
weblocksのソースってなんでこんなわけわかんないの?
maximaはcvsでうまく動いてるのに なんでgitに変える必要あるんだ
Movitzで動くEmacs(LiCE)のHPが見れなくなってたので 他に移動したのか探したのですが見つかりません。 どなたかご存知ではないですか?
Visual StudioにLISPは入りましたか?^^
今時 Lisp に対応してない IDE ってあるの?^^
WindowsXPだけどLiCE入れ方わかんないやw Movitzはすぐ出来たんだけど。
Movitzって最近どうなん?すげー面白そうなんだけど
Lispって人工知能言語みたいな事言われてますよね?? どんな特徴があってそう言われているのか知りたいです。
代数的データ型のようなものがあると人工知能みたいなこといわれる
その昔Lispが作られたころは、リストのような便利なデータ構造を簡単に使える言語が他になかったので、 人工知能を目的(のひとつ)としてLispが作られたからそう言われてる。
数値計算は得意な言語はあっても、記号処理が得意な言語はそう無かったから じゃないの なにしろ同世代がFORTRANだとかCOBOLだとかなので、Lispはあらゆる意味で高級 すぎて比較にもならないけど、一番決定的なのはたぶんGCだと思う まあ歴史的な話だよね
Lisp が人工知能に向いているっていうよりも当時はその他の言語が人工知能記述に向いてなかった。 今ならその分野で Lisp が著しく有利というほどではない。 古くからの蓄積がある分は有利と言えなくもないけどさ。 Common Lisp とか Scheme とかはクセはあっても普通の汎用言語なので、 人工知能記述のための言語と思っているならそれは誤解だと言っておこう。
>>639 〜
>>642 参考になります。
検索しても人工知能が何とかしか出てこなくて困っていました。
人工知能言語と言われていたのは、
単に、Lispが作られるまで人工知能に向いた言語が無かったからですか。
今は他にも向いている言語が色々あるからそうは言えなくなっていると……
すっきりしました。ありがとうございます。
そもそも「人工知能」という用語を提唱したのがジョンマッカーシー御大本人だったりする
一瞬素で「サスマン? GじゃなくてJだろ」とか思った俺はもう駄目だ。
歴史は権威主義を相対化するためにある 既に終わった権威を蒸し返すためではない
>>647 > 歴史は権威主義を相対化するためにある
何も創りだしたことがない人の考え方だね。
過去の誕生の経緯を知ることは、非常に有益。
>>648 人名、プロジェクト名、大学名を並べただけでは
経緯を知ることも何かを創りだすこともできない、と言っている
>人名、プロジェクト名、大学名を並べただけでは それだけ教えてもらえたら、自力で調べるに事足りるでしょ。 それとも何か、自分で調べる気は全然無いからおまえらもっと詳しく喋れ とでも言いたいのか?
>>647 は何かが気に入らなかったんだろ
俺にはさっぱりわからないから
>>650 もスルーしてやってくれ
Lispはすごいと連発されてるわりに 使ってみるとperlの方がすごいことを再確認するからじゃないかな
perlのごった煮感についてけねえよ〜。 キチガイか神しかつかえねんじゃねえかともっちまうよ。
どんな言語も所詮は道具 活かすも殺すも君次第
perlは出てきたばかりの頃はよく使ったよ、awkより使いやすかったから でもLL言語の選択肢が増えた今は新たに使う意味ほとんど無いと思うぞ Lispの方が継続して使った時の使い心地がいいのはIDE(slime含めて)のおかげと、過去の自分のコードの上に立脚して次が組める事だとおもうのだけどどう? Perlだとその場の問題を解決する小さいスクリプトの方が多くない?
Perlはシェルスクリプトの代わりとしてつかったり、 インストーラーの代わりとして使ったりいろいろだよな〜。 まあ小物っていえば小物がおおいのかもね。
>>655 > Perlだとその場の問題を解決する小さいスクリプトの方が多くない?
CPANできてモジュールが豊富になった後しばらくは、そうでもなかったでしょ。
今はその分野はpythonに席を譲っているが。
pythonはperlにはまだ遠い
perlはフィルタ的なものにしか使ってないな
おれも perl は正直なところ好きじゃないんだけどさ、 テキスト処理の容易さと現実的な速さは、まだ他の言語の追随を許さないと思う。 perl はいきなり書く。python は設計してから書く、という感じ。 Lisp は泥団子だから設計しながら書く。
>>660 Perlはいきなり書いて2ヶ月後に修正しようとしてあきらめる
Pythonはその点後から修正効くけどスタートダッシュはPerlに勝てない
RubyもPythonと同じだけど実行速度が……
Lispは泥団子だから泥まみれになって遊んでたらできてたってかんじ
でどうせなら楽しいのが良いのでLispで書くと周りからメンテできねぇの苦情が……
hunchenrootで作ったサイトを日本の携帯で閲覧できるのでしょうか? racketが全然だめだったのであまり期待はしていないのですが
日本の携帯ったって、各社各機種で事情が様々だと思うんだけど、要件は? 正直、質問が抽象的過ぎて、回答に困る。Apacheで携帯サイト作れますか、みたいな。 というか、そもそもHunchentootは単なるウェブサーバだよ。フレームワークじゃない。 テキストでもバイナリでも、どんな形式のデータでも好きなだけ送り放題だよ。 CL-WHOはXHTML MPに対応していますか、とか、キャリアや機種ごとに処理が分岐できる、 モバイル向けのフレームワークがありますか、とかなら明快な答えがあるけど。
ちなみに、Racketの方は何がどう全然駄目だったの? さらっとマニュアルを見た感じ、携帯サイトも普通に作れそうに見えるんだけど。
>>664 文字コードのせいじゃないのか?
Webサーバの仕様でダメってのは理屈として合ってないからも少し情報だしてみそ
669 :
デフォルトの名無しさん :2011/04/01(金) 22:54:50.98
みんなCLでどんなプログラム書いてるの?
consセルのconsって何の略語なの?
Concatenate Over Nil SEX
高尚過ぎて何がなんだかw
Lisp 1.0のProgrammer's Manualに > The function consw (construct word) is ... とある。アセンブラで記述したconsの下請関数。 ちなみにIBM 704のword。
下記のソースを読んでおります。 (defun fib (n) (if (< n 2) 1 (+ (fib (1- n)) (fib (- n 2))))) この中にあります (1- n) という表現がわかりません。 1-はSymbolなのか、それとも 1 - n なのか・・・。 いまいちよくわかりません。 よろしけれ解説をお願いいたします。
679 :
デフォルトの名無しさん :2011/04/06(水) 15:39:41.44
>>679 Functionでしたか、ありがとうございました。
>>677 なんだかな? ちゃんと読んだ?
ある時間にこれだけの量が放出されたとして、
「その日の気象条件でどれだけ拡散するか?」
って、シミュレーションなんだが
頭のおかしいのにかまっちゃ駄目
コンパクトなLISPの処理系を読んでおります。 #define IS_INT( n ) (((int)n & 0x00000001) != 0) #define CELL2INT( e ) ((int)e >> 1) #define INT2CELL( n ) ((cell)((n << 1) + 1)) 上記のようなコードがあるのですが、整数の有効な桁は符号付31bitとかんがえてよいのでしょうか? また右シフトは処理系によって違うような記述がちえらほらありますが、 符号付整数を右シフトしても符号があるばあいは補完されるとかんがえていのでしょうか?
C言語の仕様書も読もう
一昨日から LISP で CGI を作ってみたくて sbcl 1.0.47 を使い始めました。 HTTP サーバーは lighttpd 1.4.28 で OS は Linux/Ubuntu 8.04 です。 文字セット UTF-8 の自作スクリプトを端末から実行すると問題なく動くのですが、 CGI として実行すると (format t "はろう わーるど") や (set 'x "はろう わーるど") 等 日本語を扱うところで止まって、以降の処理が行われません。 「sbcl cgi 日本語」でググっても解決できる情報を見つけられませんでした。 スレ違いの原因かも知れませんが、CGI で日本語を扱えるようにするには どうすれば良いか教えていただけませんでしょうか。
CGIヘッダを吐いてないとか? とりあえずその自作スクリプトを晒さなきゃ
>>685 > 日本語を扱うところで止まって、以降の処理が行われません。
kwsk
>>685 SBCLみたいなでっかい処理系でCGIだとprocess起動だけでマシン負荷高いからfastcgi使うかhanchentootとか使う方が良いよ
CGIにこだわるならCLISPとかの方が起動軽いのでそっちにするのでもいい
>>686 http://ideone.com/x0fOy スクリプト: 上記 URL の上の方の「source code」
端末での実行結果: 上記 URL の下の方の「output」
CGI での実行結果(ブラウザからページのソースを表示。タグの括弧を全角に書き換え。)
<html><head><title>lisp-cgi-hello</title></head><body>
Hello, World<br />
>>687 つまり「スクリプトの7行目以降が実行されていないように見える」ということです。
ちなみに 7 〜 9 行をコメントアウトして CGI を実行すると
Good-bye, World<br />
</body></html>
も出力されます。
レス、ありがとうございます。
Shift JISで保存してんじゃねーだろうな。 ーは二バイト目が0x5b('[')だが。
反応ないがな… スクリプトをUTF-8で保存しなおせ!
clisp 2.42 でも sbcl 1.0.47 と同じ結果(CGI, 端末共)になりました。
スクリプトの #! を外してもやはり同じ。
C、Python、Ruby で作った同等のプログラムは問題なく動きます。
(1) スクリプトの書き方
(2) LISP(clisp,sbcl) を起動する HTTP サーバーの設定
のどちらかが悪いのでしょうが、LISP は途中まで実行されているので
(2) は考えにくい。
>>690 間違いなく UTF-8 (BOMなし)です。Shift JIS だと端末からの実行でエラーになります。
また、テキストエディタ gedit 2.22.3 も UTF-8 だと判別しています。
1バイト目0x23(#)、2バイト目0x21(!) です。ファイル中に 0x5b のバイトは
含まれてないはずです。
> ーは二バイト目が0x5b('[')だが。
この「ー」はどういう意味でしょうか? なんかココにヒントがあるような気がする。
libhttpdはCGIスクリプトのstderrの出力を取得できないのかい?
なんだろな?と思って、手元のshで実行してみたら、動かなかった…。 でもいろいろエラーが出たから、env LANG=ja_JP.UTF-8 したら動いた。 自分は未だに LANG=ja_JP.eucJP なんだが、これがマズかったらしい。 lighttpd のCGI 実行環境の LANG が UTF-8 じゃないんじゃないかな?とエスパー。 もしそうなら、#!/usr/bin/env .... と書くのは、、邪道かな。
実践common lispの第11章コレクションについての質問です 正誤表が見当たらないので、ここで伺います 11.2 特殊ベクタの説明(p. 125)で >"foo"のような文字列リテラルは、#()シンタックスによるベクタのリテラルと似ている。 >固定サイズであり、変更を加えてはならない。 >ただしMAKE-ARRAYに別のキーワード引数 :element-typeを指定することで、サイズの変更ができる文字列を作れる。 最後の:element-typeは:adjustableの誤記でしょうか?
>>693 HTTPステータスコードによって出力するページを変えることはできるのですが、
例外出力を捕らえることができるのか、まだわかりません。
lighttpd はデーモン化するので端末から起動してもエラーメッセージを吐いて
くれない、error.log にも痕跡はなく access.log もHTTPステータスコードが 200 で
情報が得られない、ので Ruby の WEBrick ライブラリを使った即席の
HTTPサーバーを端末から起動したところ
* sbcl の場合
unhandled SB-INT:STREAM-DECODING-ERROR in thread #<SB-THREAD:THREAD
"initial thread" RUNNING
{AA93BD9}>:
decoding error on stream
#<SB-SYS:FD-STREAM
for "file /media/datum-ext3/local/lib/lisp/tests/lisp-cgi-hello.lisp"
{AA95C19}>
(:EXTERNAL-FORMAT :ASCII):
the octet sequence (227) cannot be decoded.
(以下省略)
* clisp の場合
*** - invalid byte #xE3 in CHARSET:ASCII conversion
のように、端末から CGI スクリプトを起動したときには出なかったエラーメッセージが
得られました。エラーメッセージの意味を充分理解できてないと思いますが
>>694 のご指摘の通りのようです。
http://www.clisp.org/impnotes/encoding.html の
内容はさっぱりわからんのですが、よく読んで解決したいと思います。
ご助言くださった皆様、ありがとうございました。
699 :
695 :2011/04/10(日) 01:01:16.51
>>697 スルーされてしまった…。 orz
そのエラーとほぼ同じエラーが手元で出たから、LANGをUTF-8にしたら解決したよ、って意味だったんだけどな…。
700 :
697 :2011/04/10(日) 02:13:55.62
>>699 もうしわけありません。
ご指摘の LANG=ja_JP.UTF-8 で解決できました。
clisp でも LANG=ja_JP.UTF-8 で問題なく動きました。
また sb-impl::*default-external-format* の値(?)が
端末での実行で UTF-8
CGI での実行で ANSI_X3.4-1968
だったので間違いないのですが、できればスクリプト内から
標準出力への文字セット変更をやってみたかったので
>>694 (clispの情報)を参考にして色々試していました。
今のところできてません。結局 LANG=ja_JP.UTF-8 で
使ってます。以下、続きます。
701 :
697 :2011/04/10(日) 02:15:47.43
(1)
>>699 の #!/usr/bin/env .... を使う
#!/usr/bin/env LANG=ja_JP /usr/local/bin/sbcl --script
( 以下省略 LISP スクリプト )
(2) sh スクリプトに LISP スクリプトを埋め込む
#!/bin/sh
LANG=ja_JP.UTF-8
export LANG
/usr/local/bin/sbcl --noinform --noprint --no-userinit --disable-ldb <<EOT
( 中略 LISP スクリプト )
EOT
(3) sh スクリプトを呼んで、さらに LISP スクリプトを呼ぶ
#!/bin/sh
LANG=ja_JP.UTF-8
export LANG
/usr/local/bin/sbcl --script ほげほげ.lisp
(4)
lighttpd の設定
setenv.add-environment = ( "LANG" => "ja_JP.UTF-8" )
LISP スクリプト
#!/usr/local/bin/sbcl --script
( 以下省略 LISP スクリプト )
(1) は 「#! のコマンドは引数を一つしか扱えない」ので、できませんでした。
(2) (3) (4) は正常に動作しました。
ただ
>>688 での助言に従って mod_fastcgi を使うことを考えると
lighttpd と LISP インタプリタの間に sh が入らない方が良いと思い
今は (4) で動かしてます。しかし、
http://e.tir.jp/wiliki?lighttpd lighttpd では mod_fastcgi と setenv.add-environment は相性が悪い
とのことなので、今後は (3) を使うかもしれません。
スレ違いな内容になってすいませんでした。以上です。
>>698 ありがとうございます。
その正誤表のページはspamにやられたものだったのですね。
納得しました。
Lispスレが落ちてる
Lisp Schemeのスレかい? 1000までいっただけじゃないの??
そろそろ Scheme 単体のスレを立ててみても良いかもね
LISP総合で声優ネタもOKにしたら 落ちないじゃね
980越えると、一日後ぐらいに落ちる 985だった。
磯野〜、校門LISPしようぜ!
racketがドキュメント充実させてきたあたりで schemeのわからないことは検索したら大概わかるようになったのか
TBSのランク王国のコミックtop10を持って 手塚治虫スレに凸するような真似はやめろ
手塚はないだろ 福井英一か一峰大二あたりじゃね?
今日における影響力を鑑みても比較的適切なチョイスだと思ったのに ところでLisp Schemeスレはいまだ立たず LV制限だけならまだしも理由の不明な制限までかかるとお手上げだ
>>705 立てられたみたい。
誰かテンプレ頼む。
おつおつ あれ以上テンプレないよ
Common Lispのセオリー的に3つの値を返す関数を作る場合リストで返すのと多値で返すのどちらがいいのでしょうか? システムの実装にもよるかもしれないとは思うのですがなんかconsいっぱいするの良くないみたいな文献みちゃうと悩んでしまうのです。
cons するっていうのはコンスセルをアロケートする (新しくオブジェクトを生成する) ってこと。 いくつかの値を返すって処理なら、返されたリストから値を取り出したらすぐにコンスセルは要らなくなる。 ほんの一瞬の処理のためにゴミを作って、その分だけ余分に GC が働くのはもったいない。 もちろん、多値の実装にもよると思うけど、一般的には多値を使うんじゃないかな。 でも、そんなのを考えるのは実際にネックになっていることがわかってからでいい。 最初は自分にやりやすいスタイルで書けばいいと思うよ。 そういう試行錯誤がやりやすいのが Lisp 系言語の特徴なんだから、書く前に悩むことない。
新聞のテレビ欄のBSフジのところに「1:00 LISP」とあって ちょっとびっくりした
LISP なのに行番号が振ってあるのかw
>>718 ケースバイケース。consを避けるべき、というのは、
>>719 にもあるけど、性能の事情。
メモリアロケートって、処理が凄い重いんだよ。だから、何百万回とか繰り返す部分で
無駄にconsしてるとボトルネックになる。数十回とかなら全然問題にもならないけど。
迷ったときは、その部分を関数かマクロで抽象化しちゃうと良い。Lispのセオリー。
そうすれば、後でリストと多値を切り替えるときに他の部分を書き換えなくて済むし。
逆に言えば、抽象化してないと、multiple-value-bindに書き換えるのは面倒。
そもそも、multiple-value-bindって名前が、無駄に長くて面d(ry
>>719 ,722
なるほど、理解しましたmultiple-value-bindの値もアロケートの一種だけどリストで返すと少なくとも3つのゴミになるってことなのですね
まともな実装は多値はスタック上で扱う。ゴミはでない。
>>723 >>724 も指摘しているように、multiple-value-bindでは普通アロケーションは起きない。
timeで調べてみると良いよ。loopとかで繰り返す回数を増やしても、
メモリアロケートする量変わらないだろうから。
ちなみにCCL 1.6の場合だと、multiple-value-callに展開されるようになっていて、
関数呼び出しになる。つまり、引数として処理される。
>>721 lispを呼び出す側のコードだと考えれば…w
> multiple-value-bindって名前が、無駄に長くて CLTLの範囲内でもっと長いのなかったっけ?
長いシンボルならもう盛りだくさんだよ。 思い付くのだけでも、define-compiler-macroとかwith-hash-table-iteratorとか、 internal-time-units-per-secondとかな!
パッケージ内に名前閉じ込められるのに長いシンボルがあるのって何が理由なんだろう いや無駄に短いとワケワカメってのはわかるんだけどさ
そのうちひとつひとつのシンボルが文章になるんじゃね
入力するだけなら開発環境が補完してくれるから、 突っ走れるだけ突っ走ちゃったって感じがする。 自分でも、SLIMEで補完しないとやってられない。 たまに端末で作業するとタイピングで死にたくなる。 Haskellみたいに短過ぎるのとどっちがマシなのか。
俺はそのくらい長いのが好き。 (不)定冠詞はともかく複数形はしっかりして欲しい。
boostでは複数形のものも単数で書けってルールがある
最近そっちのほうが多いね。俺は複数形の方が好きだけど。
独眼竜政宗
長くてもいいけど、CL は一部統一されてないのが嫌。 clrhash => clear-hash とか
名前の奇麗な CL が欲しいな
長い関数orマクロ名トップ20 (let (syms) (do-external-symbols (s :cl) (when (fboundp s) (push `(,(length (symbol-name s)) ,s) syms))) (format t "~20{~{~2D : ~A~}~%~}" (sort syms #'> :key #'car))) 使った事あるのset-dispatch-macro-characterしかねえ
SLIMEから長時間のバッチを実行した時の経過が知りたくて、 ループ中にformatを仕込んだのですが、 逐次出力されず、バッチが終了したタイミングで一括表示されてしまいます。 これってSLIMEの仕様でしょうか?
>>740 syslogに出すようにしちゃだめ?
あるいはSLIMEもInferior-lispじゃなくSLIME-CONNET経由でなら別のプロセスのLispになるからそっちのコンソールに出せるのでそれにしちゃえば?
SLIMEっていうよりLISP処理系の方のterminal以外での出力の仕様じゃないかな。 force-output挟めばどの処理系でもうまくいくと思う。 (dotimes (i 10) (print i) (force-output) (sleep 1))
バッファ付き(あるいは)バッファリングI/Oを勉強しといたほうがいいぜ
744 :
デフォルトの名無しさん :2011/05/08(日) 03:52:31.53
ありゃ、Emacsのバージョンアップついでに、slime, auto-complete, ac-slimeを全部最新にしたらslimeでauto-completeが聞かなくなってしもたー。こんな時間になにやってんだかー。
>>741-743 ありがとうございます!
force-outputでできました。
今までこの関数が何のためにあるのかわからなかったんですが、こういう時に使うのですね。
SchemeやっててCLにも手をだしてみたんですが、ローカルな変数ってlet以外じゃ定義できないんですか? 値だけならletで十分なんですが、ローカルな関数を定義したい場合に便利な方法はあるのでしょうか。 Schemeだと(define (foo) (define (foo-aux) ...) <BODY>)って感じで関数内で閉じた関数を定義できますが、 同じようなことをCLでしようとしたら(defun foo () (let (foo-aux (lambda () ...)) <BODY>))とし、 <BODY>内では(funcall foo-aux)などとしなければならないのでしょうか?
747 :
746 :2011/05/08(日) 17:58:40.10
と、labelsなんてものがあるのですね。失礼しました。
&auxでローカル変数が定義できるよ (defun hoge (&aux (local 0)) (incf local)) ローカルな関数はlabelsでもいいけど、fletでもできるよ でもfletだと再帰できないので注意してね
749 :
746 :2011/05/08(日) 21:25:28.13
>>748 ありがとうございます。
Schemeだと関数内では呼び出し元の環境に新しく変数/関数が定義ないようになってるので、
てっきりCLでもローカル変数/関数がデフォルトだと思ってました。
Schemeじゃグローバル変数の初期化とかをinit-xxxみたいな手続き内にまとめることができなかったと思うのですが、
CLならできるんですね。
Schemeから入った人にありがちなパターン。 * internal defineに染まっているのでlabelsを多用する * loopやiterateではなく、labelsでの再帰を選ぶ * keywordでなく普通のsymbolを返してはまる * lambdaに#'を付けても付けなくてもいいことに混乱する * 自分の知らない機能満載の無駄に複雑なformatにビビる
日本語が安心してつかえるのはsbclよりclispなんでしょうか? abclも実質javaだから問題ない?
Windowsでなければどっちでも問題ない。
ac-slimeうごかねー。
CommonLispで利用出来る、標準関数を網羅的に扱っているサイトはございますでしょうか? 日本語のサイトですとうれしいです。
英語ならHyperSpecがあるんだがアレじゃだめなの?
>>750 そういうSchemerのためのCommon Lispガイドがまとまってたら凄く助かる。
今はPracticalCommonLispを読んでるから、序盤でkeywordが出てきて少し面食らった。
(eq ':a :a) => Tだし(getf (:a 1 'b 2) 'b) => 2になるしで、まだkeywordが何か分かってない。
(keywordp 'a) => NILから、:付きのシンボルが何か特別扱いされてるんだなーとしか分かってない。
あと、Schemeじゃマクロはdefine-syntaxでやってたから、defmacroに少しビビった。
defmacroの方がS式->S式の関数だから面白いと感じる。
>>756 750じゃないけど。
キーワードは KEYWORD パッケージのシンボルだね。
CL-USER> (symbol-package '+)
#<PACKAGE "COMMON-LISP">
CL-USER> (symbol-package :+)
#<PACKAGE "KEYWORD">
「パッケージ:シンボル」のパッケージ部分が省略されてる形
でも Schemer のためにはパッケージの説明が要るんだよな
Schemeはプリミティブというか純粋すぎる CLは巨大すぎる で、あいかわらずLisp1.xが好きなのでemacs lispで遊んでる自分
759 :
756 :2011/05/09(月) 23:08:10.48
>>757 パッケージ!そういうのもあるのか!
ttp://www.komaba.utmc.or.jp/~flatline/onlispjhtml/packages.html をざっと読んでみたけど、けっこう複雑だなあ。一番下でsymbolを使うと期待通りの動作をしない例があるけど、それがkeywordを使う理由、でいいのよね?
で、REPLとかで'aって入力すると、実際には*package*にあるパッケージ内で、普通だったら'common-lisp-user::a
が生成される、のかな?画面に表示されるときにはパッケージが省略されてる?
で、頭に:つけると必ずkeywordパッケージにinternするってのはお約束(規格)なのね?
上のuriの項だと`in-package'で新しいパッケージを作ることができるってあるけど、
SBCLじゃ`defpackage'でパッケージを宣言しないといけないのね。
なんかごちゃごちゃしてきたぞ…
>>759 その理解で合ってると思う
scheme でも Gauche は CLer が開発してるから keyword は特別にあつかってるっぽい
> in-packageを呼ぶことで新しいパッケージに「入ることができる」 だから作れるとは書いてない。 defpackageで作っておかなきゃだめだよ
ああ、「新しい」とか書いてあるのが紛らわしいね。
keywordには、自分自身が束縛されているとか、 定数変数になるとか他にも特徴がある。
>>761 作れるってかいてあるじゃないですか!やだー!
訳文の方には
>in-packageを呼ぶことで新しいパッケージに入ることができる.存在していないなら必要に応じて新たに作られる
ってあって、けど原文の方(
ttp://lib.store.yahoo.net/lib/paulgraham/onlisp.pdf )には
>By calling in-package we can switch to a new package, creating it if necessary.
って書いてある。we create the new package if nesessaryっていう意味かな。不覚にも現在分詞でググってしまった。
この文節の後に`defpackage'の説明が出てくるから余計に混乱してしまいました。
765 :
761 :2011/05/10(火) 00:16:25.07
>>765 CLtL1のときは作るんだけど、CLtL2で作らないように変更されたってことかと。
11.7の最初の説明と11.9の例で詳しく説明してあります。 もちろんCLtL2の方です。
maxima(sbcl)で数値計算したら強烈に遅い sbclというよりもmaximaの問題なのかな
TRONコードな処理系も存在しうるわけか 需要や意欲はともかく
>>768 > maxima(sbcl)で数値計算
をするもんじゃないだろ。数式処理をするのならまだしも
maximaのコードはlistをvectorに置き換えれば 結構速い
そんな簡単におきかえられるの!?
自前マクロで展開すればいいんだよ
32bit FreeBSDでmaximaをsbclで使うと Heap使いきったというエラーでとまる clispでは問題なく動くけど遅い
> 32bit FreeBSDで...sbcl 何て無謀な
SBCLはLinuxに注力してる印象がある。 Windowsのスレッドサポートにやたら手間取っていたり、 Mac OSとかでも利用に問題があったりするのを見てると、 開発者はその辺興味ないんだな、とは思う。
つまりMac OSやBSDで速度が欲しい場合はどれ使えばいいのだろう ECL? CMUCL?
>>780 SBCLならOSXで充分に速度出せる。
どんなことするかにもよるが。
macportsのsbclも頻繁に変になる 下手にアップデートできない危険な存在
784 :
デフォルトの名無しさん :2011/05/13(金) 17:45:49.24
lispってCLOS抜きで、引数の型による分岐ってできないの? もしあるんなら、その機能の名前教えて。
ただC++の特殊化みたいな分岐をやりたいだけ。
>>787 できれば、制御文系のやりかたより、オーバーロード見たいに関数追加するだけでいいようなやりかたが
いいんだけど、typecaseを発展させるしかないのかなぁ。
というか何で generic function じゃ駄目なの?
>>789 んー。というか単に独立した機能があるかどうか知りたいだけなんだ。
generic functionと一枚岩で切り離せないというならそれで納得するつもり。
もう一ついうと、ifを使わず分岐を書いてみたいってのがある。 cdrしてnilになったら再帰を止めるとか。
loopのby句がよくわかりません (loop for i in (list 1 2 3 4) by #'cdr collect i) (loop for i in (list 1 2 3 4) by #'cddr collect i) (loop for i in (list 1 2 3 4) by #'cdddr collect i) (loop for i in (list 1 2 3 4) by #'cddddr collect i) それぞれ (1 2 3 4) (1 3) (1 4) (1) が返るのですが、具体的にはどのようなことをしているのでしょうか?
>>792 次の要素にアクセスするために使う関数をbyで指定する。
cdr => (1 2 3 4) (2 3 4) (3 4) (4) nil
cddr => (1 2 3 4) (3 4) nil
>>780 MAC は知らないけど AMD64 な FreeBSD だと SBCL 結構安定してるよ
ports からいれる場合 lutex きっとかないとまずいけど
797 :
デフォルトの名無しさん :2011/05/15(日) 04:12:25.26
slimeのREPLで戻り値の値が赤文字で表示されるんですが、これを変更するにはなんのfaceにセットすればいいんでしょう? 戻り値が多い時に、黒背景に赤文字が表示されると目がちかちかしてしますので可能ならば変更したいなと。
>>797 SLIMEを起動した状態で、M-x list-faces-displayするとfaceの一覧が出る。
そこのslime-*とかsldb-*とかがSLIME関係。
本題だけど、slime-repl-inputed-output-faceがREPLの戻り値のfaceだったと思う。
例えば、
(set-face-attribute 'slime-repl-inputed-output-face nil :foreground "green")
みたいにすると、緑になる。
追記。ちなみに、list-faces-displayはEmacsに組み込みで入ってるから、 追加でインストールしなくても大丈夫。lisp/faces.elに収録されてる。 うろ覚えだけど、Emacs 20.3くらいの時代には既にあったような気がする。
801 :
デフォルトの名無しさん :2011/05/15(日) 11:32:59.33
結局Common Lisp使うならlinuxが一番ということか 仮想マシンで入れるかな
Linuxは大勢使ってるしね。開発者が使ってる環境はやっぱり充実する。 Clozure CLとかCorman LispとかUfasoft Common Lispみたいな例外はあるけど、少数派。 上で挙げたClozure CLなんかも、割と真面目にWindowsサポートしてるけど、 プロファイリングはMac OSとLinuxしか考慮してなかったりするし。
FreeBSD好きなんだけどなあ
Clozure CL って少数派なのか。。。 使ってないけど、成熟した、良い感じな雰囲気があるよね。
>>805 Clozure CL使ってる人が少ないっていうんじゃなくって、
Mac OSが優先される処理系が少数派って意味。誤解させたなら悪かった。
実際にはSBCL>>Clozure CL>CLISP>以下略って感じみたいだよ。
ttp://xach.livejournal.com/271794.html CMUCLと同じくらいの歴史もあるし、使ってて良い処理系だと思う。
最適化こそSBCLに及ばないけど、機能面では充実してるし。
Mac OS Xは実行形式がちょっと特殊なんで、 ネイティブバイナリを扱う処理系のポーティング/維持は結構面倒。 コンパイラとかメモリダンプとか。
809 :
デフォルトの名無しさん :2011/05/16(月) 20:57:30.61
会社PCが64bit Win7だから、Lisp環境作るのに苦労してるわ・・・
windowsで簡単にlispを使える導入ソフトでもあればいいのにね linuxでの開発者がおおいせいか、windowsが軽視されている気がするよ
つ virtualbox
>>811 そりゃあねえ……
>>812 そんなものがあったのか
知らなかったわ
早速手を出してみる
>>808 OSXで言語環境とかになると、ややこしいことやるより
ぶっちゃけUNIX用のソースからコンパイルしたほうが楽だったりするね
バイナリパッケージあるやつならそれで良いんだけど
>>814 thread 周りが pthread 実装のみに依存してればな
linux MacOS Windowsは誰かやりそうだけど FreeBSDはやっぱり今後も放置されたままな予感
freebsdを捨てましょう か
Be free from FreeBSD
820 :
デフォルトの名無しさん :2011/05/17(火) 16:13:26.39
Solarisも比較的多くの実行環境用意されてるけど、いまいちなのかな?
>>817 sbcl-devel みてると結構やってるっぽい
つか、lutex 使わなきゃ、thread 実装も安定してるって
あれだけ言ってるのに
>>820 CCLをSolaris(OpenIndiana)でしばらく使ってみようと思ってる。
サードパーティライブラリの使いやすさを考えるとSBCL何だが、 Linux以外スレッド動かないのがいたいのー
>>823 だからFreeBSDでもthreadは動くと何度言えば...
lutex使わなくてもthreadは動作してくれる
ついでに言えば、Windowsでもスレッドサポートブランチのマージについて、 昨年の暮から話が出てる。
cl-ppcre で改行を置換したいんだけど、 \n じゃだめ?上手くマッチしないお。
>>827 (ql:quickload :cl-ppcre)
(defparameter *string* "a
b
c")
(ppcre:regex-replace-all "\\n" *string* " ")
;; => "a b c", T
エスケープなしで\nとかを使いたい場合は、CL-INTERPOLとかを使えばできるはず。 ただ、CCLを使っている場合は、SLIMEでCL-INTERPOLが使えなかった気がするので注意。 スレッド作成時のリードテーブルの継承の仕組みの関係だったと思うけど、うろ覚え。 また、別解で、cl-irregsexpを使って (cl-irregsexp:match-replace-all *string* (#\newline " ")) みたいに読み易くもできるけど、こっちはドキュメント無しな、いつものJohn Fremlinクオリティ。
>>827 ありがとうございます。
自分もそれでとりあえずは逃げましたが、かっこ悪くなっちゃいますよね。
>>829 ありがとうございます。
CLの弱点はやっぱりドキュメントですよねぇ。特に私みたいな初心者には。
ソース見ろって言われればそれまでなんですが・・・
>>830 正規表現を文字列で渡すから仕方ない。この辺Emacsを連想するよね。
この辺を良きに計らえるのがリーダーマクロなので、気になるならCL-INTERPOLをどうぞ。
一応、cl-irregsexpはユニットテストのコードが付いてるので、推測しながら使うことは可能。
t/以下にある。というか、彼のコードは非常にトリッキーなことが多いので、正直読みたくない。
今CLでGUIを使おうと思ったら何がいいの? cl-xxxみたいな既存のライブラリのバインディング系と、 CLIMとかCELLOとかの、よりLISP的にGUIを扱えるものがあるみたいだって分かったのだけど、 後者で今アクティブなのはこれ、ってのはあるのかな? できればCFFIでほとんどむき出しの他言語ライブラリより、もうちょっと綺麗にラッピングしてある方がいいなあと思ってるんだけど、 「今自分はこれでGUIプログラム書いてるよ!」ってのがあったら教えてくれると嬉しいです。
GUIは情報すくないよね。 WEBじゃだめかい?aserve, hunchetoot, weblocksとよりどりみどり。 Clacksを使ってみたいけど、Tutorialがずっとメンテ中・・・
CL-GTK2で
835 :
uy :2011/05/23(月) 15:05:50.81
LispからWinAPIとDirectX使いたいです
836 :
uy :2011/05/23(月) 17:25:58.09
やっぱいいや
setに対するsetqのようにfsetに対するfsetqを書きました。 (fset 'my-plus2 '(lambda (n) (+ n 2)))を (fsetq my-plus2 '(lambda (n) (+ n 2)))こう書けるようにする。 (defmacro fsetq (name lst) `(fset ',name ,lst)) まずこう書きました。うまく動いたので、次はバッククオートではなくクオートで書いてみようと思いました。 (defmacro fsetq (name lst) (list 'fset '(identity name) lst)) こう書いたのですが、うまく動きませんでした。nameが評価されるのが、スコープの外になるからでした。 すべきことはこれだと思いますが、どうすれば出来るのか分かりません。 ・nameにはmy-plus2が入っている ・nameの中身を引き出し、それをquoteする つまり`(',name)←これなのですが、これをバッククオートなしに実現するにはどうすれば良いのでしょうか? emacs lispで書いています。
>>838 なんでバッククオートを嫌うのかイミフ
(list 'quote name) かな?
cl-ppcreで末尾マッチは$ではない? PHPで書いたプログラムをLISPに移植してるんけど、 正規表現がことごとく動かない。
cl-ppcreのマニュアルの*allow-quoting*とかのあたりの説明を参照すると良いかも。
>>839 ああ!(list 'quote name)でうまくいきました。
あれこれ試したのですが、なんで分からなかったのだろう。
`をlistと'で置き換えられるのかどうか試していた所でした。
レスありがとうございました。
cl-ppcreは罠ライブラリだから使うのヤメレ。 Perl互換の正規表現といってるが、まったく互換性ないから。
>>840 他の言語で当たり前にできることがまともにできないのがLispのウリですし。
LISPはそういうマゾ環境下でのバッドノウハウと、
過去の歴史を懐古して楽しむ貴族の言語だ。
だからLISPは美しいとかよく紹介されてるだろ?
これは芸術であり実のあるものじゃないんだよ。
そりゃそんなこと言って気取ってる内は何もできるようにはならないな
だからLispは何もできないじゃんw
そんなお前らにCojure
cl-irregsexp使えって。
iron-schemeって有料??
>>832 ql見たらlambda-gtkなんてのが出てるね。
swankをリモートサーバに立てて、別マシンからslime-connectってできるのかな? 探してみると、sshでポートフォワーディングして接続してるケースは見かけるけど、 swankをlocalhost以外で待ち受けさせる方法はないように見えるけど。
In swank.lisp, この辺変えてみれば? (defparameter *loopback-interface* "127.0.0.1") (defun setup-server (port announce-fn style dont-close coding-system) (declare (type function announce-fn)) (init-log-output) (let* ((socket (create-socket *loopback-interface* port)) ;;;略
>>851 Windows+clozureで使ってるので、cl-interpolはコンパイル失敗して使えなかったので使ってませんでした。
VMのLinux+SBCLだと動いたので、こっちで動かすことにしてみます。
ありがとうございます。
>>853 素晴らしい!できました!
ただリモートにすると、M-.のソース展開ができなくなっちゃうんですね。
動作確認用にとどめておきます。
quicklispでライブラリ大量に読み込んだら、 # Test: return pathname ok 15 ok 16 ok 17 みたいなメッセージが出るようになっちゃったんですが、 これって何ですか?
丁寧なドキュメントが存在するCL-PPCREではまる相手にcl-irregsexp勧めるとか、 お前らどんだけサディストなんだよw
>>856 何かの拍子に、どこかのライブラリのユニットテストでも実行してるんじゃないの?
grepで~/quicklisp以下を検索してみたらどうだろう。実害無いなら放置しといて良い気がする。
>>840 (ql:quickload "cl-ppcre")
(ppcre:scan "^abc$" "abc")
;; => 0, 3, #(), #()
(ppcre:scan "z$" "abcdefghijklmnopqrstuvwxyz")
;; => 25, 26, #(), #()
>>861 これも入れておいて。2回エスケープしないと駄目ってことに気付かず前にハマった。
乗数を取り出す
CL-USER> (cl-ppcre:register-groups-bind (foo) ("\\^([0-9]+)=" "2^10=1024") foo)
"10"
カッコ内の文字を取り出す
CL-USER> (cl-ppcre:register-groups-bind (foo) ("\\(([0-9]+)\\)$" "math(85)") foo)
"85"
ごめん、乗数じゃなくて指数ね。
>>862 ナイスすぎる。
これ世界初のまともな解説文章じゃないかw
整形してコメントも付けたから、今度からCL-PPCREの使い方が分からんときは、
>>861 を読んでくれ。
例が足りんかったら自分で付け足すか、これを追加して、ってのを書いてくれ。
CL-PPCREのAcknowledgementsによると、その辺の実装に強い影響受けたらしい。
871 :
デフォルトの名無しさん :2011/05/25(水) 22:29:46.99
質問 lambdaって関数返すってのは解るんだけど。実態は何返してんの? 多分何らかのS式か、関数の実体を指す識別値(オブジェクト)なんだろうけどどんな形よ?
CL-USER> (lambda (x) (+ x x)) #<Anonymous Function #x210372233F> CL-USER> #'format #<Compiled-function FORMAT #x10009114F>
なるほどそうやって表示できたわけね。ありがとう。
hunchentoot でサーバサイドでのセッションの取り扱いサンプルってどっかにないかな? いまいち公式読んでてもよくわかんないんだよね。。。 やりたいのはサーバサイドで生成したリストをページをまたがって保持していきたいんですが。
>>874 (start-sesisoin)してから
(setf (session-value :symbol ) assignvalue)
あとは (sesion-value :symbol)でアクセスできるから普通のWebプログラミングと変わらない
寿命とかは適宜ggってくれ
>>875 さんく
create-sessionして、その戻り値を使うのかと勘違いしてた。
paul grahamのansi common lisp本の質問です 翻訳本の 3.8ツリー(p.36)の「car部は右側下位ツリーを、cdr部は左側下位ツリーを示す。たとえばつぎのようなリストは……」 という説明に出てくる「左右」は、p.37の図とは逆では無いでしょうか?
>>877 書籍に依存する質問だと、持っている人しか分からないから、
引用ということで、図だけ画像化してアップロードしたり、とかしないと、
回答付きにくいと思う。
んで、本題。amazonで本文検索してきたけど、そちらの考え通り誤植みたい。
原書のerrataには載ってなかったから、訳書だけの誤植の模様。
atom pub のライブラリってないっぽいかな? CLからブログに投稿したかったんだけど、Drakmaでごり押しするのか。。。
CL開発で一つのプログラムを複数ファイルに分割するのって、 defsystem で定義して、asdfで読み込むのが普通?
>>881 普通。require/provideはANSIではdeprecatedだし、ASDFが事実上の標準。
Cでみんなmakeを使うみたいに、CLではみんなASDFを使う。そういうノリ。
ただ、ASDFを使わずに自分で管理することもでもできない訳じゃない。
各ファイルを全部自分でコンパイルした上で、読み込む順番に注意しながら、
loadで読み込んだって良い。
requireなくなってしまうのか
>>883 「なんどもなんどもなんどもなんども deplecated だと言ってるのに誰も従わない」
ってな事がどっかに書いてあった記憶がある
# んだが, どこで読んだっけ >自分
ASDFはちとめんどくさいのがアレだ ClojureのLeiningenみたくもちっと簡単なのないのだろうか
>>884 require /provide が deprecated って事は、
現状って、同様の機能の規格標準が無いってこと?
>>886 知らなかった quicklisp
asdf-install より、楽かな。
elpa といい、lisp 界隈の人も cpan 的なものに
目覚めたのかな?
>>886 コレいいね
ASDFは何でもかんでもできるかわりに最初の手当がめんどいので苦手だったんよ
>>890 まだベータだし。
ところで XML を扱うライブラリの標準ってある?
SLIMEでC-c C-kしてバッファをコンパイルするとたまに error in process filter: end of buffer とか出てロードできない時があるけど、いまいち原因がわからないんだよね。 C-c C-c でS式ごとにコンパイルすれば問題なっしんぐ。
>>878 遅くなりましたが、ありがとうございます。
納得しました。
お、やったじゃん。
おぉ、後はチュートリアルをw
早くWinのSBCLでスレッドサポートしてくれないかなー。
>>893 処理系から意図した応答が返ってきてないとか?
*slime-events*とか見れば手がかり掴めるかもよ。
>>899 おー、これいいな。
ちと試してみるか。
CLのスレッドってみんな何を使ってる?
@doc ってなに? パッケージのソースを追っていると、たまに見かけるんだけど、 検索しても明確な情報が出てこなかったので。。。 (defun hoge () @doc " comment " なんて形で使われてるんだけど、あっても無くても違いがよくわかりませんでした。
On Lispの最後にある状態遷移マクロ等は パッケージ化されてないのでしょうか
>>905 On Lispにそんなのあったっけ?
最後ら辺っていうと、CLOSとパッケージがおざなりに紹介されてた覚えしか無い。
Debian系ならonlisp-codeってパッケージをapt-getすれば 本文とASDFで読める形にパッケージし直したコードが手に入る .debをダウンロードすればDebian系でなくとも手に入る
サーセンw興味のない機能への、あの投げやりっぷりが印象深かったんだよw そういや、ATNとかあったね。今ググったら、萩谷教授のUIについてのエッセイとかが引っ掛かって、 DFAとかATNのUIへの応用とかが書かれてて、勉強になったわ。今だとあんまり聞かない気がするけど、 どこかで応用されてたりするのかね?
あそこは継続、マルチプロセス、非決定性と来て、 その応用としてATNパージング、さらにPrologと来て、凄く面白いところ。 こういう流れのいい本読むとやっぱりLisp(というかS式?)はいいなあって思うね。 最後のOOの章はまあ書かんとまずいかねって感じだね。
onlispの単に写しただけなのは 最近のCLで動かないぞ
Debianのは動くようになってるんで、
>>909 の人も勧めてるんだと思います。
onlisp.lispの最初のところにあれこれ書いてある。
Debianによる配布については、copyrightファイルに、
Paul Grahamの許可のメールが載ってる。
問い合わせとパッケージ化してくれたのはKevin M. Rosenbergさん。
現在英語で書かれた教科書でschemeを学んでいます. そこで練習問題として Write predicates free? (respectively, bound?) that detemines if an expression contains a free (respectively, bound) instance of a particular variable. という問題がありました. 特定の変数の独立したインスタンスを含むかどうか判別する述語free?を作れという文章だと思うのですが,どうでしょうか? また,その場合free?をどう作れば良いのかわかりません. どなたか方針だけでも お願いします.
920 :
918 :2011/06/07(火) 20:23:04.06
>>919 そのようなスレがあったんですね
誘導ありがとうございます
("data=1") みたいなリストを、 (:data "1") みたいに整形する事ってできますか?マクロを使わずに。
Quicklisp使ったらまずかったかな? (ql:quickload :split-sequence) (defun conv (list &aux acc) (dolist (data list (nreverse acc)) (destructuring-bind (fst snd) (split-sequence:split-sequence #\= data) (push (list (intern (string-upcase fst) :keyword) snd) acc)))) (conv '("data=1" "data=2")) ;=> ((:DATA "1") (:DATA "2"))
>>921 マクロはコンパイル時のコード変換だから、こういうのとはあんま関係ない。
定数じゃないと無理だし。
(ql:quickload :cl-ppcre)
(destructuring-bind (k . v)
(ppcre:split "=" "data=1")
(cons (intern (string-upcase k) :keyword) v))
(ppcre:register-groups-bind (k v)
("(.*)=(.*)" "data=1") ; ひどくいい加減な正規表現
(list (intern (string-upcase k) :keyword)
v))
(ql:quickload :cl-irregsexp)
;; パターンの表現に癖があるので、詳細は逆引きCommonLisp参照
(cl-irregsexp:match-bind (k #\= v) "data=1"
(list (intern (string-upcase k) :keyword) v))
>>922-924 ありがとうございます。
internという関数があるのですね。
文字列 キーワード 変換 とかでググってもわからなかったので助かりました。
キーワードは特殊なシンボル
cxmlでfeedを読み込んでデータを抽出する方法が全くわからん・・・ S式形式でパースするとアクセスがひどく冗長的になるので、 DOMでやろうと思うのだけれどドキュメントが無くて手詰まり。 どっかにサンプル無いですかね・・・
あと、S式形式でのアクセスが冗長というけれど、ケースバイケースだと思うよ。 S式にしてしまえば単なる木構造になるわけで、リスト操作の関数が使える。 mapcarとかreduceとか使いたい放題だし、child-nodesとか使わずに済む。 XMLS形式なら確かcddr。 S式じゃないにしても、STPならmap-childrenとかdo-childrenとかあるし、便利。 DOMは小回り効かないからあんまお勧めしない。
すいません>< まったくの初心者なので質問させてくださいorz 次のリスト構造をconsセルを用いて表してください。 1 (a b c) 2 ((x y)(u v)) 3 (a (b (c))) 次のconsセル構造に対応するリストを書いてください 1 [1| -] →[2| -]→[3| -] 2 [. | /]→[. | /]→[hi | /] lispの基本的な問題らしいのですが、 プログラミング初心者のため、わからず困っています。 どの問題でもいいので、ご存じの方いらっしゃいましたらよろしくお願い致します。
ちなみに、これはLisp以外でも、とてもよく使われるデータの形。 「線形リスト」というものの一種で、「片方向リスト」と呼ばれる。 プログラミング言語の授業取った(=プログラミングに興味がある)なら、 覚えといて絶対に損はないぜー。
>>930 どうでもいいけど後半の1と2は回答しようがないな
問題を写し間違っているんだろうけど
2は(cons (cons (cons hi nil) nil) nil)じゃないかと予想。 1は謎。関係ないけど、「-]→」って表現にはちょっと感心した。
>>935 なるほど
carから矢印が伸びていたわけね
>>929 racketのS式と互換性あるといいんだけどなあ
racketは不正なhtmlでも変換する
Closure XMLなら、パーサに自前で定義したハンドラを渡せば、 好きなデータ構造を作れるようになってたと思う。
えー
寿命短すぎ パロディ処理系すら作れやしない
プログラミング言語Asumis
アスミスが死にそうだからな
CLのスレッドって検索してもあんまり情報が引っかからないんだけど、 そんなに使われているモノでもないの?
SLIMEとかHunchentootとか、普通にみんな使いまくりだと思う。
ac-slimeを導入してみたら補完のタイミングでエラーこいてデバッカが起動するようになっちまった。
CCLってSBCLみたいに大量のライブラリを読み込んだイメージ作れないのかな? 起動が速くなるし、aproposでもかなり重宝してたんだけど。
(defun top3 (a b c) (format nil "top3 is ~A, ~A, ~A" a b c)) ; リストのカッコを外した物を引数にしたい (setq are 'grape args '('apple 'orange are)) (top3 ,@args) ;こういう要領で (top3 'apple 'orange are) ; こう変換したい ; => args is APPLE, ORANGE, GRAPE (eval `(top3 ,@args)) ; 実装するとこうなりました evalを使うのはどうかと思ったのですが、もっと良い方法はあるのでしょうか?
>>951 (apply #'top3 args)
ほらよ (defmacro rm-parens-apply (f arg) (funcall (funcall ((lambda (x) (lambda (y) (lambda (z) `(,x ,@(funcall y z))))) f) 'symbol-value) arg)) (rm-parens-apply top3 args)
954 :
952 :2011/06/28(火) 02:50:50.03
>>951 ごめん、結果見直したら、希望と違ってた。
>>953 変数名にx,y,zという無意味なものを使うな。あと改行入れろ。
(defmacro rm-parens-apply(top3 args)(funcall
(funcall(funcall(lambda(top3)(lambda(symbol-value)
(lambda(args)`(,top3 ,@(funcall symbol-value args)))))top3)'symbol-value)args))
(rm-parens-apply top3 args)
956 :
951 :2011/06/28(火) 23:31:40.31
皆さんレスありがとうございます。なるほど、そうすれば良かったのですね。 変数名と改行に気をつけてこう仕上げました。 ( defmacro rm-parens-apply ( args top3 ) ( funcall ( funcall ( funcall ( lambda ( args ) ( lambda ( top3 ) ( lambda ( symbol-value )` (, symbol-value ,@ ( funcall args top3 ) ) ) ) )' symbol-value ) top3 ) args ) ) (defun top3 (a b c) (format nil "top3 is ~A, ~A, ~A" a b c)) (setq are 'grape args '('apple 'orange are)) (rm-parens-apply top3 args) ;=> "top3 is APPLE, ORANGE, GRAPE"
ワロタw
すまねぇ仙人の皆、俺には
>>956 がLispに見えない。
もっと別の、おぞましい何かにしか…
Lisper的にはPythonのブロックインデントは有り?無し?
オフサイドルールっぽいけど、全然違う所も評価高いな。
>>958 pass って書くのめんどいから ) がいい。
963 :
デフォルトの名無しさん :2011/06/30(木) 05:55:58.43
Linux Lispbox設定方法知ってる方いますか?
Lispboxって設定なんもいらんだろ?
965 :
デフォルトの名無しさん :2011/06/30(木) 06:20:43.51
↑うまく起動できないもので
>>965 ダウンロードした Lispbox はどれで
使っている Linux は何?
つーか、Linuxならパッケージマネージャで環境整わない?
わるいこといわん lisp cabinetにしとけ
そういうときは、行った操作とその結果(エラーメッセージなどの状況)を教えてくれないと、 誰も答えようがない。 ダウンロードした場所、インストールのときに行った操作、どうやって起動したか、 そしてその結果、どのようにうまく起動できなかったのか。例えば、エラーメッセージが出るとか、 エラーメッセージすら出ないとか、コアダンプするとか、そういった情報を書いてくれ。
969 :
デフォルトの名無しさん :2011/06/30(木) 07:01:01.18
Lispbox-0.7 Vine Linux4.1
Lisp CabinetってWindows専用じゃん。
971 :
デフォルトの名無しさん :2011/06/30(木) 07:18:43.97
ありがとうございました
Windowsでやっとけよ。
practical common lispのpdfっていつの間にか無料配布をやめちゃったんだね。
すいません…初心者なので質問させていただきます…。 リストの中の3つの要素が同じかそうでないかをくらべ、同じならその記号を違うならnilを返す関数hikakuを作成してください。 参考書の練習問題を解いていたのですが、わからなかったため質問させていただきました。 ヒントとしては3つのものが同じかどうか判定し、結果には最初のものを返せばよい。 との事ですが…どなたかご存じの方おりましたらよろしくお願い致します。 実行例としては (hikaku '(x x x)) →X (hikaku '(x y x)) →nil (hikaku '(x x nil)) →nil となっています…。 よろしくお願い致します。
(defun hikaku (list) (let ((x (car list))) (if (remove x list) nil x)))
(defun hikaku (x) (reduce (lambda (a b) (if (eql a b) a nil)) x))
突然失礼しますorz (setq board '((11 12 13) (21 22 23) (31 32 33))) といったものが与えられている時、 (11 21 31) を表わす関数xの定義 (12 22 32) を表わす関数yの定義 (13 23 33) を表わす関数zの定義 (11 22 33) を表わす関数aの定義 (31 22 13) を表わす関数bの定義
はどのようにして書けばよいのですか? appendなどでつなごうとしたのですが上手くいかず困っていますorz
宿題? a bはともかく、x y zはmapを使うんだと思うけど。
>>890 古い参考書に載ってた練習問題です…orz
解説を見ようとしたら中古品だったので解説部分が切り取られてましたT-T
とりあえず動作例が一つしか与えられてないわけだから、 xの仕様を日本語で書き下してみたら?
>>982 どのようにして(11 21 31)を取り出すのかさえ分かれば
解けると思うのですが…orz
初心者なので???状態です…。
>>983 まず、日本語で仕様を書き下す。
次に、それを実現するために必要な関数を調べる。
そして、仕様を言語で書き直す。
さあ、xの仕様を日本語で書き下してみよう。
初心者かどうか関係ない。問題を理解できたかどうかの問題。
関数xの仕様としては、carしてcarしたものとcdrしてcar したものとcdrしてcdrしてcarしたものをつなげばいいです。 ただその結合が上手くいきません…。
consはわかってる?
consとappendとlistの違いがよく分かってないのかね。 (defun list-copy-by-one-level (x) (cons (car x) (cdr x)) (defun list-copy-by-one-level (x) (append (list x) (cdr x)) はconsセルの消費数以外は同じ関数。 (defun list-copy-by-one-level (x) (nconc (list x) (cdr x)) ならconsセルの消費数も同じです。(pure functionalでなくなるが) x, y, zはこの関数のごく単純なバリエーションにすぎません。
>>985 >関数xの仕様としては、carしてcarしたものとcdrしてcar したものとcdrしてcdrしてcarしたものをつなげばいいです。
処理系あるなら一回試してみ
あるいはboardをconsだけで書いてみるといいよ
誰ぞ次スレを
>>946 Hunchentoot
そんなに使われてる?
スレが立ってから15か月になるのか...
>>990 とりあえず、私的に実験的なページだとHunchentootつかうかな
parenscriptあたりもlispのりで書けるし...
>>990 元のレスは「Hunchentootで普通にスレッド使いまくり」って意味だけど、
Hunchentoot自体も普通に使われてると思うよ。
だって、まともにメンテされてんのがHunchentootくらいだし。
cl-lexの使い方の例ってどこかにないのでしょうか
お疲れさまでした うめ
ぼんやり読んでたら
>>991 をスレが立ってから15年と読んで混乱した
ともあれ乙
>>990 以前はプロトタイプのweb作るのに使ってた(あと管理系のwebツール)
いまはclojure+compojureの方が書きやすいと思うようになっちゃった
1000
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。