【入門】Common Lisp その11【質問よろず】
レス数が1000を超えています。これ以上書き込みはできません。
Lisp Schemeスレでは恥ずかしくて聞けないようなことを質問したり、
Lisp Schemeスレの話題は高度すぎて気後れする人が話しあったり。
それ以外でもCommon Lispについての話題なら歓迎します。
ま、ゆっくりやりましょう。
「いいものの本質は、いかなる時代においても変わらない」byパワーズ
■前スレ
【入門】Common Lisp その10【質問よろず】
http://peace.2ch.net/test/read.cgi/tech/1361341876/
■Wiki
http://wiki.fdiary.net/lisp/ (id:guest pass:cl)
http://cl.cddddr.org/
http://tips.lisp-users.org/common-lisp/ CommonLispは無くなっても困らないけどs式使う言語が否定される訳じゃ無いからなー
GUIとかI/Oもちっと近代的に再定義できないもんかの>>CommonLisp なんでClojureはdoted pairなくしたんやろ
Symolic expressionはlinked cellが実体やないのか?
おかげでcar,cdrもないらしいやないか
それでもリスプの仲間かい!
レイプの間違いやないか?
エロいのうClojure consセルを次のように定義できるんやな
(define (cons car* cdr*)
(lambda (bool)
(if bool car* cdr*)))
で、かー、くだーや
(define (car cons-cell)
(cons-cell #t))
(define (cdr cons-cell)
(cons-cell #f))
わし、勉強したで
どや! >>8
Clojureはcons cellのあり方を変えてもLisp族であれると明確にしたんじゃないの?
実際Lispのdot pairってClojureでvector で2値持つのと何所が違うの? lispworks欲しい
実際emacs slime sbclとどれくらい違うんだろ >>14
GUI使わないならLispWorksもEmacs+Slimeですよ。
ちなみにGUIつかうならフランツ買うべき > GUI使わないならLispWorksもEmacs+Slimeですよ。
GUI使うよ
> ちなみにGUIつかうならフランツ買うべき
なんで? >>16
とりあえずGUIで日本語使わないならLispWorksでも大丈夫だけど、GUI使うときに付属のエディタが多バイト文字対応してない>>LispWorks
Franzはそのあたり問題ないのとGUIのユーティリティーが凄い良くできてる。
でもお金無いのでFranzは評価版だけしか使ってないけどな!
エディタさえなんとかなるならLispWorks好きなんだけどな! lispworks6からUTF-8で表示で崩れもなく表示もできるし入力もできるよ.
common graphicsよりcapiの方が評判良いと思うけど.
lispworks7からjvmと連携するらしいよ. やっぱり日本語がネックか
とりあえずfreeのacl使ってみる >>18
マジか!
マジならアップグレードするか
#という事を続けてAllegro購入とかわらんくらい突っ込んでるのがなっとくいかねー >>18
jvm連携するくらいならClojreのIDEになってほしい orz Schemeに比べてCommon Lispの利点て何? ベタベタな手続き型プログラミングがいとも簡単にできるところじゃね? 偽と空リストが分かれてないとかnilのcar,cdrはnilとかそういうところは地味だけど
マクロ定義とかでリスト操作するときに便利 あとバリバリに最適化してC並の性能に出来るところも気持ちいい Common LispがLisp-2であることは、俺にとっては実用上便利だが、
そうは思わない人たちもたくさんいるだろう。 let over lambdaではちょくちょくageてた common lispって柔軟だけどかゆい所に手が届かない所が多いね
大抵はalexandriaとかkmrclとかcl-ppcreとかsplit-sequenceとか使えばなんとかなるけど
ライブラリが散らばるのが気になる
alexandriaとかkmrclをベースに自分だけが使う一つの巨大なライブラリを作って足りない部分を追加していく方がいいのかな 名前空間みたいに、分けられる概念は分けるのが正義。Scheme はたぶん間違っている。
その意味では CL も副作用を分けなかったのは失敗だった。 プログラム書いるとオレオレマクロとかオレオレ関数ができてくると思うんだけど、みんなこれどこに置いてるの sbclでコンパイルに数秒かかってて
(incf v)
(incf v)
...
をn回繰り返す式を
を(incf v n)にしたらコンパイルが一瞬で終わるようになった
最適化すごい 最初は今書いてるプログラムソースと同じディレクトリに置いて間を見計らって
~/.sbcl/の中に置いて起動時にloadするようにしてる >>34
1. オレオレだと思っていてもalexandriaの中を探すと大抵のものはある.それを使う.
2. なければ,オレオレライブラリでもasdfで読めるようにしておく.quickproject使えば手間もかからん.
初期化ファイルで読み込ませるのはbad practice. ローカルプロジェクトはasdの設定とか面倒そうでやってなかったけど
quickproject使えば自動で生成されるんだな
前より楽になったしもっと早めに調べておけばよかった >>37
やっぱそんな感じなんですかね
一つのore-xandriaにいろいろ詰め込んでquicklispのlocal-projectに置いてるだけだったので、整理しようかなと思ってたんですが
参考になりました (defun fn1 (str)
(print str))
どなたか教えて下さい。
上の様な関数fn1を最適化、型宣言をして下の様な、
(defun fn2 (str)
(declare (optimize (speed 3)(debug 0)(safety 0)))
(declare (string str))
(the string (print str)))
関数fn2になりました。
マクロを使って下のfn3の様にしたいのですが
可能でしょうか。教えて下さい。
(defun fn3 (str)
(high-speed)
(var-string str)
(the-print str)) declareをhigh-speedやvar-stringマクロで表すのは無理
コードウォークするか別のアプローチを取るしかない 書き込んだ後で思い出したけどリードマクロならdeclareに展開しても大丈夫だった (defmacro defun-opt (name args &body body)
(let ((vars (mapcar #'cadr args)))
`(defun ,name ,vars
(declare (optimize (speed 3) (debug 0) (safety 0)))
(declare ,@args)
,@body)))
(defun-opt fn ((string str))
(the string (print str)))
こんなんじゃだめなの?かなりてきとーに書いたけど >>40
CommonLispだから最適化しなくちゃならないとかマクロ使わなくちゃならないというのはむしろ間違い。
書く手間を減らしたいということなら、変数に最適化設定を入れて#.するってことが多いかな。
quicklispで公開されてるライブラリ入手してdeclareでgrepして読んでみると良いよ。
(defvar *normal-optimize* (optimize (speed 1) (debug 3) (safety 3)))
(defvar *full-optimize* (optimize (speed 3) (debug 0) (safety 0)))
(defun fn2 (str)
(declare #.*full-optimize*)
(declare (string str))
(print str)
str) 型宣言とか最適化宣言って最初からつけといた方がいい?
後からつけるのは面倒そうだけど最初からつけるのも面倒だし >>45
コンパイラにチューニングの肝を教える為のシステムだろう?
とりあえず動くコード書いてって言うREPL大好きな人なら後からだし、設計から最適化を含む人なら最初から入れるだけじゃないの?
あんまり難しく考えるとはげちゃうぞ 最初から入れる方向で設計する方が
あとあと抜本的大改造しなくてすみそうな > あとあと抜本的大改造しなくてすみそうな
やっぱり最初から宣言書いといた方が楽かな
はげるのは困るし っていうか
人に聞いて決めるようじゃだめじゃないか?
自分で判断、どう判断しようか、その方針で作っていくうちにその良し悪しを知るのも勉強 40です。
みなさま、ありがとうございます。
特に41さま、42さま、43さま、44さま、
具体例を示していただいて、大変勉強になりました。
また45からの「最初か後か」の議論。
参考にいたします。
ちなみに私は、正解を探る技量が自身に無いと考えていて
ひと通り書いて速度が気になれば「後から」改変する
方法でやっています。
これだと、とりあえず必要な目先の事だけに集中できて
コードのスッキリ感が保てると思うので。 cl-ppcreってparse-stringして正規表現をS式にしたあと
それを使って文字列比較のクロージャを作ってるように見えるんだけど
dfaのコードが見当たらない
文字列比較のクロージャを使うやり方では有限状態機械はいらないのかな clojureとcommon lispとschemeのどれを学んだら良いか悩んでいます。
common lispが気になっているのですが、
モダンLispといわれるclojureの方がJVM言語ということもあって現実的に利用が容易な気もしていますし、
schemeはシンプルということで学びやすいのかなとも思います。
主観でも良いのでおすすめや優位性を教えていただけないでしょうか。よろしくお願いします。 >>53
ここはcommon lispのスレなのでおすすめは決まっているようなものですがclojureです。
ユーザーが親切。 Schemeがシンプルっていうのは正しいけど誤解でもある。
コミュニティで合意できた部分だけが仕様としてまとまったので仕様だけを見るなら綺麗で単純だけど、
決着がついてない論争は膨大にあって、処理系ごとに方針の違いが大きかったりする。
きちんと理解しようとすると、思ったよりは容易でない。
でも、まあ、 Common Lisp よりは楽かな。
Clojure は JVM が先にあって Lisp 的な外観をくっつけたものなので、
言語としての構造は Lisp 的テイストよりも Java 的テイストに寄ってると思う。
いろいろと Lisp っぽくないので Lisp についての理解を深めたいなら
あまり向いてないかもしれない。
現実路線というのはその通りだと思う。
Common Lisp は良くも悪くも Lisp 代表って感じ。 >>53
使って学ぶならClojureがおすすめ
入門書は孔雀が表紙の本がGaucheの人が訳してて読みやすいし分かりやすい
ここCLスレだけど >>53
お勧めは、common lisp
schemeはlisp矯正ギブスみたいなところがあって、他言語やってた人にはいい気がするけど、
何かアプリを作ろうとすると、ライブラリがなくて面倒だったり、処理系依存が増えたりする。
clojureはjavaのライブラリを呼び出せるので、手軽にアプリが作りやすい。まそのおかげで、GUIアプリを作るのがやり易い。
その一方で、JVMの縛りを受ける。
armのlinuxで使おうとしたら、armのJVMがあんまりよくないのか、やたらと重かった。
なんだかんだで、common lispはいいバランスだと思う。
あとlisp族初めてなら、emacsとか入力支援のある環境を使った方がいいよ。 >>53
お勧めはClojure、ちくせうCLスレなのに!!!!
Webアプリとかは特に
CommonLispでお気楽極楽する事もできるけど、準備が大変。(GUIやるにはFFIで根性入れるかお高い処理系買うとか)
Clojureはこの点をJVMに依存することで過去の資産を使えるのが利点。
Schemeは僕は好きじゃ無いので説明に困るからお勧めしない。
なお、WebアプリをCommonLispで作るとmade with alien technologyを実感できてコレがたまらん abclとかいうjvm上で動くcommon lisp処理系もあるよ Clojure人気すぎワロタ
お前らが考えるCommon LISPの実用に足りないこと、
これさえあれば実用できるのになー(チラッチラッ
って思うことって何? コルーチンを実現するためにcl-contでpythonのyieldと同じ機能付けたら
マクロ展開後の式が大きすぎるみたいなこと言われたとき >>53
大人気のclojureに水を指すようだが、あれは first-class continuationsをサポートしていない。初めてリスプ系の勉強するのにはやめておいたほうがいい。初めてのLisp系の勉強には俺はSchemeを勧める。
テキストはThe Little Schemerを勧める。理由は
1. collector( continuation )もやるし
2. Y-combinatorもつくるし
3. Scheme上でScheme Interpreterもつくるからだ。
ただ、あくまでS式(Symbolic expression)を扱うので、例えばリストが内部的にどういうデータ構造なのか?は別書でやることになる。
car-cdr部を持つ単位(cons Cell)を次のようにclosureとして表現して見せてるくらいだ。
(define cons
(lambda (u v)
(lambda (t)
(if t u v))))
(define car (lambda (cell) (cell #t)))
(define cdr (lambda (cell) (cell #f)))
;applications
(define a
(cons 1 2))
(car a) -〉 1
(cdr a ) -〉 2
実用アプリをは基礎を学んでからCLででもClojureででも書けばいいんでないかい。 おれの個人的意見。
>>53
scheme は scheme を実装して勉強する言語、と言っていいと思う。実装に興味があるならお勧めできる。特に gauche あたりの実装は素晴らしく綺麗で、面白い。
Common Lisp は何かを作るためのパワフルな道具。使えるようになって損はない。力を付ければ、低レベル層から高レベル層まで扱えるのが強み。ただやや古臭いところも。
Clojure は Lisp の皮を被ったちょっと違う何か、かもしれない。モダーンですごく考えられているし、どんどん進歩していて楽しい。コミュニティも活発。
まあ一つをやったら他のことはできない、なんてことはない。どれも面白いから、どんどん手を出すといいと思う。 >>53
>>62の補足
The Little Schemerでは徹底して再帰的定義でやる。なのでwhileとかでの非再帰的定期は出てこない。非再帰的的定義など(きっと)頭の良いチンパンジーでさえできるようなものはいちいち扱わない!
また、fibonacci数を求めるなどを再帰的に定義すると非再帰的定義に比べてとても処理速が遅くなることがあるが、末尾再帰の書き方も出てくるので
非再帰定義に同等の速度を再帰的定義では発揮するやり方も学べる。
具体的にはcollecterを使った再帰的定義で末尾再帰が実現される例が出てくる。
この辺りもこのテキストを勧める理由た。ただし!意外に難しいかもしれない。最近、書き込みがあったがこのテキストがわからん、あきらめたと。
どうにもチンプンカンプンなら関連しそうな概念や例についめネットなどで予備調査しながらやるといいと思う。教えてくれる人がいればそれが一番だけどね。
「何?、継続がわからん?
あのな、いいか、女とセックスしたい時にな、女を脱がしてからセックスするだろ?まず脱がしてからセックスすることを継続だ。
それにつきる。」 >>53
Schemeはいい言語だけど、何かをやろうとするとちょっとめんどいことが多いかな
完全な主観で言えばCommon Lispが好きだけど、
何かやりたいことがあってそれを実現したいのならClojureが一番楽だとは思う Libraries,??not framework の哲学とか http://eed3si9n.com/node/141 とかが性に合うならClojureでもいいかも
あとは括弧が(Scheme/CLに比べると)少なかったり lisp方言としてはarcが好きだけど処理系がなあ アクセス禁止にされてしまいレスが遅くなって申し訳ありません。
実はland of lispとプログラミングClojureはとりあえず読んだことはあります。(内容は正直曖昧に理解しているところもありますが。)
みなさんのお話を聞いたうえで、今特定の仕事に追われているわけでもないですし、common lispを勉強していこうと思います。
何かをするために言語を学びたいというのももちろんありますが, それ以上にlispという概念についての理解を深めたかったことと, いわゆる`lisper`への憧れから, もっとも満足できそうなのはcommon lispかなと判断しました。
皆さんご意見いただき有難うございました。 最近思うんだけど、Lispの利点で重要だけどあまり宣伝されてないのはrepl。
書いたコードを即時に動かして結果やデータを見つつ、徐々に大きくしていくスタイルは脳汁どばどば出る。
LispマシンやCLIM系のインスペクタやデバッガも、このスタイルのためにあるように思える。 リスプの概念をスマートに認識できるのはスキームだけどな
ま、いいけど
バイバイ >>71
REPL が重要なのは同意。でも、REPL はもっと進化していいと思う。SLIME でもまだ不満だ。
例えばだけど、プロファイリング結果をグラフでREPLとは別のウィンドウに表示し続けるとか。アレグロにはあったけどCLOSのクラス階層を表示してくれるとか。 >>74
LightTableってエディタでclojureいぢると少し近い感じになるかも
CLだとやっぱりFranzとか欲しくなる
小売りで買えないから学習用の奴しか触ったこと無いけどたしかに脳汁が出そう 昔の Lisp の開発環境って使ったことは無いんだけど、スクリーンショットだとか動画とか見ると、
今でいう JavaScript を Chrome の開発環境で使ってるみたいな感じで、かなりリッチなんだな。
slime なんてめじゃないぞ。 どうして退化してしまったのか…。 >>74
現状ライブラリとして広く共有されてるかは別としてそれなら簡単に作れると思うけどね
クラスブラウザなら素朴なのがslimeにもあるよ(require 'slime-xref-browser) M-x slime-browse-classes これもCLOS入門で試しに作ることが多い
replが重要なんじゃなくて対話性が重要ってことなんじゃないのかな
そして他の言語にかなりキャッチアップされてるから,いまとなっては大した特長でもない slime-browse-classes初めて知った
クラスの継承関係を表示するだけでも便利だけどスロットとか出ないの? >>80
シンボルの上でC-c C-d dすれば良いんじゃねw
いずれにせよ柔軟性や透明性など、自由度が段違いですのでカスタマイズするのも自作するのも簡単だろう >>81
その方法なんで気付かなかったんだろ
ありがとう slimeでさえ使い込なせてないのにそれより多機能な>>71があっても豚に真珠だな
早く豚から海豚くらいになりたい うぉー、LightTable かっけー!サンクス!
いろいろいじってみる。
>>78
すまん、おれの説明が悪かった。
クラスブラウザは単なる例で、もっとLispの特徴を活かした開発支援のアイディアはあると思っているんだよ。
それがあることで生産性がぐっと上がるような。
具体例が出せないが、多分一つの方向は、コードから得られる統計的データを生かすものだと思う。 みんな そんなにreplとクラスブラウザが好きなら
Smalltalkにしちゃいなよ Smalltalkと同程度に、インタラクティブに、イテレーティブに、アジャイルに、GUIを含めて開発できるということだな Smalltalk はもう何年も前に死んでるじゃないか clojureから流れてきたものだけど、CLer的にはloopってどういうものだと認識されてる?
同じlispではあるけど、CommonLispは関数型であろうとしてるように感じないんだよね
効率のためなのかわかりやすさのためなのか、ローカルでさえあれば再代入まみれの副作用まみれっていうように感じる
loopも結局使い方によっては関数型の繰り返しっぽいっちゃぽいんだけど、どう使うにしろlispっぽくはないよね?
そのへんどう思われてるのか気になる。気軽に使っていいものなの? CommonLispはマルチパラダイム言語であって、別に関数型であろうとしているわけではない
Lispは歴史的な理由で関数型と勘違いされているが、手続的にもかけるし関数的にも書けるしOO的にも書ける
状態が増えると保守性もろもろが落ちるのは真なので、そこらへん意識しつつ、適材適所で書けばいい >>90>>91
マルチパラダイムってのは確かに書いてあったけど、利用者側はなるべく関数型っぽく書こうとするべきなのかなと思っていた
Scalaとかだとマルチパラダイムだけどなるべく関数型でかくことが推奨されてるイメージがある
なんでも関数型っぽく書くのではなく、わかりやすく書きやすく目的にあったように書きましょうというのがCLの正しいスタイルなのかな?
つまり状況に適していると判断できればloopをつかうことをためらう正当な理由はないってことか。
性能もdo系統や末尾再帰と比べて申し分ないようだし 出来るだけ関数型で書くかはコーディングスタイルの話じゃないの 概ねそんな感じでいいと思うけど、結局はどんな書き方も許されているので利用者が適宜判断する以外ないってだけかなあ
CommonLispとしての正しいスタイルというものはたぶんない Lisp族は利用者が対象に最適と考える記述を書きやすくしている
他の言語は言語作成者が最適と考える記述を書きやすくしている mapcarは知ってるけど他のmap系は知らないので
hyperspecを眺めていたら疑問に思ったので質問します。
結果を返さないし反映もされないmapcは
どんな有用性があるのでしょうか。
おそらく私の無知なのでしょうが
mapcの存在する意味、使いどころが解りません。
どなたか説明出来ませんか。 >>96
97のとおり副作用目的で使う
用途としてはdolistと同じだがmapcはそれより昔からある
他の言語でいうとRubyのmapとeach、Schemeのmapとfor-eachのような関係
dolistがあるので存在意義が薄れた (dolist (obj lst) (f obj))
の場合は
(mapc #'f lst)
に出来て簡潔 CL はマルチパラダイムなのは認めるけど、最近のパラダイムを取り込めてなくないか?
誰か haskell の型システムを完璧にCLに取り込むべきだ。(liskell は死んだっぽいし) S式で書かれたMLコードを、静的な型チェックかけたあとでLISPに変換する
ML2CLとか誰か作ってくれ >>100-101
ttps://github.com/rvirding/lfe
erlangをlispとして使う奴ならあるよ、型チェックの為にMLだったらerlangでもよくね? cons cellのアドレスとそのconscellのcarのアドレスは別物ですよね? >>104
基本的には別物だけど immidiate value の場合はそうでもないというか、
ちょっと説明しづらいけど変則的なことが起こりうるよ。 整数がいくつか入ったリストがあってそれで
リストが(1 2 3)なら"1-2-3"という文字列を作りたい
(format nil "~{~A-~}" '(1 2 3))なら"1-2-3-"になってしまう
なんか良い方法無いかな (format nil "~{~a~^-~}" '(1 2 3))でどうでしょう? >>105
immediate valueって何が言いたいの?
* (let ((cons '#0=(#0# . nil)))
(eq cons (car cons)))
T
これのこと?
これはimmediate value って言わなくね? >>110
105が言いたいのは tagged pointer のことじゃないの? 質問です
(defun hoge ()
(fuga (loop for x to 100 collect x)))
みたいな関数があるとして、この関数を呼び出すたびに
(loop for x to 100 collect x)
が評価されますよね
もしそれが重い処理で、実行時に定数として扱いたい場合はどうすべきでしょうか
自分の思いつく最良の解決方法は次のようなマクロを使う方法です
(defmacro pre-eval (body)
`',(eval body))
(defun hoge ()
(fuga (pre-eval (loop for x to 100 collect x))))
もっと良い方法があるような気がするんですが、ご指南お願いします >>113
ありがとうございます
リードマクロは盲点でした 内包表記をS式で表そうとしたら
結局、loopみたいな文法になるような気がして
loopは他の言語の内包表記のような感覚で使ってるよ sbcl 1.2.5ってスペシャル変数にバグある?
なんかどうにもおかしい部分があるんだけど >>116
再現コードがないからどこがおかしいのかわからない明日も会社なのに眠れないし最低の気分だよ 今起きて確認したら
(let ((x y))
(declare (special x)))
とするところを
(declare (special x))
(let ((x y))
)
としてただけだった
安心して寝てくれ>>117 ∧∧
ヽ(・ω・)/ ズコー
\(.\ ノ
、ハ,,、  ̄ マクロのマクロのデバッグ辛すぎ
なんで同じ式を生成してるのに片方だけエラー出るんだ マクロを生成するマクロのデバッグがむずいのはだいたい下のどれか
・展開で副作用がある糞マクロだから
・100行以上ある糞マクロだから
・分割できるのに1passでなんでもやろうとする糞マクロだから
・`(, ,@)式の扱い方を知らない糞野郎だから
・リスト操作のいろはを知らない糞野郎だから
・マクロのデバッグ方法を知らない糞野郎だから >>120の原因は結局マクロを使ってる部分の式が間違ってただけだったんだけどね ・使用箇所で意味が変わる不衛生な糞マクロだから ← New! eval-whenの使い方がいまいちわからない
てかマクロの展開とコンパイル・実行の関わりがいまいちわからない >>127
割と理詰めで、必要性を理解できるところだよ なんかC++の闇みたいだな
C言語をマルチパラダイムに使えるようにいろいろ突っ込んだのがC++で、
lisp族に同様に色々突っ込んだのがCommon Lispみたいな そういう声はたまに聞くけどなんで誰も行動しないの? スクラッチでCommonLispを書けるやつがある程度いないと駄目だから。
改善案とか出すだけのやつやちょっとカスタマイズするようなやつが沢山いても根本的な変化は起きない。
変化してる言語は言語好きの処理系屋が集まって年中議論したり機能追加してる。
ユーザーが高度にカスタマイズできるせいで大抵の要求は実現できるから局所最適解にはまって進化がとまるのはあるかもな。 > スクラッチでCommonLispを書けるやつがある程度いないと駄目だから。
common lisp処理系作れるっていうこと?
Cで挑戦したことはあるけどパッケージ一通り実装したりリードマクロ付けたあたりまでは
やったんだけどCLOSやコンディションの実装はあまりの大きさに挫折したわ >>136
おいらはformatだけで挫折する自信あるぜ formatはlispで書けるからいいとしてその下のwriteが大きすぎる 3imp 読んで継続実装したところで諦めた。CLじゃないけど。
面白かったので Lisp in Small Pieces 買おうか迷ってるんだけど持ってる人いる?内容どうか聞きたい。 3imp 読んで継続実装したところで諦めた。CLじゃないけど。
面白かったので Lisp in Small Pieces 買おうか迷ってるんだけど持ってる人いる?内容どうか聞きたい。 On Lispを読んでいるのですが、関数型インターフェースのところで
各関数の呼び出しは、その呼び出し自身が支配するオブジェクトを
安全に書き換えることができる
という記述がああります
この、呼び出し自身が支配するオブジェクトとはどのようなことなのでしょうか?
続く文章で、関数呼び出しの返り値として受けとるオブジェクトは支配する
-> 書き換えても良い(安全に)
引数として渡されるオブジェクトは支配しない
->書き換えてはいけない(でも既に渡しちゃっているんでは?)
ということなのでしょうか? 静的に狭い場所で管理された副作用は速度の為に許容するって意味じゃね
ところでブートスクラップでlisp to cコンパイラを作ろうとしてるんだけど
compile関数を実装するときに渡されたシンボルか関数からCのコードを生成するときに
function-lambda-expressionで関数の本体部分を取得すればいいのかな
kclのコード見てもcompile-fileとかはあったけどcompile関数は見つからなかったのはなんでだろう 横文字には弱いみたい
要約するとcompileに渡された値からどうやって関数の引数やら本体部分を得るかを知りたいわけです >>141
http://www.asahi-net.or.jp/~kc7k-nd/onlispjhtml/functionalProgramming.html
他の誰のものでもないオブジェクトという表現からいえば、まさに安全に書き換えることができるという意味で言ってるのだと思う
つまり、関数呼び出し自身が支配するオブジェクト⇔関数呼び出し時に安全に書き換えられるオブジェクト
なので、後段の部分の理解もそういうことで大体いいのでは
既に渡してるというところで引っかかってるみたいだけど、ここの話は読む限り関数的な書き方のLispの慣習なので、
要は受け取った引数を関数内部で勝手に書き換えるのはLispの関数的な書き方の慣習上よくないとされてるからやめろってだけの話なぜ慣習の話が出てくるのかといえば、どのオブジェクトが支配的であるか、つまり安全に書き換えられるかというのは書く人間が決めることだから
で、一般的なLispの慣習では引数は支配的でないけど、呼び出しの返り値は支配的とされているよ、という話
この慣習を守れば多くの場合純粋関数的な書き方と同等のローカル性を得られるけど、その節の後半部分はそうでない場合もあることを解説してる 教えてくれ
Emacs23.3 (On windows) に slime 入れたんだ
.emacs にはこんな感じで書いた
(setq inferior-lisp-program "sbcl")
(add-to-list 'load-path "~/.emacs.d/site-lisp/slime")
(require 'slime-autoloads)
(slime-setup)
で、まあ動くことには動く
でもなんでか以前clispで使ったときはあった起動時アニメーションがないんだ
なんで? This `cl-labels' requires `lexical-binding' to be non-nil
ntemacs23で出たエラーですが
原因は何でどうすれば解決しますか? 146 = 148なのか?
エスパーだけどslimeのことならemacs24にすれば良いじゃね?
しかし質問のしかた最悪だな >146 = 148なのか?
ちがいますよ
>エスパーだけどslimeのことならemacs24にすれば良いじゃね?
ありがとうございます
>しかし質問のしかた最悪だな
ごめんなさい 質問です
素人知識ながらコードの高速化を行っているのですが、例えば次のコードをdisassembleします(sbclを使ってます)
(defun my-eq (a b)
(declare (optimize (speed 3) (safety 0)))
(eq a b))
; disassembly for MY-EQ
; Size: 21 bytes
; 0CAE251A: 39FA CMP EDX, EDI ; no-arg-parsing entry point
; 1C: 740A JEQ L1
; 1E: BA0B001001 MOV EDX, 17825803
; 23: L0: 8BE5 MOV ESP, EBP
; 25: F8 CLC
; 26: 5D POP EBP
; 27: C3 RET
; 28: L1: BA27001001 MOV EDX, 17825831
; 2D: EBF4 JMP L0
すると高速化においてよろしくないとされる条件分岐命令(JEQ)が出力されます
このようなJEQは本当に高速化の脅威になりますか?
また、取り除くことはできますか? >>151
eq速くして全体が速くなったというのを寡聞にして聞かない
何作ってるの? >>152
将棋のAIを作ってます
インライン展開してない状態でプロファイルを取ったとき
eqを使う単純な関数で時間がかかっており、>>151のような状態に気づきました
単なる比較で分岐命令が生成されることに違和感があり質問しました
ちなみに今プロファイルを取りなおしたところそんなに時間もかかっておらず、なんだったのかって感じです インライン展開すると関数コールが省略できるってのもあるし、
大きなジャンプを避ければメモリローカリティが維持されてデータ (プログラム) がキャッシュに乗って速度に貢献することもある。
キャッシュってのは侮れない要素なんだけど、正直言って実際に試してみないとどう効いてくるのかさっぱりわからない。
プロファイラでもそういう差は見え難いしな。 予想にこだわらずに色々と試してみるのが吉。 その内に勘が働くようになるよ。 gcl使ってたらhandler-case,ignore-errosが無いことに気付いた
やっぱりansi準拠じゃないとansin出来んな define-hogeマクロを定義するマクロはどういう名前にすればいいんだろ
define-define-hogeとかしか思い付かないけど不恰好だし allegro clの無償版って普段のlispプログラミングにどれくらい使えるかな
制限はヒープ領域だけみたいだけどヒープ領域が60Mbってどれくらいの制限がいまいちわからんな >>161
正直、あまり常用したいとは思わない
何をするにも、試用版かなんかのダイアログが出てきたと思う
allegro購入予定でなければ、cclとかsbclとか使った方がいいと思う やっぱりただで使わせる気は無いのか
気分転換に環境変えてみようと思ったけど残念 loopマクロのトークンはキーワードにするのはどういう意味があるんだ >>164
パッケージの名前空間を汚さないため、だと思う。キーワードを使わないと、thenとかuptoとかのシンボルがそのパッケージに作られちゃう。
lispのプログラムってホントにデータなんだ、と驚いた記憶がある。 なにがインターンされるかなんて気にして書いてる人なんかいないよ、お兄ちゃん!
:then :upto だとエディタのハイライトで読みやすくなるからだよ。
それが読みやすくなければ、then uptoと書けば良いよ! 外部から参照されるシンボルでもない限りファイルをコンパイルしたファイルからはシンボルは勝手に消えるからライブラリ作るやつはそんな細かいこと気にしてないだろ…
無用のシンボルをインターンしたくなくてdefpackageで#:hogeって書くやつはいるがキーワードパッケージとcl-userのシンボルは消しにくいからまあ理解もできるが、それもコンパイルすれば消えるし loopマクロのuptoとかがキーワードでも動く、ってのは
ちゃんと仕様になってるのかな。
おれはへえキーワードでもいいんだ、と知ってからはずっとキーワード派。
無駄なシンボルがインターンされているなんて、おれの美意識としては嫌。
他人に強要はしない。 仕様で規定されてるかどうかはloopの項目に記載があるから違法か合法かは読めばわかるな。
無駄なシンボルがインターンされるという意味では、キーワードパッケージにインターンされる方が
グローバルに汚染される分、ローカルパッケージ汚染より質が悪い筈。
矛盾したこだわり…。 CLHSより引用。
loop keyword n. Trad. a symbol that is a specially recognized part of the syntax of an extended loop form.
Such symbols are recognized by their name (using string=), not by their identity;
as such, they may be in any package. A loop keyword is not a keyword. >>171
矛盾はしてなくない?
皆が:uptoを使えば、キーワードパッケージだけにそのシンボルができるんだから。
キーワードパッケージはloopに限らずぐちゃぐちゃと変なシンボルが登録されるけどそれは仕方ないこと。
世界の汚さを一手に引き受ける、それがキーワードパッケージの役割だと思ってる。 構造体やクラスの名前からスロットを取得する方法ってある? class-slots てメソッドがあるよ。構造体に使えたかは忘れた >>175
ありがとう
検索して見つけたこれが参考になった
ttp://stackoverflow.com/questions/3086561/make-clos-objects-printable-in-lisp carとfuncallの違いはなんですか?
と聞いてるようなものなんだが >>179
ええとね
単語のスペルと長さがちがうかなぁ
それとevalはevaluateの省略だね
eval is short for evaluate この板のいくつかの場所で言われてるけど
その人ちょっとおかしいんだよ
真に受けない方がいい いえこの人がおかしいのは知ってますし真に受けるつもりもありません
ただ思えばそれらの違いを言葉にできるほどの認識がなかったので あのう、きちっとしたテキストを一冊読んだほうがいいよ (eval `(funcall ,f ,@args))と(apply f args)が同じっていいたいのかね?
ようわからんけど… evalはシンボルのリストを読み込んでその内容を実行する。
applyは既に評価されて定義された関数を適用すること。 eval だけでいいのに何でapplyが重視されてるんだ?、と思ったら、SICPを読もう >>179
commonLispの板でeval applyといえば特定の実装の話になるから
lisp scheme板に話をふった方が良いよ
そういう話好きなやついるから emacsのslimeについて質問です
slime-autodoc-mode
slime-autodoc-space
うざいので無効にしたいのですが
どうにかならないですか adw-chartingって(ql:quickload :adw-charting)しただけじゃ
使えないんでしょうか >>193
エスパーだけど、サブシステムに分かれてるから
(ql:quickload :adw-charting-vecto)
しないとサンプルが動かないという意味ではそうなのでは
試した手順とマニュアル読んで分からなかった箇所を具体的に書いたら?
(adw-charting:with-pie-chart (300 200)
(adw-charting:add-slice "A" 5.0d0)
(adw-charting:add-slice "B" 2.0d0)
(adw-charting:save-file "minimal-pie-chart.png"))
は配布状態で動いたよ >>194
動きましたありがとうございます
quicklispの使い方をわかってなかったので
exampleをコピペしただけでadw-charting:をつけてませんでした 嬉しいのでチラシの裏書きます
The Little Schemer二回読了!!
勉強になった
次は「初めての人のためのLisp」を読もうと思い購入済みでもあるのだけれども予定変更
The Seasoned SchemerというThe Little Scemerの続編でthe natures of
computingの理解を目ざすものがあったのでそれにした。
それ終えたら「初めての」かLand of LispかOn Lispやろ
本来の目的ClusureでAndroid用の好みのワンベインOutlineプロセッサつくるためにLisp系はじめたけど楽しいからそれはさておき基礎の基礎に深く分け入っていきます 再帰で考えてしまって動的計画法が使いこなせない!
全マス埋めていく感覚が、全ノード探索と分かってはいるんだが… D-WaveのOSがCommonLispってマジ? >>198
wikiペディアでソースみつけた
ttp://en.wikipedia.org/wiki/Serial_Experiments_Lain
>>201
マジみたい、APIのみ公開だって。
アプリ開発はPython推しだね。 >>198
このソースを書き写した覚えがあるなと思って、
ハードディスクを漁ったら見つかった。
この部分の前後のソースも写してあったけど、
前の部分のソースが明らかにライフゲームの生死判定だった。 >>205
>>203のリンクから元本のソース見れるよ。 見れた
配列をbit単位で操作するのは効果あるのかな >>207
1991年だからメモリ贅沢に使うのに躊躇したんじゃなかろか? 一バイトは金のひとすくい
しません、させません、ビットの無駄使い
おかげでビルも立ちました >>210
stackoverflowに質問を書く前に問題を解決でき
オープンソースにせずとも問題を解決出来る高い生産性が
有るって事だなw
言語も人も。 オープンソースにせずとも問題を解決出来る、って意味分らないね ttp://sogrady-media.redmonk.com/sogrady/files/2015/01/lang.rank_.plot_.q1152.png
ttp://redmonk.com/sogrady/2015/01/14/language-rankings-1-15/ Rational Fortran
初代プログラミング作法(programming tools)のやつね。 LET OVER LAMBDAを読んでいるのですが
しょっぱなで出てくるマクロdefmacro/g!が動きません。
(defmacro defmacro/g! (name args &rest body)
(let ((syms (remove-duplicates
(remove-if-not #'g!-symbol-p
(flatten body)))))
`(defmacro ,name ,args
(let ,(mapcar
(lambda (s)
`(,s (gensym ,(subseq
(symbol-name s)
2))))
syms)
,@body))))
(macroexpand-1
'(defmacro/g! nif (expr pos zero neg)
`(let ((,g!result ,expr))
(cond ((plusp ,g!result) ,pos)
((zerop ,g!result) ,zero)
(t ,neg)))))
;=>(DEFMACRO NIF (EXPR POS ZERO NEG) (LET () `(LET ((,G!RESULT ..
(flatten '`(let ,g!result))が
(SB-INT:QUASIQUOTE LET ,G!RESULT)になるので
,g!resultがremove-if-notを通り抜けられないのが理由でしょうか。
sbcl1.2.7です。動かす方法はありますか? (defun g!-symbol-p (s)
(and (symbolp s)
(> (length (symbol-name s)) 2)
(string= (symbol-name s)
"G!"
:start1 0
:end1 2))) コードコピペしたらちゃんと動いたけど
flattenが間違ってんじゃないかな 試しにwindows版のsbcl1.2.7入れてやってみたが
確かに動かないな、これ
windows版ccl1.10ではちゃんと動いた
こういうことってあるんだな clisp+alexandria:flattenでやってみたけど動くよ debianのsbcl1.0.57.0ではちゃんと動く
今度は普段ccl1.10で使ってるslimeでsbcl1.2.7動かしてみたが
やっぱり動かん これが関係してる?
#:g1: SBCL 1.2.2でのbackquoteの変更
http://g000001.cddddr.org/3615721500 Common Lisp 素人です.
SSL って cl+ssl が標準的なんですかね?
以下のコードが動かないんですが, これはうちの環境が悪いんでしょうか?
```
(ql:quickload :usocket)
(ql:quickload :cl+ssl)
(let* ((sock (usocket:socket-connect "imap.gmail.com" 993 :protocol :stream :timeout 60))
(sock-stream (cl+ssl:make-ssl-client-stream (usocket:socket-stream sock))))
(unwind-protect
(progn
(format sock-stream "? CAPABILITY"))
(usocket:socket-close sock)))
```
Debugger:
```
There is no applicable method for the generic function
#<STANDARD-GENERIC-FUNCTION STREAM-WRITE-STRING (3)>
when called with arguments
(#<CL+SSL::SSL-STREAM
for #<FD-STREAM
for "socket 192.168.1.60:46384, peer: 64.233.187.109:993"
{1005B13083}>>
"? CAPABILITY" 0 NIL).
[Condition of type SIMPLE-ERROR]
```
cl+ssl の streams.lisp では stream-write-byte についてしか defmethod してないけど,
普通はこれで動くもんなんです? SBCLのバッククォートは構造体に変換されるようになったから
LET OVER LAMBDAにあるような、バッククォートを含むコードの
flattenによるコードウォークはSBCLだと動かなくなったって事か。
ダメじゃんSBCL〜
こんなバッククォートの仕様、CLTL2満たしてるのか? 解決したので報告です. :external-format を指定して flexi-streams を使えば良いようです.
```
(let* ((sock (usocket:socket-connect "imap.gmail.com" 993 :protocol :stream :timeout 60))
(sock-stream (cl+ssl:make-ssl-client-stream (usocket:socket-stream sock) :external-format '(:latin-1 :eol-style :crlf))))
(unwind-protect
(progn
(listen sock-stream)
(format *standard-output* "~%~a~%" (read-line sock-stream nil))
(force-output *standard-output*)
(format sock-stream "? CAPABILITY~%")
(force-output sock-stream)
(listen sock-stream)
(format *standard-output* "~%~a~%" (read-line sock-stream nil))
(force-output *standard-output*)
)
(usocket:socket-close sock)))
```
=>
```
* OK Gimap ready for requests from xxx.xxx.xxx.xxx hogehoge
* CAPABILITY IMAP4rev1 UNSELECT IDLE NAMESPACE QUOTA ID XLIST CHILDREN X-GM-EXT-1 XYZZY SASL-IR AUTH=XOAUTH AUTH=XOAUTH2 AUTH=PLAIN AUTH=PLAIN-CLIENTTOKEN
``` (変数 値)のリストと式が与えられた状態で、変数を値に束縛した環境で式を評価したいのですが、良い方法がわかりません
現状では次のように実装しています
(let ((bindings '((a 1) (b 2))) (form '(+ a b)))
(eval `(let ,bindings ,form)))
実際にはformに対してbindingsを変えたものが何度も呼ばれます
また、formは複雑なものも想定します
他にいい方法はありますでしょうか? (let ((bindings '((a 1) (b 2))) (form '(+ a b)))
(progv
(mapcar #'car bindings)
(mapcar #'cadr bindings)
(eval form)))
とかかなあ
もしくはformを関数にしてしまうのがいいのかな
(let ((bindings '((a 1) (b 2))) (form '(+ a b)))
(let ((thunk (coerce `(lambda () ,form) 'function)))
(progv
(mapcar #'car bindings)
(mapcar #'cadr bindings)
(funcall thunk))))
bindingだけ変えて何度も走らせるなら多分効率もいいと思う(確かめたわけじゃないけど)
インタプリタかなにか作ってるの? 👀 >>232
progvで動的変数が作られるのは知りませんでした
formの関数化も良さそうですね
mapcarによるコンシングはデータ構造を工夫してなくせそうです
だいぶパフォーマンスが改善されそうです。ありがとうございます
ある言語のサブセットを作ってます >>235
comon lisp よりも scheme の方がよさそーだ‥ 235です。
>>235
それはなぜですか。
もしよければ、意見を聞きたいです。
>>237
え、わたし(235)のこと。それともリンク先を書いた人のこと。
私自身は
ローカルなら他から呼べなくて安全といえるけど、
1つの定義が大きくなってあまり好きじゃないんです。
極端に言えば、
(1つ目の処理 ...)
(2つ目の処理 ...)
(3つ目の処理 ...)
と、書いていって最終的に
(3つ目の〜 (2つ目の〜 (1つ目の〜 ...)))
と、するのが好きなのですが
好き嫌いを超えた優劣や善悪があるのでしょうか。 元スレで作った人に聞けばいいのでは…
たぶん単純に名前空間が関数と変数で分かれてるってだけの話だと思うけど 初歩的な質問ですいません。
CommonLispをCentos6にインストールできないんですが
単純にyum 〜では駄目なんですか? sudo yum install sbcl.x86_64
じゃだめなん? Eclipse Common Lisp がオープンソース化された話があるみたいだけど、
これって 32 bit Windows でも動く?
公式には 64 bit しかチェックしてないみたいに書いてあるけど。 これはさすがにヤバイだろww
【神回】美人ニコ生主mAriAがFME切り忘れで公開オナニー!?【電マ】
https://www.youtube.com/watch?v=Y6Fz1MYedSw こんにちわ、これってどういう場面で使うんでしょうか??
関わりがないってことは特に知る必要ないんでしょうか? >>244
だまされるお前が悪い。
クソ動画見てオナニーしてろ >>246
うわ!もろに犯罪者の発想だな
「騙される方が悪い」
おまえの人生を彷彿とさせるな
犯罪人生上等君 clispって5年もバージョンアップないんだね
もう終わりか つい最近、lisp始めたんですけど、
日本語入れると、PARSE-NAMESTRING: syntax error in filename
と出るのですが、どのようにしたら、
日本語のディレクトリって作成できますか? >>250
処理系によって違ってくるから何を使ってるか教えて >>251
詳しくは知らないんだけど、
common lispで
format関数使って日本語と文字列を結合しようとするとそのエラーが出ます。 windowsのclispでcl-opencvって使えますか? 今日からLisp始めた阿呆です。本当に初歩的な質問をしたいのですが、よろしいでしょうか。
わたしは 太郎 です。
趣味は 2ちゃんねる です。
Lisp初心者 です。
というファイルを
(((#\わ #\た #\し #\は) (#\太 #\郎) (#\で #\す #\。)) ((#\趣 #\味 #\は) (#\2 #\ち #\ゃ #\ん #\ね #\る) (#\で #\す #\。))
((#\L #\i #\s #\p #\初 #\心 #\者) (#\で #\す #\。)))
このようなリストを吐き出す関数を書きたいのですが、本当に知ろうとゆえ、困ってます。
一応書いてみたのが以下のものです。
(defun test-parse (fname)
(with-open-file (in fname :direction :input)
(let (tmp (w ()) (l ()) (s ()))
(loop for tmp = (read-char in nil)
while tmp
do (cond ((eql tmp #\Space) (push (reverse w) l) (setf w nil))
((eql tmp #\Newline) (push (reverse w) l) (setf w nil) (push (reverse l) s) (setf l nil))
(t (push tmp w))
))
(push (reverse w) l)
(push (reverse l) s)
(reverse s))))
どうすれば、かっこいいLisperになれますか。
説教してください。頓首。 かっこいいかは知らんけど、split-sequenceを使うと、
(defun omanko (src)
(mapcar (lambda (s)
(mapcar (lambda (x) (coerce x 'list))
(split-sequence #\Space s)))
(split-sequence #\Newline src)))
(omanko "わたしは 太郎 です。
趣味は 2ちゃんねる です。
Lisp初心者 です。")
↓CLISPでの結果
(((#\HIRAGANA_LETTER_WA #\HIRAGANA_LETTER_TA #\HIRAGANA_LETTER_SI #\HIRAGANA_LETTER_HA) (#\U592A #\U90CE)
(#\HIRAGANA_LETTER_DE #\HIRAGANA_LETTER_SU #\IDEOGRAPHIC_FULL_STOP))
((#\U8DA3 #\U5473 #\HIRAGANA_LETTER_HA)
(#\FULLWIDTH_DIGIT_TWO #\HIRAGANA_LETTER_TI #\HIRAGANA_LETTER_SMALL_YA #\HIRAGANA_LETTER_N #\HIRAGANA_LETTER_NE
#\HIRAGANA_LETTER_RU)
(#\HIRAGANA_LETTER_DE #\HIRAGANA_LETTER_SU #\IDEOGRAPHIC_FULL_STOP))
((#\L #\i #\s #\p #\U521D #\U5FC3 #\U8005) (#\HIRAGANA_LETTER_DE #\HIRAGANA_LETTER_SU #\IDEOGRAPHIC_FULL_STOP))) >>255
おおお。ありがとうございます。
split-sequenceなんてのがあるのですね。
勉強になりました。 いろいろ参考書を買ったけど、
PAIPで禁欲的にやるのが一番いいような気がしている。
おすすめの書籍とか読む順番とかあったら教えてくれませんか。
お願いいたします。 あるサイトに
(reduce #'+ '(1 2 3))
;=> 7
6じゃないのですか? >>258
そのサイトの管理者なりに教えてあげればいいじゃない 最近はcl freaks に出ている人達を中心にcommon lispが元気ある感じするよね lispworks proかったった。
買ったからには勉強せねば。
実はまだlispなんにも知らん。 ならリスプの統合環境と言っていいか、そこは怪しいが
zxzzyあたりからやりゃ良いのに
と思う俺様
ま、いいけどな (defun fact (n)
(cond ((=n 0) 1)
(t (* (fact (1 - n))
n ))))
で
*** - SYSTEM::%EXPAND-FORM: invalid form (1 - N)
The following restarts are available:
ABORT :R1 Abort debug loop
ABORT :R2 Abort debug loop
ABORT :R3 Abort debug loop
ABORT :R4 Abort debug loop
ABORT :R5 Abort debug loop
ABORT :R6 Abort debug loop
ABORT :R7 Abort debug loop
ABORT :R8 Abort debug loop
ABORT :R9 Abort main loop
とエラーがでます。どうしてなのでしょう?教えてください。
お願いします。 スペースが入ってなかったり入っていたり
(defun fact (n)
(cond ((= n 0) 1)
(t (* (fact (1- n))
n)))) >>267
ありがとうございます。ずいぶん難しいなあと思いました。
コードを整えるためにスペース入れたらエラーなので。
規則はあるのでしょうか? >>268
- や * や = も英数字と同じ扱い。 分けるものがなければつながるというだけ。
=n とあればそれは =n という名前と認識されるし、 1- は 1- という名前。 >>269さん
教えていただいてありがとうございます。
質問をしてよかったと思いました。教えていただいたものを
知りませんでした。
関数には引数に1-をいれるというオプションのようなものが付く
という仕様になっているということがわかりました。
では >>270
> 関数には引数に1-をいれるというオプションのようなものが付く
高階関数のことを言ってるのかな。
そのあたりはどうせ避けて通れないので、
学んでいるうちにわかってくるよ。 >>270
1- って関数名ですよ?
クォートされていないリストは
一つ目の要素が関数名、以後が引数として評価されます。
例
(1- n)
1- は関数名、nは引数 (注:関数1- は引数から1引いた数を返す関数)
参考;クォートされてるリスト例
'(* 2 3 ) (quote (* 2 3))
解説 (* 2 3 )はクォートされているので関数として評価されない
あなたの初めの書き方
(1 - n)
だと関数名は1で、- と n の2つの引数をもつことになる(正確に言えば、引数- と 引数n に 関数1を適用する、となります)
すると関数1は未定義だよと言われちゃいますね
同様に
(=n 0)だと
関数名はn= で引数は0となります。
ここでも関数=nは未定義といわれちゃいます
C言語のフリーフォーマットとはことなり、LispではスペースがS式での要素の区切り(デリミッター)になります。
スペースで分ければ2つの要素になるし
スペースを消して繋げればひとつの要素になってしまいます。
ちなみに(=n 0)が正しい適用かどうかは関数定義されてるかどうかによります。もし
(defun =n (x )
(zerop x))
と定義されていれば
(=n 0) => t
ですね windowsでclispとquicklispでcffiを触ってみようと思ったんですが
(cffi:define-foreign-library test
(:windows "test.dll")
(t (:default "test")))
(cffi:use-foreign-library test)
で、testが開けません
パスは正しいし他の言語からもリンクできるライブラリですが、
何処がおかしいのでしょうか? >>271
32bitだからそんなにしないよ。
今とりあえず、いじくりまわぢてる。 自己レスですが、CLISPで散々いろいろ試したけどどうにもならなかったので
SBCLに変えてみたらまともに動くようになりましたので報告 perl の perldoc
python の pydocに相当するローカルのドキュメントは何ですか?
シンボルを調べるのに
ネットを通しているので2秒間の通信があったり、
通信可能であることに依存しているのが弱点です
'http://clhs.lisp.se/Front/X_AllSym.htm' xyzzy上でで良ければ
reference.xmlから
reference.txtや reference.chm使って補完できるよ
足りない関数名ややシンボル名は静的補完ファイルに登録するか、reference.*に追加するか >>278,279
ひょっとして >277当てか?
後出しになってしまって申し訳ない
cygwin clisp と Linux clisp を使っています
SLIMEの方はそれぞれ NTEmacs と Linuxのaptitude で入る方のemacs
だから aptitude apt-cyg svn git wget などで落としてインストールし
zsh上で pydoc ... 等と同様に呼び出したい >>280
>>277のリンク先(HyperSpec)のことなら、ダウンロードはLispWorksのサイトのこのページから。
http://www.lispworks.com/documentation/common-lisp.html
"This HTML document may, subject to certain conditions, be downloaded for use at other locations."
という段落の "downloaded" が、HyperSpecのHTMLファイル群を固めたTar書庫へのリンク。
ローカルに置いたHyperSpecを「zsh上で pydoc ... 等と同様に」参照できるコマンドは多分無いと思うけど、
EmacsのSLIMEからブラウザで開くことは出来る(シンボルの上で C-c C-d h)。
https://common-lisp.net/project/slime/doc/html/Documentation.html
設定はこんな感じ(展開したHyperSpecディレクトリをホームディレクトリに置いた場合):
;; HyperSpecのディレクトリ(URL形式)。
(setq common-lisp-hyperspec-root (concat "file://" (expand-file-name "~/HyperSpec/")))
;; HyperSpecを `eww' (Emacs 24.4 以降に内蔵のウェブブラウザ) で開く設定。
;; (それ以外のURLはデフォルトのブラウザで開く)
(setq browse-url-browser-function
`((,(concat "^" common-lisp-hyperspec-root) . eww-browse-url)
("." . browse-url-default-browser))) >>281
なるほど
ありがとう
これでもう大丈夫になりました localリファレンス用のzshコマンドのために書いた
#!/usr/bin/env python3
import urllib.request
import re
import os
import subprocess
import sys
# USAGE: this-script.py or this-script.py [Symbol]
ref_dir = os.environ["HOME"] + "/lib/HyperSpec/"
ref_top_dir = ref_dir + "/Front/X_AllSym.htm"
if len(sys.argv) == 1:
to_Symbol_list = "w3m " + ref_top_dir
subprocess.call(to_Symbol_list, shell=True)
elif len(sys.argv) == 2:
top_as_html = "file://" + ref_top_dir
with urllib.request.urlopen(top_as_html) as res:
html = res.read()
is_Symbol = 'Body/.+?#' + sys.argv[1] + '"'
url_suffix = re.sub("#.*", "",
"".join(re.findall(is_Symbol, html.decode())))
if url_suffix:
do_w3m = "w3m " + ref_dir + url_suffix
subprocess.call(do_w3m, shell=True)
else:
print("The symbol was not found.")
else:
print("Please input 0 or 1 Symbol of Lisp.") 話題になってないけど、
コンスセル原器が廃止されるらしいぞ ttps://www.jwz.org/blog/2015/10/cons-conflict-resolved-at-last/
これだね。メートル原器もなくなると言うし、
時代の流れを感じるね コンス原器とか言ってるのはもちろんネタだからな、わかってると思うけど
メートルの定義が科学的なものに置き換えられるから、そのパロディだからな? 原器は力が溢れている。 元気だから。 なんちゃってーー ネタだったのか
どういうものなんだろうと唸りながら考えていた俺 グレアムの魔道書からではなく
ホフスタッターのメタマジックゲームのlispの章を読んで
lispやりたいと思ったプログラミング初心者だけど、
emacsでmaterialというカラーテーマにして
フォントをRicty Diminished の斜体にしてから
全画面でlispのコードの見たらとても美しい言葉に見えた
美しいとそれだけでまた見たくなるから
学習意欲を保つためにはよいと思った。 >>273
ありがとうございます。今はじめて>>273さんの書き込みを読みました。
しばらく時間が経ったのでclispのことを忘れてしまいました。
ぼちぼち回復するようにがんばります。 >>292
コードの美しさを感じ取れるといいコードが書けるようになるよ
コードは書くよりも読むほうが、うんと多いから >>286
スレ違いなツッコミだがメートル原器はずっと前に基準でなくなっている
最近の話題はキログラムの方だな >>294
「land of lisp」という本にhaskellいいみたいなこと書いてあったけど、
haskellってどうなのかな
common lispとhakellもやったことがあることがある人からしたら。
lispの括弧と前置記法って一貫している感じがして好き。 Schemeだとtyped racketとか型つけるのが流行っぽいけどcommon lispも似た感じになってたりします? Haskellは時々仕様が変わるから安心して使えない >>299
うーん、ちょっと使ってみたいけど、
後からワケが分からなくなりそうで不安 > LLVMベースのCommon Lispコンパイラ「Clasp」の開発チームは11月20日、最新版となる「Clasp 4.0」を公開した。
> Clasp 0.4ではインラインコンパイラの「CClasp」を一新し、最適化機能も強化された。
https://osdn.jp/magazine/15/11/25/161300
0.4 と 4.0 を間違えるなよ大違いだろ llvmはフリーなソフトウェアの敵
みたいなことをハッカー界隈の偉い人が言ってなかったっけ? llvmやjavaなどのgpl教団に狙われやすいcl
Schemeはそんなことないのに 単純な質問なのですが、CommonLispにはリードマクロっていう構文解析機を自分で作れるてきな機能がありますが
これってなんで廃れたのでしょうか?正直最強の機能だと感じたのですが
ただ、触った感じ
・定義しないといけない事が多すぎて、自分好みのカスタマイズが時間がかかる。
・同じ意味だけど構文解析失敗したら最後に成功したところまで戻ってくれないのでコレジャナイ感がすごい。
・みんながみんなカスタマイズを好きにやって文化的に統合できなくなった
このあたりが問題かなって感じているのですが、実際Lispコミュニティーにいる人たちのご意見が欲しいです。
OnLispとかLet over Lamnbdaとかやりおえてのままの感想なので >>1
RPGツクール2000 , RPGツクールMV https://tkool.jp/mv/ ( JavaScript 採用 )
WOLF RPGエディター http://www.silversecond.com/WolfRPGEditor/
デュエル・マスターズ Android版 ,i-OS版、公式 http://dm.takaratomy.co.jp/extra/dmapp/entrygate_ds/
デュエル・マスターズ対戦CGI ex
https://web.archive.org/web/20150809154946/http://www53.atwiki.jp/dmsuishinparty/pages/314.html
デュエル・マスターズ(デュエマ)DM ONLINE 1.8a / VanGuard ONLINE 1.5a
https://web.archive.org/web/20150809160254/http://uhyohyohyo.sak ura.ne.jp/hsp.html
ヴァンガード専用ネット対戦ツール【 VanGuard Online 】
https://web.archive.org/web/20150809155032/http://kiimaa.jugem.jp/?eid=61
「カードファイト!!ヴァンガード」のネット対戦ができる公式オンラインゲーム「Cardfight!! Online」 2015年冬スタート
https://web.archive.org/web/20150809153724/http://supersolenoid.blog63.fc2.com/blog-entry-6886.html
遊戯王 Automatic Dueling System
https://web.archive.org/web/20150809164855/http://www3.atwiki.jp/ads-wiki/pages/20.html
遊戯王 デュエル・オンライン
https://web.archive.org/web/20150809171527/http://www31.atwiki.jp/vipdo/pages/15.html
https://web.archive.org/web/20140628005202/http://do.yugioh-portal.net/
ウィクロス( WIXOSS ) WEBXOSS http://webxoss.com/about_en.html http://webxoss.com/DeckEditor/
BG(ボードゲーム)Engine https://web.archive.org/web/20151209080842/https://bgengine.net/
https://web.archive.org/web/20151209172205/http://14owl.hateblo.jp/entry/2015/12/09/011234
アプレンティス マジック:ザ・ギャザリング(MtG)オンライン化 http://homepage1.nifty.com/Q_Q/ap.html
https://web.archive.org/web/20151202202725/http://homepage1.nifty.com/Q_Q/ap.html 【 オンラインTCGエディター 】 >>1,>>307
デュエル・マスターズ的な非電源TCGの 《 オンライン化ツクール系ソフト 》 制作の企画。
例えば、ガチンコ・ジャッジを直ぐにでも導入できる機能を持っておりながら、
当面それを扱わず単純化させておいて、事後的に導入拡張する際に当該システムを
ブロック構造の組み合わせで後付け挿入できるように予めシステム化してあるソフト(エディター)。
既存の非電源TCGを劣らずに再現できるならば大概のニーズに応えられる筈。
デュエマ、ヴァンガ、ウィクロス、ポケカ、デジモン、ゼクス、モンコレ、旧ガンダム・ウォー、ライブオン、ディメンション・ゼロ、シャーマン・キング、カードヒーローなど
のシステムを完全再現できるように設計するけど、他に此のTCGの此のシステムは再現希望とか有ったら書け。
マジック:ザ・ギャザリングの全システムを完全に再現するのは無理だから、此れだけは必用だ!って部分のみリクエストしろ。
個vs個、多数乱戦、チームvsチーム、個vsチームを実現し、P2P通信対戦プラグイン有り。
設計思想は 《 RPGツクール 》 が良いかな? 他に、優れたエディター有ったら挙げてみろ。
個人や企業などのベンダーが提示する開発費(見積もり)で折り合えば、発注する。
↓
エディター群から基本コンセプトを絞り込む(もちろんオリジナルで優れた新ネタが有れば導入する)。
↓
遊戯王OCGに関しては、タッグフォース、ADS、デュエルオンラインを発注先ベンダーに研究させる。
バトスピ、ヴァンガ、デュエマなど発売済みゲームソフトが存在してるTCGはベンダーに研究させる。
↓
各社TCGを再現するテストプレイ ⇒ 更に改良や修正 + コード記述の仕様書(設計書)を作成。
↓
機能制限した下位版を制作しても原則として発売せず + 上位版デュエリ−グ用でサーバー稼動。
↑
下位版を仮に発売した場合の改造および商用利用には、別途で当社との契約が必要。
さ〜て、インド人ベンダーと日本人の翻訳担当PGを見つけよっと!ww
http://wc2014.2ch.net/test/read.cgi/entrance2/1450555747/-20 こないだ出た common lisp recipes の電子版 ttp://www.apress.com/9781484211779 が2月1日までセールだとか(ダイレクトマーケティング) Pypiみたいに誰でもパッケージ登録出来るリポジトリが欲しい >>306
そもそも頻繁に使うようなものでもないし、廃れるという表現は違和感ありますな。
使う人は使っているけど、他人に迷惑をかけるかもしれないので、使用する際は注意して自己責任でやってくれと。 >>309
実用Common Lisp Kindle版も半額だなあ
翔泳社のKindle本が半額セールなんだとか bordeaux-threadsを使って標準出力に"hello" と出力しようとして
(bt:make-thread #'(lambda () (sleep 2) (princ "hello")))
としてみたけど、何も出力されなくて、
(bt:make-thread #'(lambda () (sleep 2) (princ "hello" #.*standard-output*)))
としたら、出力されました。
どうして*standard-output* で出力できず、
#.*standard-output*を使うと出力されるのでしょうか? *standard-output* がスペシャル変数だから、クロージャに参照を閉じ込められないせい。
スペシャル変数は、いわゆる動的スコープになる。 >>314
なるほどー。そういうことですか。
それで、#.を使うのですね。
ありがとうございます! 実践common lisp みたいな本を書くリスパーが少ないのはなぜなのでしょうか?
リスパーは common lisp をあまり広めたくないということなのでしょうか? 実践common lisp みたいな本を買う人が少ないから Lispってちょっと勉強でつつく人は多いがガッツリやる人は少ないからね。 >>318
にわかLisperの存在が一番Lisp族言語のユーザに迷惑なんだよねぇ orz
haskelとかjs界隈もそうみたいだけど。
良いも悪いも全部ひっくるめてLisp(あるいは言語X)で何かを作ることがすきな人にとっては大迷惑。 にわかが居ないのなんて、死んだ分野だけだよ。
成果出してればノイズは気にならないが、どんな迷惑が有るの? >>319
山は裾野が広くないと高くはなれんぞ
お前は挫折したLisperの屍の上に登れ >>320
scheme派 vs CommonLisp派の罵り合いにpythonとruby好きが横からドロップキックで乱入みたいなblogとかmlとか
黒板人の話とかにわかどうしだけじゃないのが頭痛いと思う 議論の体でそれぞれのメリット/デメリットを天秤に乗せてるだけで、
罵り合いといというわけではないと思うんだが。
ディベートですらない、茶番だろ。 Maximaが使えるcl以上の存在はあるのか?
他言語の数式処理は微妙なのしかない sbcl にて,TCP ソケットを使ってプロセス間通信するライブラリを
使えるようなりました.これによりバイト列までを送ることは出来るようになったのですが,
S 式をどうやって送ればよいか分かりません.
S 式や lambda 式をバイト列にエンコード(?)する方法などはあるのでしょうか? >>327
S式を丸ごと文字列で投げても良くない? 追加:
最近Webサーバの仕事してるんだけど、JSONとかClojureのリテラル表記(datomicの処理)でやりとりするからS式をバイナリ通信(JSONに対応するならBSON)にする意義が出る場面って凄い少ないんだよね >>328 さんくす.
そっか.データのリストなら (format nil ...) で文字列にすればできますね.
その線でまずはやってみます.
ただ,それだと関数が送れないですね.
FUNCTION-LAMBDA-EXPRESSION の出力とかを送るのかな―. 関数は環境がぞろぞろとくっついてるから、シリアライズは容易でない。
動作中のイメージをまるごと移送するのなら出来なくもないと思うけど……、そんなことがやりたいのか? Windows環境でClozure CLのホームディレクトリは%USERPROFILE%なのでEmacsの起動バッチで
%USERPROFILE%と%HOME%を独自に設定して起動してSlimeを使うとHyperSpecが引けなくなってしまう
何か回避策無いですかね〜。超不便だわ ChromeじゃなくてIEを標準ブラウザにしたら動いたw browse-url-generic-programでChromeのフルパス指定してやって一見落着じゃ
LispよりEmacsのがハードル高いわ 離れすぎているからどこが同じでどこが違うとかいうのはいちいち列挙できへんわ。
Haskell っぽい部分だってそりゃあるだろうし、場合によっては Haskell 風のコードをそのまま持ち込めることだってある。
でも、やっぱり全然違うわ。 Haskellでmaxima以上に便利な数式処理ソフトあります? バッチの中だけでも%USERPROFILE%を変えるのは副作用が大きすぎて駄目じゃ。
全然、一見落着じゃないやんけ orz なぜか関数型ってくくり方でまとめられるときがあるけどまあ全然違うわな。 Windowsでスタンドアローンアプリ化するとコンソールアプリになるけど
コンソールウインドウ消す方法はないの?
GUI画面のとき邪魔 SBCLにはGUIオプションがあった。
他のには無いっぽいな。
このスレには人が居ないんか? こうなりゃ昔めんどうみた平手の造酒んとこでも行くか 初心者でLisp全然まだ分かってなくて、本を読みながら色々実験しているんだけど、
socketで使ってunicodeのデータをやり取りしようとしたら、どうしても文字化けしちゃって困った。
:external-formatとかいろいろ試したけどダメだった。
結局、flexi-streamsってライブラリ使ったらなんとかなったんだけど、こんなことでも外部のライブラリに頼らないといけないの?
それとも僕がアホなだけなのかしら?もっといい方法あるのかな。lispworksがおかしいだけか?
でも、プログラミング自体初心者なのにやりたいことは実現できちゃったのはビックリ。
replで実験しながらできるのがいいね。 >>345
文字コードがらみは純粋なdata streamとは別の領域なんで汎用言語全部が持ってる病の一種なのでどもならんのですよ。 slime必須な開発環境がネックかもね
まあLispBoxまんま使えば良いけど 匿名通信(Tor、i2p等)ができるファイル共有ソフトBitComet(ビットコメット)みたいな、
BitTorrentがオープンソースで開発されています
言語は何でも大丈夫だそうなので、P2P書きたい!って人居ませんか?
Covenantの作者(Lyrise)がそういう人と話したいそうなので、よろしければツイートお願いします
https://twitter.com/Lyrise_al
ちなみにオイラはCovenantの完成が待ち遠しいプログラミングできないアスペルガーw
The Covenant Project
概要
Covenantは、純粋P2Pのファイル共有ソフトです
目的
インターネットにおける権力による抑圧を排除することが最終的な目標です。 そのためにCovenantでは、中央に依存しない、高効率で検索能力の高いファイル共有の機能をユーザーに提供します
特徴
Covenant = Bittorrent + Abstract Network + DHT + (Search = WoT + PoW)
接続は抽象化されているので、I2P, Tor, TCP, Proxy, その他を利用可能です
DHTにはKademlia + コネクションプールを使用します
UPnPによってポートを解放することができますが、Port0でも利用可能です(接続数は少なくなります)
検索リクエスト、アップロード、ダウンロードなどのすべての通信はDHT的に分散され、特定のサーバーに依存しません
; closによるオブジェクト指向を勉強している最中だけど、Javaやc++と違って、プライベートな変数や関数とかないの?
そうなると、あまり弄って欲しくない変数とかを弄るような危ないコードとか書けちゃうけど、それはプログラマーの裁量に任されているの? closは実行時になんでも弄れる仕組みになっているので隠してもしょうがない
その代わりJavaやC++とは比較にならないほど動的
お勉強するなら遅延バインディングなどに代表される動的さを学ぶのが有益
(定義時に存在しないクラスのスロットをごにょごにょするなど) EmacsにはCLOSエミュのeieioがあるけどそれだとプライベートメンバーが作れる
当然eieioの場合はインスタンスは配列だから無理矢理いじろうとすれば可能だけど
うっかり触る事は出来なくなる
(slot-valueでアクセス出来なくなるとかsetfで書き込めないとか) >>357
ちゃんと機能してるよ
:reader :accessor 経由だとどこでもアクセス出来る
それらを定義しないで slot-value 経由でアクセスすると
定義された class 用の defmedhod 内じゃないとエラーになる >>358は間違えた
slot-value 経由でも defmethod 内ならどんな class 用のでもアクセス出来ちゃってた…
>>357のリンク先の通りだった
もしかしたら次のバージョンなら直ってるのかもしれない Common Lispの規格を進化させようと日本人が頑張ってるサイトがあった気がしたけど全く見つからない
教えてくれ 身も蓋もないけど
コモン規格なんだから
枯れてた方が良いんじゃねーの この機能が足りないって思ったら
ライブラリ提供すればいいんだよ
規格を変えるってのは
よほど説得力がないと難しい Common Lispのこの関数はこうすべきだったとか色々書いてて面白かったが
ふと思い出してまた見たくなったけどググっても全然出てこなくて余計に見たくなってる…
もう少し探してみるよ
slideshareだったかな… CommonLisp好きだけど未だに関数をfuncallで呼ばないとイケナイ名前空間の扱いだけは理解できない。
なんで分けたんだろうって解説どこかにないかな? >>366
物事をカテゴライズして名前空間分けたいってニーズは別に変じゃない。
そういうの他の言語でもあるよね。
察するに言語設計者自信がその時偶々欲しかったのが入っちゃうんじないかな? 動詞と名詞を兼ねる単語が多すぎる英語にそもそもの問題があるやも
list然りmap然り 質問だけどAllegro CLで実行ファイルを作成するとサイズはどれぐらいになる?
SBCLだと40MB超えるけどAllegro CLだとどうなるか気になったので よく見たらAllegroで実行ファイルを作成出来るのはEnterprise版以上だった
そもそもEnterprise版を使った人がいなさそうだな… それは、「お前ら貧乏人ばかりだな」と言ってるのと同じだな。 >>372
いや、流石にAllegro Enterprise を個人で買うのは滅多居ないだろw
つかオンライン販売も小売りもとりあえずsalesへメールからってくらいだし、そもそも買ってる人自体特定業種のプロだけじゃねぇの? 数理システムだと社内で使ってるんじゃないの
中の人はこのスレ見てないか Professionalだと6万ぐらいだから個人でも買えなくもないけど
Enterpriseはいくらすんだろ?
数十万はしそうだけど仕事で使うんなら払える額でもあるな >>375
まじ6万?!
Lispworksより安いような。 >>376
Professinal版って32ビット版しかないかじゃないか? LispWorksの実行ファイル書き出しは最小で6.5-7.5MBぐらいからみたいだからかなりいいな
けど64bit版がfor Hobby Usersとか書いてるくせに$1,500とか高いし… ECL使った事ないけど実行ファイルを作成したら普通にC言語で作ったぐらいのサイズになるんだろうね
あと似たようなのにClaspがあるけど埋め込みするには今後はこっちが主流になるかな Common Lispの処理系がわざとバグを入れてmaximaが動かなくなるように仕向けてるようなのを見つけたのだけど
Abclとclispはgnome3と同じ状態になってる? maximaは主に古い仕様のcommonlispで動く
処理系が古い仕様のサポートをやめることをmaxima切り捨ての陰謀とするなら
そうなんじゃないの
maximaが合せるのが筋だろ 互換性を保てないならcommonなんて名乗らないでほしい sourceforgeが死んでてMaximaのサイトにアクセス出来んぞ…
SBCLのサイトにもアクセス出来ないしCL界隈はsourceforgeに依存してるとこが多いな フリーソフト作る目的でAllegro CLのAcademic版のEnterprise版買った方いませんか?
非商用目的で64bit版の実行ファイルを作れるとなると、Enterprise版でAcademic版を買うのがよいのかなと。
(そもそも、条件にマッチしてるかわかってないですが)
Academic版ならEnterpriseでも意外にお手頃価格で買えたりしないかな?
そういえば、Allegro CLの日本代理店って撤退したんですかね?
HPが消えてるのか、アクセスできないですね。 >>388
Allegroはなぁ、ネタに値段書いていない銀座の寿司屋のイメージが 何千桁もあるbignumを適当な所に小数点を打ったり10桁毎にスペースを入れたり
100桁毎に改行して表示したいけど、formatでやる方法があったら教えてくれ >> 390
ない.
調べるよりプログラム書いた方がはやい.loopマクロで5行位で書ける.
どうしてもformatつかうなら自分で書いてformatの~/で呼べば? >>390
(format t "~,,' ,10:D" 222232244629420445529739893461909967206666939096499764990979600)
222 2322446294 2044552973 9893461909 9672066669 3909649976 4990979600
> 2.3.1 ~D ― Decimal
> arg の消費: 1個
> パラメータ: ~ mincol , padchar , commachar , comma-interval D
(中略)
> ` : ’ で修飾すると,下から comma-interval 桁ごとに commachar で指定された文字で数字を区切る ( comma-interval のデフォルトは3, commachar のデフォルトは ` , ’ ) .
http://super.para.media.kyoto-u.ac.jp/~tasuku/format-func.html
上の例だと commachar は空白、comma-interval は 10、他のパラメータは無し
文字をパラメータにする場合その文字の頭に単引用符 ' を付けて表す
改行もOK
(format t "~,,'
,1:D" 123)
1
2
3 返答どうも!
>>391
formatのドキュメント見ても無さそうだったから聞いてみたけど、やっぱりないんだね…
素直にloopでやることにする
>>392
そうか、カンマをスペースにすれば10桁区切りは出来るのか
100桁目を改行に出来れば最高だが、あまり大きくないbignumならこれで十分か
とりあえずありがとう 学習用にC++で書いた楕円曲線暗号のデバッグの時にBignum何度も目視したの思い出してちと鬱が入るなぁ 日本人コモンリスパーで有名な人って誰?
竹内センセーと苫米地ハカセ以外で! 竹内センセーと苫米地ハカセは国際コモンリスパーとしての認知度は低いヨ
もちろんtakの竹内センセーは知られているけどコモンリスパーじゃないネ
トマベチ? ダレ?
fukamachi ,kuroda は広く知られているヨ 何がまずいのかわからん。
誰か教えて。
(defun f (x) (* 2 x))
(defun g (y z) (y z))
(g f 3)
*** - SYSTEM::READ-EVAL-PRINT: variable F has no value
The following restarts are available:
USE-VALUE :R1 Input a value to be used instead of F.
STORE-VALUE :R2 Input a new value for F.
ABORT :R3 Abort main loop >>398
(defun f (x) (* 2 x))
(defun g (y z) (funcall y z))
(g #’f 3)
6
Ref.
http://www.asahi-net.or.jp/~kc7k-nd/onlispjhtml/functions.html Scheme 系だと
(define (f x) (* x 2))
(define (g y z) (y z))
(g f 3)
6
って書けるんだね。 関数型のブームは来てるけど
HaskellとかScalaに押されてない? GNU makeやgdbにguileがリンクされるようになったよ
もう少しの辛抱や Common Lispはマルチパラダイムの言語だ
goto(go)すら存在する >>405
goはマッカーシーのlispからあるけどお。すらってなにい? >>406
Common LispのスレでCommon Lispと言って何か問題あるか? >>366
Steeleが互換性考えて別にしたけど
やっぱり一緒にしとけばよかったーと後に述懐していた その代わりCommon Lispはlistとかstringという変数名を定義出来る
Schemeの場合lstとかlsって変数名にせざるを得ない
あとapplyの方が使用頻度が高い気がするがSchemeでも普通に使うわけだから
funcallを使うのは一貫性があるとも言える 今となっては後の祭りだし慣れないしとあるが、lisp-1にするなら最初の関数名をもっと考えた方が良かったような。
listじゃなくてmklistとかさ。 0や""はtrueなのに'()だけがfalseになるのが美しくないからだろう
C言語の0みたいに特定の値が自動的にfalseになるのは古い言語だからだな いずれの仕様であっても特に美しいとは思わんな。
決め事でしか無いように思う。 デフォルトコンストラクタと等しい値はすべてfalseにしてしまえ。 ふと、このスレを見つけたので質問します。
「Land of Lisp」を参考に、CLISPでCommonLisp勉強してるんですが、LEPL
じゃなくてLispのコードをエディタで書いて一度に実行させるなんて
ことはできるんでしょうか?
出来るなら方法を教えてください。参考サイトなどでも構いません。 >>417の書き込みの訂正
LEPLじゃなくてREPLです。 うちはSBCLだけど、たぶんloadでできる
$ cat hoge.lisp
(defun twice (f x) (funcall f (funcall f x)))
(defun dbl (x) (* x 2))
$ sbcl
This is SBCL 1.3.6, an implementation of ANSI Common Lisp.
(略)
* (load "hoge")
T
* (twice #'dbl 3)
12 >>419
おおおお
出来ました!!!
サンプルプログラムまで書いていただきありがとうございます。
Lispを初めて日が浅いのですが、とても分かりやすかったです。 clisp の場合は
clisp a.lisp
という風にファイル名を指定するだけでも実行できるよ
この場合REPLとは異なり、特に何もしなくても自動的に終了する
sbcl には同様のことをする --script オプションがある >>421
なるほど、そういう方法もあるんですね。参考になります。 多分emacsでSLIME使うのが一番捗る。ある程度やって、もっと環境良くしたいと思ったら導入してみるといい
ファイルに書きなぐって一部だけ評価するとかできる (defparameter param #\a)
を生成するマクロ
(defmacro ch! (ch)
`(defparameter param #\,ch))
が、動かないのはなぜでしょうか?
教えて下さい。 >>425
面白い。426のいうとおり
リードマクロがマクロの展開より先に展開されるのがうまく動かない理由。
(defmacro ch! (ch)
(read-from-string (format nil 424です。
>>426
ご返答ありがとうございます。
「入力マクロを何と心得ておる」
リードマクロの事でしたら不勉強でした。
1文字づつ地を這う様なカスタマイズに思えて
lispっぽさが感じられず読む気が無くなるんです。
>>427
書きかけの続きを
ぜひ読みたいです。おねがいします。
macbookのOSX10.6で
iterm上のvimで選択したS式をscreenを介して
もう一つのitermで動くsbcl(又はclisp)に評価、
出力させるのを目標にしています。
なにか知っている事があればよろしくおねがいします。 >>428
割とマジでLispで遊ぶならEmacs使う方が良いような(Slime環境とか https://common-lisp.net/project/slime/)
vimとかよりかなり楽(emacsのキーバインドで死ねるって人には向かない)
つかLisperならEmacsと心中するのが吉
#って感じなEmacsと入水心中の俺 orz
#Clojure含めてEmacsとLispってマジでモダンなエディタに移行するのがムリ 独り言だが
ClojureとClozure CLってべつものなのか
Clozure CLはjava関係ないのね conditinのerrorクラスにformat-controlとformat-argumentがないのは何んでなんでしょうか?
simple-conditinとかにはあるのに 生まれて初めてLISPをやってみようと思い、CygwinのCLISPを入れて見たのだが、プログラムを保存する方法が特にないのは驚いた。
dribbleでインタプリタのコマンドライン履歴を保存するか、(EXT:SAVEINITMEM)でインタプリタのメモリイメージを保存するくらいしかできないみたい。
あるいは事前にテキストで書いておくか。
他のLISP処理系もこんなものなの?
ヒューレットパッカードRPL言語を少しだけ使ったことがあるけど、あっちは保存がちゃんと考えられていた。 >>437
えっ ちょっと待って
今ラジカセ用意するから...間違えてLOADって打たないでね >>436
RPLだと関数も変数も必ずファイルとして存在する。
RPLの祖先のForthも同じかもしれない。 ほしいのは、emacs+slime環境?
あるいはaclとかlispworks REPL環境じゃなくて内蔵エディタみたいなのを期待してたんだろう
確かにメモ帳程度のでも内蔵されてれば便利だとは思う
特に初学者の人とか。いきなりEmacsは敷居が高い >>442
emacs環境だとLispよりもemacsの勉強になってしまうからなあ >>442
>>443
同意、最初からEmacsは難しすぎる
LispよりEmacsの方が難しいくらい >>442
emacsのlispってemacsのカスタマイズ用途なのでは?
アプリ作成用のlispがまだあるのかどうかは知らないが >>447
その情報のソースってどこかにある?
CLISP自体かなり前から更新されてなかったから終わったと言っても今更感があるけど… >>449
長年更新していないので、オワタ可能性は高くね? Lispの仕事ってまだあるのだろうか?
古いシステムの保守程度? どっかの会社で、common lispでやっているところがあったはず
完全に廃れた感じはしないな Lispと言えば、研究用途かWebサーバーで使うようなイメージしかないわ お前の抱えるイメージなんかに誰か興味を持つと思ったのか? >>456
でも実際に何に使われているんだ?
研究専用言語だと思っていたのだが。 >>456 みたいなBOTに使われているという実例 LispはUNIX以外で実用的に使うのは無理なのかねえ? lemのgithubのページでインストールにros install cxxxr/lemしろと書いてあって
roswell使うのは分かるけどroswellってどっからインストールしてんの?
cxxxr/lemという引数を見る限りgithubからインストールしてるような気がするけど roswellどのサーバーにアクセスするとか一切ドキュメントに書いてない
こんな糞アプリ使えるかよ ここで聞いてももう駄目
githubのissueかtwitterかredditのr/lisp_jaかja.stackoverflowのlispタグのどれかが良い ttps://github.com/roswell/roswell の Installing scripts に
$ ros install fukamachi/qlot # will install it from the GitHub
って書いてあるけど知りたいのはこれじゃないってこと? >>404
言語組み込み解禁で誰かがluaに変えると予想 わかる人いたら教えて下さい。
iterm2でrepl(sbcl)を最初から起動させようと
replというプロファイルを作り
.bachrcに
if [ "$ITERM_PROFILE" = "repl" ];
then
sbcl
fi
と書くと、たしかにsbclを実行するのですが
以下のメッセージが出て起動しません。
fatal error encountered in SBCL pid 3042:
can't find core file at /usr/local/lib/sbcl//sbcl.core
どうしたら良いのでしょうか。
ちなみに再度sbclと入力するといつも通り起動します。 コマンドで呼んでいるsbclとスクリプトで呼び出しているsbclが違うんじゃないか?
パスを確認すると良いとおもう
sbcl --core コアのパス/sbcl.core と明示しても解決するかもしれない Common lispからpythonの特にnumpy関係のライブラリ使う方法ないのでしょうか? >>474
なんでcommonlispからソレが必要になるのかがまずわからんがrationalでは扱えないくらいでかい桁数の浮動小数値なの? Pythonだとpandasとかにある関数がないからpythonをffiで呼べないとclでdeel learningきついなあ
Sparse matrix計算も出来ないみたいだし Cのプログラムがcuda使うと100倍速くなるのに
cl-cudaマクロがせいぜい7倍ぐらいしか速くならないのは何故? >>477
行列のかけ算とかだとopenblas(マルチコアCPU)とcublas(CUDA、GPU一枚)で俺の環境だと7倍程度の差しかないし、多分比較対象のCプログラムの書き方が相当まずいだけだと思う >>476
密行列はLLA、MGL-MATがopenblas/MKL/cuBLASのラッパーになってる。
疎行列なら現状ラッパーが多分ないのでCFFIでcuSPARSEへのバインディングを書こう。
全結合のディープラーニングならMGLでCommon Lispのみでできる。
PythonのClojureライクなLisp方言ならHy(hylang)がある。
Pythonのライブラリが直接使いたいならこれを使えばいい。 初心者です ハマってしまったので助けて下さい!
ファイルを読み込んで a=abcのような行を
(defparameter *a* 'abc)のようにするマクロなのですが
(readconfig "filename") だとうまくいくのですが
(readconfig (concatenate 'string "file" "name"))のように呼び出しても引数が評価されずにそのまま渡ってしまいます。
(defmacro readconfig (filename)
`(progn
,@(loop for i in
(with-open-file
(s filename :direction :input :external-format :utf-8)
(loop :for line := (read-line s nil) :while line :collect line))
collect
(let* ((l (split-sequence:split-sequence #\= i))
(a (read-from-string (concatenate 'string "*" (car l) "*")))
(b (second l)))
`(defparameter ,a (read-from-string ,b)))))) >>480
macroexpand で展開してみた? >>482
concatenateの方はエラーがでます
普通に文字列を渡せばうまくいくのですが >>480
どうしてマクロにしたの?初心者だから? >>484
関数の中で(eval `(defparameter ,変数 ,シンボル))とすると変数がありませんというエラーがでてきて
普通にdefparameterしようとしても変数定義はされないのでマクロでやるしかないと思いました。
(eval `(defparameter ,変数 ,文字列))だとうまくいきますね 問題が解決できました evalはあまり使っちゃいけない的なことが言われてたと思うので
なんとなく気が引けてマクロを使っちゃった感じです 初心者の質問に付き合ってくださりありがとうございました! OpenCVの超解像計算プログラムは
cpuとgpuで100倍近く速度に差があるよ typed racketみたいな型推論をcommon lispでする方法ないのでしょうか? >>488
common lispのコンパイラでも型推論くらいするの知ってるか?
それがどう駄目なのか,どうしたいのかをまず書けよ. sbclのtheのdescribeに相当する機能がtyped racketだとreplからしか使えないような意地悪されてるのでcommon lispでもそうかと思った sbclのdescribeで
https://github.com/sbcl/sbcl/blob/master/src/code/describe.lisp
derived-typeの情報だけ取り出して他の変数に格納したいのに
うまくいかない
streamに文字列出力する関数だからstreamの文字を正規表現かなにかで切り分ける方が良いのだろうか >>490
> sbclのtheのdescribe
が意味するところが分からない. Common lispでcのプログラムコード読み込んで
関数宣言一覧取り出して、ヘッダーファイル生成するような
パーサージェネレーターのサンプルコードどこかないでしょうか
c言語の解析するサンプルコードなら他のでも良いです 誰か知っていれば教えてほしいのですが
LispWorks 7.0 のmacOS版って日本語表示や日本語入力問題なく
できるようになっていますか?
LispWorks 6.1 Personalを使っているのですが日本語入力すると??に文字が
変わってしまうみたいなので。 ☆ 日本の、改憲を行いましょう。現在、衆議員と参議院の
両院で、改憲議員が3分の2を超えております。
『憲法改正国民投票法』、でググってみてください。国会の発議は
すでに可能です。平和は勝ち取るものです。お願い致します。☆☆ 僕の知り合いの知り合いができたパソコン一台でお金持ちになれるやり方
役に立つかもしれません
グーグルで検索するといいかも『ネットで稼ぐ方法 モニアレフヌノ』
HSR58 ところでlabelsって関数の名前の由来って何?
しっくりこない >>477
そもそもCLはインタプリタだからGPU使っても7倍程度しか速度出ないのは当たり前だろ。 >>500
clはコンパイラ言語だよ.仕様上インタプリタ実装も許容されているだけ こないだ迄Windows10の64bit版ではDEPの絡みで動かないと思ってた、SBCL版のMaximaが、
今試してみたらあっさり動いてしまいました。
sf.netに置いてあったインストーラでインストールした直後はCLISP版しか駄目だった
筈なんですが…。
うちではWindows10 Homeを使ってますが、皆様の処ではどうでしょうか? SBCL自体を別途インストールしたのが効いてるのかも知れないなぁ…。 Lispってwebフレームワークありますか?
一通りの機能のあるブログを作ったり出来るような 質問です。
Lispで書かれたLisp処理系はありますか? roswellについての質問なんですが
ros init ファイル名
としたときできるファイルの中身の
(progn ;;init forms
(ros:ensure-asdf)
;;#+quicklisp (ql:quickload '() :silent t)
)
って何ですか?
(ros:ensure-asdf)特にこれ >>509
そんな事俺に聞かれても知るわけないやろ頭おかしいんか? Common LispからC言語のモジュールを呼ぶ方法は簡単に見つかるのですが
C言語からCommon Lispプログラムを実行する方法が見つかりません。
GaucheならC言語からインタープリタを起動できるみたいなのですがCommonLispにはないのでしょうか? >>512
ただ別プロセスで処理系を起こして、そこの repl で評価できればいい・・というだけなら、 fork と exec で済むかも。
CからLisp関数を直接呼んだり、C関数でLispオブジェクトを直接扱うとかするのは、がっつり処理系依存だけど出来ることは出来る。
たぶんこの目的なら ECL が一番簡単だと思う。それっぽい例もあるし:
https://gitlab.com/embeddable-common-lisp/ecl/tree/develop/examples/embed
SBCL や Allegro CL でも出来るみたいだけど、かなり大変。
というのも、C関数が動いてる間にLisp処理系のGCが走ると死ぬ・・とか諸々あるので。一応リンクだけ:
http://www.sbcl.org/manual/#Calling-Lisp-From-C
https://franz.com/support/documentation/10.1/doc/foreign-functions.htm#lisp-from-c-1 Lispでグラフィカルにステップ実行できる方法ってEmacsでSLIMEやるしかないですか?
LispのためだけにEmacs覚えるのは勘弁してほしいので
VimでSlimv入れてやってみましたがGDBのようなステップ実行しか出来ませんでした。 すみません、勘違いでした。
edebugのように現在実行している行がわかるステッパ?が利用したいのですが
edebug以外にないでしょうか? >>514
「グラフィカルにステップ実行」と言ったらVisualStudioみたいな感じかと思うけど。
LispじゃなくてSchemeでもいいならRacketはどう?(ダメだよね ;_;)
かなり昔にDrSchemeって名前だった頃にちょっと遊んでみただけだけど。
https://docs.racket-lang.org/drracket/debugger.html Lispでドルマークって特別な意味ありますかね?正規表現とかナシで Land of Lisp、文字が小さくて読めない…(´;ω;`) だれかChocorateyにRoswell追加してクレメンス Windows版Roswellでinstallコマンド出来ている方はいますか?
sbcl-binのような末尾にbinがついて、ビルドが不要なものはインストールできるのですが
それ以外だと、msys2の有無にかかわらず~/.roswell以下にmsys2がインストールされて
それが全くまともに動作せず何もインストールできません。 最近Lispを勉強し始めた超初心者です。
関数型言語も初めてです。
末尾再帰の最適化をするとコンパイラがループにしてくれるので効率がいい、の説明が腑に落ちません。
再帰は読むのも書くのもループより高コストだと思いますが、
その結果がループ並みに早くなる、では何のために再帰にするのかわかりません。
なにか他にメリットが有るのでしょうか。 >>524
関数呼出しっていうのは、一般的なコンピュータの中でどのような
動作をするかというとその実態はジャンプとスタック操作でしかない。
再帰であろうとループであろうと中ではただジャンプしてるだけだよ。
(実際にはリソースの管理とかが一体化してるのでそう単純でもないんだけど。)
再帰というのがスタック操作をするループであると捉えるか、
ループというのがスタック操作を省略できる再帰であると捉えるのかは
別の側面から見ているというだけで同じことを言ってる。
どっちを軸するかという説明の仕方の違いってだけ。 >>524 が聞きたいのは、それを再帰として書くことの利点だと思う。
読み書きのコストは慣れの問題で、分野によっては再帰で書くほうが慣れてるんだよ。
関数型言語の界隈は数学寄りの人が多いんだけど、数学は再帰で書くことが多いんだ。
関数呼んでるだけだから、ループ用の特別な構文がいらないってのもある。
これはどっちかっていうと言語の規格とかそっち側の都合だけど。 あ〜、そっか。
Common Lisp 的にはそこまで積極的に何もかも (明示的に) 再帰で書くスタイルを推奨しているわけではないし、
ループ的に書く方が読みやすければそう書いてもいいんだが、
他の言語に比べれば再帰を理解している必要は有るので、
チュートリアルの類では過剰に再帰を推してる感じがするかも。 ループはiの様なループ変数が必要だけど、これは変数への破壊的代入または再代入になる
関数型プログラミングはそれを嫌う
末尾呼び出しの最適化を前提に書けば破壊的代入無しにループが書ける 526 にも書いてるけど、変数の破壊的代入と再帰と末尾呼び出しの最適化はそれぞれ別々のものだと思うけどね
(let ((i 10)
(closures nil))
(labels ((iter ()
(if (zerop i)
nil
(progn
(push (lambda () i) closures)
(decf i)
(iter)))))
(iter)
(mapcar #'funcall closures)))
⇒ (0 0 0 0 0 0 0 0 0 0)
(let ((i 10)
(closures nil))
(dotimes (i i)
(let ((i i))
(push (lambda () i) closures)))
(mapcar #'funcall closures))
⇒ (9 8 7 6 5 4 3 2 1 0) >>530
上と下が随分違うコードで比較して何が言いたいのかよく分からん…
上のコードは
(let ((i 10))
(labels ((iter (n closures)
(if (zerop n)
closures
(iter (1- n) (cons (lambda () i) closures)))))
(mapcar #'funcall (iter i nil))))
⇒ (10 10 10 10 10 10 10 10 10 10)
と書けば破壊的代入を避けてループが書ける
closuresも破壊的代入してたけど、Common Lispだと簡単にそういうコードを書いてしまう
結局破壊的代入無しにループ書くには再起呼び出しが必須と言うだけだ
再起呼び出しは簡単にスタックオーバーフローするから末尾呼び出しの最適化は前提でしょ すげぇ歴史がある言語のわりに全然ドキュメントもライブラリもないっすね… ドキュメントがまだないのはまだ始ってないから。
もう少し待て。いつか必ずブームがくるから。 lisp勉強中だが他言語しばらく触った後lispに戻ってくるとコード見るだけで笑えてくる Juliaって何かと思ったら新しい言語か
JuliaもそうだけどASTのレベルを構築出来るマクロをLisp-like macroって言うのは違うだろうと思う
Lispのマクロはコードの見た目を変更するという至極単純で唯一無二のものだからな > Lispのマクロはコードの見た目を変更するという至極単純で唯一無二のものだからな
って言うのは違うだろうと思う LISP 的なマクロというのは
「プログラムはリストであり、リスト操作によってプログラムを変形する」
と私は捉えているので、前提となる「プログラムはリスト」の部分がないと
やっぱりちょっと LISP 的とは言えないかな〜とは思う。
ただ、各言語の構文木の表現がリストと言えるかどうかはかなり微妙だし、
Scheme のように明らかに LISP 系の言語でもそのマクロ機構 (syntax-rules) がリスト操作
と呼べる範疇なのかどうかは人によって感覚が違うかもしれないというのもわかるので、
ふんわりと捉えてあげてもいいんじゃないかと。 Lispってカッコだらけで視認性悪いのに何で最後に)))))って閉じるコーディングスタイルがスタンダードっぽいの?
(some
(some
)
)
こうやってネストと閉じカッコを対応させておけば閉じ忘れしにくくて視認性も良いと思うのだが Lisperはカッコを見ずにインデントを見る
カッコだけの行が有るとかえって分かりにくくなる
EmacsならRainbowDelemitter使うとカッコの輝度が下がって目障りでもなくなる slime の C-c C-] とか一気に全部かっこを閉じるコマンドを使うから、閉じ忘れとか気にしないなあ XMLのタグみたいなもんだな。XMLがそれを理由に廃れたことも含めて。 >>547
> カッコだけの行が有るとかえって分かりにくくなる
完全にカッコ見とるやんw
カッコつけんなエアプw >>550
カッコだけの行が有るとインデントが分かりにくくなるという意味だが、わざわざ書かないと分からんか? (a))))
の部分のaだけ頻繁にコメントする時は不便に感じる
↓
(a)
)))
にしていいよね? わかる。
(hoge
(fuga
(piyo))) ; ここにコメント書くと、式全体を閉じるということに書いてる気がする
(hoge
(fuga
(piyo) ; こう書くと、 (piyo) 式にだけコメント書いてる気がする
)) >>553
Emacsだと(a)))で(a)だけ選択してM-;すると自動でカッコがよけて
(a)
))
になるから、そういう状況にはしょっちゅうなる C系の言語から来ると最初は閉じ括弧の行がないのが気になるかもしれないが
すぐ慣れてむしろ邪魔になるゾ
というか今どきのスクリプト言語みんなそうじゃないか かっこの話題になるとわらわら湧いてくる陸リスパーさん達w >>559
なんや急に本物て?偽物の自覚でもあったんかおまえw にわか認定したい奴が沸いてんのかね
Lisperなんてカッコに嫌悪感がなければそんなに労せずなれると思うけどね >>562
そのセリフはせめてリスパーになってから言ったらどおや?陸リスパーさんw 陸リスパーの定義を述べよ。
リスパーの定義を述べよ。 >>563
陸リスパーはリスパーじゃないらしいが、意味が分からんw
取り敢えず知能指数が75程度かね defmacroだとdestructuring bind?が使えて
(defmacro test ((a b &optional c) d)
(print (list a b c d))
nil)
(test (1 2) 4) => (1 2 NIL 4)
みたいに書けるけど、&optionalや&keyの後に書こうとしてもSBCLだとdefmacroを評価した時点でエラーになる
&restの後ろには一応書けるっぽい
必須引数と&restの所には書けるけど、&optionalと&keyの所には書けないという認識で良いのか?
もし&optionalの所に書けるなら書き方を教えてくれ >>574
この記事見たらちゃんと書けることが分かった
自分が前に試した時は何か書き方を間違っていたようだ
取り敢えずモヤモヤが晴れたんで助かりました コードを C や perl や Lisp や python に書き換えて速度比べていたんですが
perl に速度負けしたのは、ちゃんと Lisp 書けるようになれば逆転できますかね?
処理系は CCL Version 1.11.5/v1.11.5 (WindowsX8632)
perl に負けるのは悔しいんですよ 早い
まだリファクタリングしてないのにこの速さ
ありがとうございます。ここまで scbl が速いとは
0.331 C
0.616 scbl
0.749 perl
0.943 CCL
2.912 python CとPerlが2倍程度しか違わないとかどんなコードか気になる
普通二桁違ってもおかしくない 最適化コンパイルしているか疑問
もっと早くなる気がする gcc でも gcc -Ofast -march=native でも
このコードは早さ変らなかった
Cをもっと早く走らせる書きかたはあると思う
しかしながら当面の目標は、Lispなどで
早く走るコードに仕上げることだ squeakやpharoみたいな完全フリーなIDEってないの? Emacs+Slimeで困ってないとかそういうのじゃなくて IDEを強調するならフリーなやつは存在しないんじゃない
有償ならLispWorksとかあるけど おそらくこんなのを求めてるんじゃないかな
ttp://www.lispworks.com/products/ide.html squeakやpharoはフリーなのにLispはなんで誰もフリーで作らないの? じゃあ世界中のLispプログラマは丘リスパーなの? だからEmacs+slimeで事足りてるって言ってんだろ
頭悪いの? マジアスペなのか何かのギャグで言ってるのかわかんないよw
それはわかってるし、そんなことは訊いてないんですけどw 漏れには ID:9d3EeJ1d がアスペに観える 質問はこれね、答えはyes/noしかありません
おk?
583 自分:デフォルトの名無しさん[] 投稿日:2019/09/21(土) 00:38:07.12 ID:xRjuzSxf
squeakやpharoみたいな完全フリーなIDEってないの?
584 自分:デフォルトの名無しさん[sage] 投稿日:2019/09/21(土) 00:44:47.91 ID:9d3EeJ1d [1/4]
Emacs+Slimeで困ってないとかそういうのじゃなくて 64bitのときって引数6個まではスタック使わずにレジスタ渡しなんだな 非LISPマシン(≒汎用CPU)上でのLISP処理系でCDRコーディングが流行らないのって何で? CDRコーディングはメモリを節約するためのものだけど、今時そんな事する必要がないからだろ 結局早く走らせようとすると面倒なコードにしかならなかった思い出 CDRコーディングでメモリ参照の局所性などは向上するのでむしろ現代のCPUで効果があるという話もある
CommonLispの場合,リストはイミュータブルでないので書き換えが発生すると間接参照に置き換わるためどこまで旨味があるかだが たかがリストの参照に条件分岐が必要になるから、むしろ現代のCPUには速度的に致命的なペナルティが有る
Lispはリストの使い勝手が良いからつい何でも使い勝ちだけど、ある程度以上の可変長のデータには可変長配列を使うべきだろう 先生質問です!モダーンな言語に慣れた身としては、括弧よりもシンボルが大文字なことが気になります!
SQLと一緒で、なんだか怒られているような、コードに怒りの感情がくっついているような感触がします! クラス名とインスタンス名がどっちも先頭小文字文化で区別がつかないことや
カプセル化を事実上放棄していることについても触れてあげてね >>604
カプセル化を放棄してるってどう言う事?
プライベート変数の事言ってるなら可能だろ setf 万能な感じだけど
オブジェクトの外からsetfしたら書きかえられたり
なんてことはないよな? cl4py で ~/.roswell/local-projects のパッケージ読む方法がわからないです
内部的には sbcl --script をpythonから実行しているので,
これと同じことを ros runでできれば良いはず ~/.roswell/local-projects
~/.quicklisp/local-projects
~/quicklisp/local-projects
全部統一したい.おすすめの設定はありませんでしょうか? Dex:get でURL エンコードは自分で変換するしかないのでしょうか
http postでHmacなる暗号化かけてpostする方法がわかりまでん https://quickref.common-lisp.net/index-per-library.html
ここに沢山あるパッケージは,名前から中身を類推するしかないの?
このパッケージはテキスト処理で,数値計算でみたいなカテゴリー分類が見たい 実践CLが適価で出ていたので次に読もうということでポチりました
それを引き取りに行きましたところ
ふらーっと棚を見たらPAIPとLOLとガウディ本が適価で置いてありやがりまして
全部いっちゃいました><
まだGentle Guideの最初の方読んでるところだとういうのに…どうすんだこれ >>620
なんだこれw
こんなものが有ったのか
これを最後までこなせばマジでLispマスターかもな
知らんけどw オレがLispマスターになるために、誰かHyperspecを読みやすい日本語に翻訳してくれませんか はじめてなら先に Erlang やれ
Elixir じゃなくて Erlang な そういうわけでGNUのEmacs Lispプログラミング入門読み始めたのだ >>601
基本はイミュータブルって事にしておいて、書き換えなきゃならなくなった時は
都度ミュータブルに変更(≒実際にはミュータブルに見える)とかは無し? コピーオンライトっていうもっと簡単な用語があった
orz quicklispの動作確認のためのhollow worldしかない単純なパッケージってないのでしょうか? >>587
smalltalkは良くも悪くもIDE込みの言語だからな。 >>631
「動作確認」が何を意味するのか微妙だけど・・
Quicklisp client が入っているかどうかだけなら、REPL で
(ql:client-version)
とか打って "2019-02-16" とか返ってくるのかを見ればよさそう。 Pattern matchで一番使われているのはoptimaなんです?
速度なくて良いので、もっと実装が単純なの探してます
それからquicklispにonlispのコードまとまってるパッケージないですか 実装が単純ってのを基準にライブラリ選定するやついるか?
quicklispに教材は集積されてないんじゃないの.知らんけど コモンリスプの最初の教科書として『これがLispだ』を読み始めた
最初の方で、読み進むためのツールとして「pp」というマクロが紹介されてるんだけど
SBCLで動かなくて困ってます
2バージョン紹介されてるんだけど、どこをどうしたら動きますか?
CL-USER> (defmacro pp (fun)
(list 'pprint
(list 'quote (append (list 'defun fun)
(cdr (symbol-function fun))))))
CL-USER> (defmacro pp (fun)
(list 'quote (list 'defun fun
(cadr (symbol-function fun))
(caddr (caddr (symbol-function fun))))))
ワーニングのメッセージもコピペしたほうが良いですか? on lispのコードはポール・グレアムのサイトから落とせるよ Macro expandの結果がslimeだと
#1=
みたいのなくて、全部代入されて展開されるのに
コマンドラインからだと、ところどころ出てくる
この代入みたいなの出てこないような設定出来ないのでしょうか >>636
ここを
(symbol-function fun)
こうすると動きます
(function-lambda-expression (symbol-function fun)) >>638
*print-circle* を nil にするといいはず
(setf *print-circle* nil) …動いたは動いたけど、目的の動作ではないような…
関数定義のプリティプリントをするマクロなんですが… >>642
残念ながら、必ずしも function-lambda-expression で「関数定義」を得られるとは限りません。
nil を返す場合もあると言語仕様で定められています:
> The primary value, lambda-expression, is function's defining lambda expression, or nil if the information is not available.
http://www.lispworks.com/documentation/HyperSpec/Body/f_fn_lam.htm
SBCLの場合、ユーザー定義関数なら期待する結果になるようですが、
組込関数に対しては nil を返す実装がほとんどのようです(手元の処理系はすべて nil を返してきました)。 clhsの読み方がわかんないんだけどpprintは代用にならないのかな >>529
ループで書くと変数への再代入が必要になるから〜
って関数型言語推しの文脈でよく言うけど
それが言うほど問題になる場面ってどれ位あるかね?
それにRubyのeachとかイテレータだと
ループ変数は隠蔽されててあまり使わないし
ますますそんな実害はない気がしてくる >>542
Lispのプログラム自体もリストでしかないから
処理とデータの区別が必要なくて
メタプログラミングがしやすいって理屈は分かってる
問題はメタプロの生産性が本当にメチャクチャ高いかどうか?
Lisp信者(というか教祖の)ポールグレアムとかはそう言ってるけど
ライブラリやドキュメントの充実の方が生産性上げる気がしてる >>545
そうすると行数が増えるのがイヤなんだろうと思う
最後にカッコが重なるのはオレもイヤだが >>576
今どきもう処理速度より
人間が読み書きする速度の方が重要だろ?
でそれはPythonの方が早そうな気がするけど >>583
>>587
Emacsってフリーソフトの草分けじゃん?
エディタだけどIDEに近いんじゃないの?
欲しい機能はLispで自力実装するになるけど >>603
個人的にはOOPやろうとすると
A.bにならないことが気になるわ >>632
SmalltalkはあのIDEを使うために
言語も学ぶみたいな感じだからな >>647
> ライブラリやドキュメントの充実の方が生産性上げる気がしてる
ドンキ行けばなんでも売ってるから買えば済むけどそれは生産性高いのか
ドキュメントの充実とかいうのも所詮Qiitaにコピペできる手順が書いてあるかどうかだろ
> 問題はメタプロの生産性が本当にメチャクチャ高いかどうか?
最近のわかりやすい事例でいうとライブラリやドキュメントが充実してないような量子コンピューティングでlisp使われてるわな
d-waveやrigetti
ゼロスタートでの生産性高いから採用されてんじゃないの
昔からlispはそういうところで使われてきたんだよな (list 1 2 3) = '( 1 2 3) ? >>653
>ドンキ行けばなんでも売ってるから
>買えば済むけどそれは生産性高いのか
どうでもいいけど
PHPってドンキみたいな雰囲気だよな 実践common lispの古本買ったのですが
LispBox落としてきて本に載ってるEmacs?Slime?わかんないけどショートカットキー試したら
ほとんど通らなくて絶望してる
前の持ち主はそこまででこの本捨てたみたい
(ここまではラインマーカーあり、手あと付きまくりで汚れてる
水滴の落ちた跡があるけど、泣いたのかもしれない) なるほど
C言語の本でもポインタの説明が間違ってて詰むパターンか かわいそうに
K&R本も難読で苦労した人も多かろう ポインタの話を出して「それに比べたらお前の絶望なんて大したこと無い」ってか
Cはドメジャー言語、Lispはマイナー言語だぞ 実践common lispってそんなHow To本だったっけ?pathnameのはなしをよんでうげっとなったような記憶が。 >>661
lisp はマイナーなんかじゃなく、神話ですよ 読者も書籍も少ないという意味では同じ意味だろアスペ野郎 lisp初心者とプログラミング初心者のどっちなんだってやつ多いよな
pythonおすすめ 冒頭Emacsの使い方から書いてある、環境も提供してる
hello worldから書いてある
プログラミング初心者が手を出しても全くおかしくない本だと思うけどね LispBoxですが
カッコ全閉じ C-c C-q → undefined
関数コンパイル C-c C-c → [Condition of type SIMPLE-ERROR]
→戻るとリターンで評価が効かなくなってる
関数コンパイル M-x slime-compile-defun → 通る
どうすれば? >>666
全くの初心者でも無いです
大学ではEmacsでレポートを書いていたし、Schemeの本も読みました
再帰は多少慣れています >>667
C-c C-c で slime-compile-defun は lisp-mode での割り当てです。
*slime-repl* バッファでは slime-interrupt が C-c C-c に割り当てられています。
C-c C-q は大分前になくなったようです。
今はカッコ全閉じは C-c C-]
これも lisp-mode での割り当てで、*slime-repl* バッファでは使えません。
もちろん設定すれば別ですが:
;; SLIMEのREPLバッファでも C-c C-] でカッコ全閉じ
(eval-after-load "slime-repl"
`(define-key slime-repl-mode-map (kbd "C-c C-]")
#'slime-close-all-parens-in-sexp)) なおREPLでは Ctrl+Enter で「カッコ全閉じして評価」ができます:
CL-USER> (list(list(list ;ここで Ctrl+Enter すると
↓
CL-USER> (list(list(list)))
((NIL))
CL-USER> >>669
ありがとうございます!
LispBoxが古いせいなのか、C-c C-cが未定義なんですよね
C-c C-]も未定義と叱られます
>>670は通って全閉じしてエンターしてくれます
Emacs 23.2.1です
ここから貰ってきたものです
https://common-lisp.net/project/lispbox/ Lisp Cabinetも入れててこっちはslime2009-10-15でちょっと古いのか
*slime-repl sbcl*でC-c C-]が未定義と言われます >>672
>>669 の言う通り、 *slime-repl sbcl* では C-c C-] は定義されておらず、使いたければ 669 と同じ手当てがいる。
SLIME 2.24 (May 2019) でも slime-repl には C-c C-] は定義されていないみたい。
.lisp ファイルを開いた時の slime-mode には定義されてるけど。 >>669の「設定」はいったん忘れてください。
lispboxはemacsのユーザー設定を読込むようになっていないので意味のない提案でした。
とにかく、拡張子が .lisp のファイルを作ってそこで試してみて。
そこでなら C-c C-] も C-c C-c も使えるはずです。 閉じ括弧は自動入力に頼るべきだし、実際閉じ括弧を入力する事は皆無だ 実践common lispは序章に common lisp に興味があるすべての人に向けたもの とは書いてあるがプログラミング初心者にも向くとは書いてない
python,java 他の言語と比較した解説が多い
ターゲットは lisp に興味のあるプログラマだろ だからって前提としてる環境で通らない事を書いてたら読者可哀相ではある 実践は少なくとも10年前は本の通りそのまま動いたよ
前提としてる環境は2005年の環境な
翻訳は2008年らしいがとっくに絶版らしい
lispboxの代替品はいまならportacleだろうな https://portacle.github.io サバイバルなんとかって同人誌には導入の方法とか書いてないの? HDD買ってきてlinux入れるしかないかなぁ
どうせならlibreboot化してみっかなCL関係ないけど 嘘書くなよ‥
ホビー向けlispworksは 64ビット版 750$ 32ビット版 500$
http://www.lispworks.com/buy/prices-1h.html 思う所あって、とりあえず入門しようう・・・と
ttp://www.nct9.ne.jp/m_hiroi/clisp/index.html
ここ見ながらSBCLをWindowsに入れて始めました。
・・・うん、流石に数日で制覇は無理だし、当分はリファレンス見ながらじゃないと文法は頭に入らないかな。
ただもっと疑問なのは・・・私はインタプリタがBASIC以来で30年ばかりブランクあるのだけど、LISTやNEWやRENUMみたいなインタプリタへの命令ってどうなってるんでしょ。
定義した関数は実行できるけどコードはもう見れないなんてコトないよね。変数は確認できるけど。
ググって他の入門テキスト当たっても特に記述がないってのはどういうコトなんだ・・・かろうじてLOADがあった程度とか。
見落としてるのかな。 以下のエラー、対処法わかりますか?
$ ros install cxxxr/lem
すると、
Installing from github cxxxr/lem
To load "lem":
Load 1 ASDF system:
lem
; Loading "lem"
....................[1/3] System 'lem' found. Loading the system..
;
; caught ERROR:
; READ error during COMPILE-FILE:
;
; The symbol "LOAD-ASD" is not external in the ASDF/INTERFACE package.
;
; Line: 62, Column: 20, File-Position: 2356
;
; Stream: #<SB-INT:FORM-TRACKING-STREAM
などとなり、インストールできません.
分かる人いますでしょうか。
MacOS Catalina 10.15.6 The symbol "LOAD-ASD" is not external in the ASDF/INTERFACE package. asdf よりも、日本人が作った、anyenv を使えないの?
漏れは、Windows 10, WSL, Ubuntu 18.04 で、
ruby 2.6.6, node 12.16.2 を入れた
anyenv は多言語向きで、rbenv, nodenv, pyenv, phpenv などを同じ使い方で、統一的に扱える anyenvと比較されるのはroswellだと思うが >>691
ありがとうございます。
次の段階に移りました。
下のように UIOP/OS:~ ばかりがillegal function callとなります。
どうしたら良いでしょうか?
Making core for Roswell...
building dump:/Users/user/.roswell/impls/x86-64/darwin/sbcl-bin/1.2.11/dump/lem-ncurses.core
; file: /Users/user/.roswell/lisp/quicklisp/dists/quicklisp/software/cffi_0.23.0/toolchain/bundle.lisp
; in: DEFUN BUNDLE-PATHNAME-TYPE
; ((UIOP/OS:OS-UNIX-P) "o")
;
; caught ERROR:
; illegal function call
; ((UIOP/OS:OS-WINDOWS-P)
; (IF (UIOP/OS:FEATUREP '(:OR :MINGW32 :MINGW64))
; "o"
; "obj"))
;
; caught ERROR:
; illegal function call
; ((UIOP/OS:OS-UNIX-P) "a")
;
; caught ERROR:
; illegal function call anyenv install --list
と入力すると、Lisp には対応してなさそう。すまんかった
Renv, crenv, denv, erlenv, exenv
goenv, hsenv, jenv, luaenv, nodenv
phpenv, plenv, pyenv, rbenv, sbtenv
scalaenv, swiftenv, tfenv lemはしょっちゅう壊れるから開発に参加できるくらいのスキルないと常用はむり
エディタの拡張書いてもAPIの変更ですぐ動かなくなるからエディタ好き以外には時間の無駄 質問失礼します
LISPでLinux向けのDAWアプリケーション(seq24のような)小規模なものが作りたいのですが, SchemeとCommonLISPの選択だと後者で間違えないでしょうか?
また音系ライブラリの充実度とかも教えていただければ助かります
環境はdebianのsidにemacsとroswellです。 puredate使った方がいいでない?tcp/udpも使えるし、lispでサーバ書けばいいんじゃない 道はnilを生ず、nilはアトムを生じ、アトムはS式を生じ、S式は万物を生ず。なるズルい帯に釣られて初めてLISP買っちまった
初めての人に向けた宣伝文…? map族で遊んで楽しんでるけどmapconだけ名前が変なの気になって仕方ないたすけて
対応するcar版のmapcanのnはnconcでわかるけどじゃあなんでmapcdnじゃないんだ 漠然と concatenate の con かなーと思ってた
じゃあ can は何だよってなるけど あ、それでいいかありがとう
map CAr N-conc → mapcan
map cdr n-CONc → mapcon
腑に落ちた 多値をわざわざ実装する意味って何なんだろう?
truncate/remainderを一気に得られるのは確かに便利だけどさ
コンシング無しだからパフォーマンスが良い?
自分で書くときも(数個の、一様でない)リストを返すより、多値で返すのが良い習慣? 基本的な意義は最適化への期待だね。
リストで書くより意図が伝わりやすいから、実際には使われない値の計算を省くとかしやすいかもしれない。
多値を普通の値として扱うと先頭要素が返るってのもある。
メインとオマケみたいな関係にある値を多値で返すと、メインの値へのアクセスには car とか通さなくていいとか。
一つの値だけを返してた関数を拡張するとき、多値なら互換性を壊さずに他の値も返せるとか。
ただ LISP はリスト処理が得意な言語だから、迷ったらリストを使う方向でいいと思う。 なぜ未だにLispなのか?
Lispはメモリアクセスが演算と同じかむしろ早かったような時代に作られた言語。
キャッシュ付きのパイプライン方式のプロセッサとは相性が悪い。
メモリをポインターでたぐりまくるのでは性能が出ない。
また、スレッド並列化や分散並列化は難しいだろ? 型付けまくって配列メインならcに並ぶパフォーマンス出るだろ
まああんまり使い過ぎるとlispっぽくなくてlispである意味なくなっちゃうんですけどね そもそもパフォーマンスの定義がlispでは難しい
極論を言えば環境に依らない計算は全てコンパイル時に済ますように(普通な見た目で)書けるし
他言語コンパイラにも定数畳み込みあるけどほんと微々たるもんだ
まあ、個々に良いとこ挙げても結局Lisp Is Syntactically Pureが全て
これがただ一つの本質 なぜlispなのか。そりは処理系がつくりやすいからでは。で、なぜForthではないんかと。 構文解析がほぼ不要だから、簡単な LISP 処理系を書くってのは演習とかで見かけるけど…
それを目当てに言語を選ぶことってあんまりないと思う。
LISP の強みはマクロだよ。
リスト処理が得意な言語で、コードもリストとして書いてるから、メタプログラミングがやりやすい。 そうなん?Luaみたいにゲームのシナリオスクリプト記述用として需要があるのかと。
うちゲームじゃないけど使ってるよ スクリプト用に LISP 組み込む形って、 Emacs くらいしか生き残ってないよね…
相性自体は悪くないはずなんだけど。
Lua とかのほうが手を出しやすいんだろうね。 ポータブルが取り柄、知っていればどんな環境でもlispにできる
(gcを考えない)lisp実装はワンライナーまであるし
慣れた関数マクロも使いたきゃ足りなきゃ実装例コピペすればいい
schemeはwebの仕様書に網羅的な実装例、clは…なんだろ
cltl2、特にappendixあたりか
おれはbackquoteの実装例が全くプリミティブじゃないのに驚いた 拡張言語にemacsみたいな生lispはちょっとなあ…
今更lispを勉強しようって人少ないだろうし、せめて()を隠蔽しないと
emacsはオモチャとしては惹かれるんだけど、正直vimの方が使いやすいごめん(ポールもvi派だし) guile採用してるのはそれなりにある
gimpやgnucashとか ここcommon lispスレだよオレlisp話はlispスレでやれば 今時のcommon lispの開発環境はroswellとemacsをインストールすれば完了? roswellは仮想環境作って真面目な開発&テストするならオススメ
clの処理系はオプション指定法がバラバラなのでそれもラップしてくれる
rcファイルもroswellが管理する
カジュアル用途ならオススメできない
ホーム直下の深い階層にバージョン違いの処理系やライブラリがバージョン毎にズラズラ
普及してるsbclとclispを生で普通に使えばよいよ
2種類rcファイル書くくらいなんでもない えっとつまり複雑なので初心者には何が何だか分からんくなるのがオチ、ということ >>723
5年位離れてたわけで全くの初心者ではないんだ
>>722
完全な盲点だった、Personal Edition試してみる
ふたりともthnks 上の人ではないのだけれどLispworksでSLIMEみたいに関数の仮引数をミニバッファに表示させることはできますか? C:\Program Files\LispWorks Personal\lib\7-1-0-0\examples\editor\commands\space-show-arglist.lisp
をロードしたら表示できましたありがとうございます。 quickdocsのサービス終了してたんだけど代わりになるようなサイトできたの?
それとも純粋に終了しただけ? >>734
こっちのが見やすいしかっこいいですね、ありがとうございます。 >>731
情報がふるくなっていたので古い情報を掲載するなら閉鎖しろと文句をつけた方がおりましてそれをうけて情報を更新するのではなく閉鎖という経緯
文句をつけた方が責任をとるべく代りのサイトを構築中 >>737
文句つけた奴がやらないパターンじゃないの… >>737
>>731
ググれば見つかる。
初めて探したけどすぐ見つかった。 あれ一晩バッチ回せば更新できるみたいな感じじゃなかったんだ 質問です。
(ql:quickload :burgled-batteries)
としたら、
Unable to determine Python include directory.
といわれます。
どうしたら良いのですか? >>742
(ql:quickload :cl4py)
する 「Lispは数学そのものです」って言われてるけどどの辺が数学なのですか?
Lispを深く学べば分かる? ラムダ計算を元にしてるからだろうね
ただ関数型言語はみんなそうだけどね その手の謳い文句は(マクロや状態を考えなければ)文法が数学でモデル化しやすい程度にシンプル、意の事が多いとおもう
まあ数学程度で測れるほど本気のlispは浅くないから真に受けんな >>715
GIMPもLisp(Scheme)だな
ただ、他の言語も使えるけどね luaはかなり早い段階で商用ゲームに組み込まれて成功してるな
homeworldシリーズとか
なぜなのか >>752
luaは配列が1から始まるってだけで組み込むのを拒否られた思い出が有る >>753
smalltalk以外で0オリジンじゃない言語あったんか… Commonlispよりもほかの言語が詳しいみなさん >>753
んなアホな、Fortranに限らず科学計算界隈の慣習だろ、意識高い系に流行ってるJuliaも1ベース >>757
言語ヲタしてると最終的にフリーダムなlispに行き着くのだよ >>758
ゲームに組み込むには、ゲーム自体がC(C++)で作られてるから、0ベースじゃないとワケわからなくなる まあそれは仕方ないんでね
Fortranはデフォルトがそうなだけでインデックス範囲は負も含めて指定できるし好きにしたらいいよ
むしろcへ組み込む用途で問題なのはcと互換性のある型や呼び出し規約、メモリ配列使ってるかどうかだろ
clにcffiがあるように、Fortranもcと互換の型も使えるようになったし、cでは速度が足りない数値計算ライブラリの多くは比較的書きやすいcをグルー言語にするのが主流 Guy Steeleはほんと天才だと思うわ
cltl2はバイブル、嫌々使われてた古代言語Fortranを魔改造してHPC界を独占
Java?知らない子ですね… >>762
762みたいなひとはcltl2でGuy Steeleが考えた部分がどれだけあるとおもってるの?
すべて考えたとおもっている?それとも1割くらい? rationale的な事や不採用になったよ注釈とか見る限り結構標準に関わってるんじゃないの
セカンドオーサーになってるschemeよりは割合少ないと思うけど、なんか読み物的なのないんかね? 随分昔の話題掘り返してなんだけど>>551
readable lispってのいい感じだと思うけどどうよ
https://sourceforge.net/p/readable/wiki/Common-lisp-tutorial/
まあインデントに関してはelseとかシンボル埋めないと慣れた人でないと読みにくいかな、オレオレなら構わんが
関数記法とinfixのサブセット添える程度なら初見で分かる 妙なシンタックスにしてまでlisp書く意味ないやんあほなん R Studioから、Common Lisp(SBCL)のREPLを使えるように出来ないのかな? 一番バグが少なくなる言語は何だろうと思って検索してたんだけど
Lispのバグ発生率はどんな感じ? >>768
COBOLとか言われたら逆にどうすんのか知りたいw ありすぎるけどtraceとmacroexpandパワーでデバッグは楽なので気にすんな
disassembleやfunction-lambda-expressionやsource-location系もたぶん処理系依存?(大体あると思うけど)
ちょっとしか触ってないがschemeはインスペクタが統一されてない感じ?がある 形式的に見つけられるバグは絶対許さない言語はML系だろうな、ocamlとか traceとmacroexpandパワーでデバッグが楽ちんだとおもったときが一回もない う、うむ…
lisp2dotおすすめ
慣れると変な繋がり方してるのぱっと見でわかるようになる quicklispって必要?quicklisp必要になったことないんだけど >>775
他言語だと好き勝手に投稿されてるマネージャが主だけど、qlはちゃんとメンテ精選してる人が居るのでありがたいよ
トップライブラリならちゃんと開発が回ってるからいいけど、準有名程度くらいだとオリジナルの更新数年無し、個人フォークが何十もあって、どれ使えばいいか&何が違うかよくわからんやろ
ただインストーラとしてはすごい便利なんだけど、qlコマンドは殆ど呼んでないな
あちこち要らないとこ読みに行って起動に10秒かかる(よね?)
セットアップでrcに追加される"quicklisp/setup.lisp"を消して、勝手に起動しないようにすると快適
(require 'asdf)で置き換えてqlのディレクトリをパスに加え、(asdf:load-system 'sysname) 等で読み込めば一瞬だし、当然バックエンドのasdfのapiの方が粒度が細い、再コンパイルも防げる
ffi等含め静的にlispイメージをダンプして普段使いするよりずっと便利 月例更新と各プラットフォーム&処理系のグリッドビルドテストまでしてるのに、肝心のqlクライアントの最新版が8年前更新のゴミクズなのはなんでなん
教えてエライ人 最近CLで書かれたカッコいいアプリとかありますか? 最近書かれたというか、最近のCASのバックエンドはほぼほぼmaximaだったりする
歴史こそ古いが、急にフリーCASシェアNo1(たぶん…)になったので
PythonでもCASをやってるけど、Pythonで一番高機能&人気あるSageMathの高度な部分はほぼmaximaラッパで、ブロブである必要が無い部分はサブセットのSymPyに投げる構成(あと少しのmagma
maxima自体はalgol風に書くんだけど、algol度で言えばPythonに劣るし、もちろんlispでも書けるけどちょっとワークアラウンドが面倒… lemをインストールしたのにコマンドラインから認識しない…
roswellは入ってて動いてるんだけど >>696を見て自分にはlemは無理そうなので止めときます lispで書けるvimがあれば最高なのになあと思ってたらlemが出たけどまだ時期が早い
応援だけしてる lemはgithubに登録されたのが2015/8/5だから、結構時間は経ってるな まださわりだがClozureCLなかなかいいな
objcのインターフェース持ってる関係でtcl/tkで面倒なことしなくてもいいし
スタンドアロンも作れる
とりあえずslimeで使えるようにしてぼちぼちやってみるわ packageをアクセサが簡潔な構造体として使ってるけど、他人が使ってるの見たことない
なんか不都合あるのかな?
(make-package :cyan)
(setf cyan::r 0
cyan::g (sq 13)
cyan::b (sq 15))
cyan::g ; => 169
みたいな感じで
最後の行以外は(defun make-color (name r g b)…)みたいなに包んでコンストラクタに(あと怒られないようrgbをdefvarしたり初期値入れたり)
チェーン式記法だと補完が効くのが便利かと思ってる
(make-color :magenta ...)
(defun inc-chroma (col) ...)
(setf :vivid-cyan (inc-chroma :cyan))
みたいにパッケ渡して返って来た新パッケをbindしたり
make-package(のラッパ)にgensym渡して無名インスタンスをバコバコ作ったり
実は文法の変なdefstructが嫌いなだけだったり…
暗黙のアクセサ作ってくれて、それ故に人のコードも暗黙の了解で読めるのはありがたいけど パフォーマンスは気にしてない
でも多分*package*から見えるパッケはgcされないはずだから(見えてるからそうだよね?)
入力受けて吐いてすぐ終了のプログラム以外ではちゃんとdelete-packageする必要がありそう 携帯で適当に書いたから、今見直しておかしいとこいっぱいあるけどその辺は見逃して下さい
:cyanは自己評価だからsetfできないとか、(symbol-package :cyan)とかで通ったっけ いやいやそもそも:cyanはkeywordに住んでるので、string designatorとして適切であっても、symbol-*に渡す時はシンボル'cyanですね
対話的に使ってる時は便利だけど、白紙から書くと間違いまくってるのがこの手法の怪しさを証明してるかも… > なんか不都合あるのかな?
議論する価値ない手法だとおもうけどさ
他人とコードをシェアしないで一人でかくのはいいんでないか?
パッケージはhash-tableで実装されているから構造体よかhash-tableが便利いうてるのと大差ないわな
perlのパッケージ調査してみれば? >>793
その辺はわきまえるよ
処理系の実装まで思い至らなかったので、記法だけを見てハッシュとしての特性を考えて無かった
標準のhashはネストしたときトリッキーなので、qlからaccessライブラリやマクロを駆使した中置アクセサが提供されてるけど、何もuseしないパッケージを使えば素直で性能も出そうだね
特にaccessはjsonとか読む用で、疎なテンソルの扱いとか考えてないし
早速ベンチしてみる、ありがとう! うーん、、パッケージに属する変数との違いが分からない シンボルのp-listのほうがなんぼかましだろな
(setf (symbol-plist 'cyan) '(r 0 g (sq 13) b (sq 15)))
(setf (get 'cyan 'r) 42)
(symbol-plist 'cyan)
(r 42 g (sq 13) b (sq 15)) 再帰的にパッケージ作ってはimport でホームに設定してるけど…やっぱり筋が悪かったですごめんなさい
一応軌跡だけ
デフォルト値はエラーをhandler-bindで捕まえる
cl-userの(list-all-package)が汚れるからcl-userから先頭以外はuninternして、でも参照は保持して…と
hs見たらdelete-packageやuninternしてもアクセスは許されるがpathologicalなのでチェックは行わないとか書いてる
怪しからん事になってきた
>>796
lisp5らしい方法ですね
propertyスロットに入れたのに、value slotにアクセスしようとしていつも怒られるからあんまりやらないけど…
情報付けたいけどvalueスロットが既に埋まってて、それがライブラリ由来で手を入れたくない時とかの非常口として稀に役に立つ sbclではcl-userからのfind/list-all-packageに引っかからなくても普通に生きてるみたい どれくらいplist(用のセル)が使われてるんだろうかと(do-external/all-symbols (s :clとか色々) (when s (print s)))してみたらinternalには意外に使われてた
まあ殆どデバッグ用のタグのようだが The Lisperati1000 Is a Cyberdeck Terminal Dedicated to Lisp Programming
Dr. Conrad Barski wanted a small, portable device for coding Lisp on the go and
built the Lisperati1000 cyberdeck terminal for the job.
The Lisperati1000 is a very compact device based on the Raspberry Pi Zero W single-board computer.
Its most striking feature is the 8.8” LCD display,
which has an ultra-wide aspect ratio with a resolution of 1920x480. たのしそう
なんですげー細長いのかすらもよく分からんが
androidだとeclのreplがあるけど残念UIで殆ど触ってない
外付けBluetoothキーボード安いの買ってみるかな ポン叩くとnilが生じ、クルッと( )で囲んだり、ピンチで←(こ う)→引き伸ばしたり、そこへ(flick me)をフリックで放り込んだり(こ (flick me)う)したいです
例えはプログフォームなことを忘れてたら
ここを(kar | kadar...)こうシュッと分裂(kar ) ( kadar...)させてシュッと((kar ) ( kadar...))こうする感じで
よろしくおねがいします paredit/vim使ってるけど脳内操作感はこんなんだな
vimでジェスチャーは難しそう?
:nnomap <left-mouse> ,@(スプライス/paredit)みたいのはタブレで桐南るんだろ?
マウスなら左右中×シングルダブクリの6パターン使えるが play storeに転がってるvimの投げやりなポート触る限り、矩形選択が使えそう?
範囲だけで動きが追えないが
キーボードフリーvimなんて、と思ったけどふと試した音声入力が結構戦える事に気づいた(約物とauto-capさえ切れば)
修飾キーあんまり使わないからだね
:、escよく使う大文字修飾コマンド、モード切替あたりはリマップする必要があるが
(par、)renでいこう hyperspecの発音記号の項目が輝く時がやっと来たのか hsもcltl2も大体読んで細かいとこ気になってきたらansi/isoも読むべき?
60$とえらく高いし製版の評判ボロクソだけど
ANSIに持ち込んで版権付く直前のドラフトがansi-cl.psでググって出てくるけどどのくらい違うんだろ、並べて読まないとhsとは違いが分からんが…
処理系作成者以外が参照する準公式文書でフリーなのは以上3つで尽きてるよね?
もし買った熱心な方いたらお願いします 紙のスキャンでocrすらしてない名ばかりpdf、スキャンが斜めってて端の方の文書が欠けてると聞くと、むしろ怖いもの見たさが湧く
c/c++のように違法アップロードが見当たらないのはclの民度が高いのか、もっと高額だからか、それとも単に需要がないからなのか… 情報元にドラフトと内容の違いはないというのも書いてあったよな >>809
そうなの、ありがとう
じゃあ古代のマニュアルでも読んでた方がむしろcons/prosを学べそうだな 無理矢理なPDF版よりも、むしろ紙の仕様書が欲しい
AmazonのPODで売ってくれたら絶対買う 紙の持ってるとほんといいね
寝ながらcltl2の余白に書き込みまくってる、枕にも丁度よい
amazon中古送料込み450円なんでためらいもない 誰か教えてください
CLOSで デストラクタ的な事をするにはどうしたらいいんでしょうか?
(defmethod delete ((o myclass))
~disconnect DB connection とか colse socket とか~ )
(let ((obj (make-instance 'myclass))) ... )
参照が残っていなければ勝手に (delete obj) がコールされるのが理想です
少しググっても「放っておけばガーベッジコレクトされるのに何を心配する必要があるんだ?(英語) 」
みたいなのばかり引っかかってどうにも分かりませんでした 参照がないことを検知できないので
disconnectやらcloseやらは明示で呼ぶしかない ありがとうございます
それが Lispスタイルなのですね、少しづつ慣れていこうと思います 単に接続を確実に閉じたいだけなら、with-open-file みたいなマクロ書くけど
CLOSかぁ c++にとらわれすぎc++の用語で検索するからヒットがないだけでlisp raiiで検索すると沢山でてくるよ
リソース管理だから816の回答が定石 Pythonはpaulがベタ褒めしてから20年くらい追ってるけど、元はblock(不採用)として提案され、先例上げるのが通例なのに言及もなかったはずなので直接は関係ないんじゃないかな?
pepでよく言及されるのは確かだが
今だと構文マクロは却下されそうだな、面白そうなのに
ふつうの言語はASTを内部表現に採用してると思うが、Pythonは標準関数で抽出&evalを許してるのが特異で面白い
lispインタプリタ書きなどしなくとも、ノードのラベルをリストのcarと入れ替えるだけの数行のコードでフルパワーlispになる >>820
うーん、ちょっと信じられん、Python の内部表現ぐちゃぐちゃじゃなかったっけ
コードで示せる? CCLでdexadorが使えなくて困ってるのだけどもしかしてビルド失敗してるのかな
SBCLなら通るのだけどCCLだとこんなエラーになる
ttps://i.imgur.com/uCzQQTm.png
lispの問題解決はそもそもよくわかってないのでどうしたらいいものやら >>823
connection refused って出てるあたりよく分からないなあ。
俺が手元のMacで試すと成功したのでより分からない。
いっそのこと HTTP クライアント変えて Drakma 使うとか。
(ql:quickload "drakma")
(drakma:http-request "https://ja.wikipedia.org/wiki/Common_Lisp") >>797
propertyはおもむろにsetfしても怒られないので対話使用に便利
というのはさておき怒られない理由が気になる
letでそのシンボルを束縛しててもグローバルのシンボルのplist見に行くよね?
単に気にもかけられない機能だからとか? ああletで束縛するのはplistという名前のvalueであって、getf 'plist 'propって書けば当然シンボルとしてのplistを見に行くわな
自己解決 するとpletって概念が頭に浮かぶんだけど、どう実装できるだろう?
ちょっと思いつかない >>825
Drakmaも同様にだめでした
今の所どこから手をつけたらいいかわからないけど地道に調べます ccl使ってないからわからないけど、ipv6とか出てるのが気になる 最近Lispというものを知ったのですが、皆さんはなぜこの言語を使っているのですか? 遊び甲斐がある、たぶんFORTHと並んで最も面白い言語から
しかし仕事はない
間接的に地力固めにはなってる気はする lisperを集めてもみんな船頭になりたがる人種だから川渡れないよなあ
伝説的なプロジェクトは大体少人数ってのが裏付けている、気がする CCLの再ビルドをしていて気づきましたがcan’t findが大量に出てますねえ・・
ccl -n
>(rebuild-ccl :clean t)
Can't find #P"ccl:library;lispequ.dx64fsl.newest" so requiring "ccl:library;lispequ.lisp" instead
Can't find #P"ccl:bin;hash.dx64fsl.newest" so requiring "ccl:lib;hash.lisp" instead
Can't find #P"ccl:bin;backquote.dx64fsl.newest" so requiring "ccl:lib;backquote.lisp" instead
Can't find #P"ccl:bin;level-2.dx64fsl.newest" so requiring "ccl:lib;level-2.lisp" instead
.....
この後にも大量に出てますが対象のlispファイルは存在しているようなので
見にいくようにすればいいのではないかと思いますがやり方がわかりません
どなたか教えていただければ助かります
CCL本体のmake自体は特に何も出ていませんでした。 うちはsbclなんであれだがSBCL_HOMEみないな名前の環境変数は.../lib/sbclをちゃんと指してるか? ttps://github.com/Clozure/ccl/releases
ここを見る限りは必要ないみたいです
ほとんどは参照に成功しているようでLoadingとCommpilingが繰り返されてますね
さっきから調べてますがちょっとこれ手に負えないですわ・・ そもそもどういう環境なのか書いて欲しい
エスパーするにも限度があるぞ すみません
high sierra 10.13.6 です
経験なさすぎて手に負えません
先輩方お願いします 趣味悪いやつがどこまでエスパーできるか試してるようにしかみえん・・ どうやってインストールしたん
CCLのバージョンは
なんでCCLの再ビルドしたん ttps://github.com/Clozure/ccl/releases
ここにある通りです
CCL 1.12がlatestのはずです
git clone https://github.com/Clozure/ccl.git ccl-dev
curl -L -O https://github.com/Clozure/ccl/releases/download/v1.12/darwinx86.tar.gz
cd ccl-dev
tar xf ../darwinx86.tar.gz
なおここから先のCCL本体のビルドはやってもやらなくても結果は同じでした
cd lisp-kernel/darwinx8664
make clean
make
ln -s */ccl-dev/dx86c164 ccl
は適宜やってます
単にCCLはビルド以外の提供がなかったからビルドしただけで他意はないんです lisper だけにエスパーは得意でございます
お後がよろしいようで…
つか、なんかcclのページに何か不安なこと書いてるね
Unfortunately, on Windows and macOS Catalina, (rebuild-ccl :full t) will not work. >>844
たまたまうちの環境も High Sierra だけど CCL は roswel で導入したのを使ってる (他に sbcl と abcl-bin を入れてる)
確かに ccl-bin でしか提供されてないけど気にならないので再ビルドする気にはならんね
> Can't find #P"ccl:library;lispequ.dx64fsl.newest" so requiring "ccl:library;lispequ.lisp" instead
> ...
この箇所ってエラーではないと思うよ
コンパイル済みの "ccl:library;lispequ.dx64fsl.newest" が見つからんので
代わりに "ccl:library;lispequ.lisp" を探すわ (そしてコンパイルするわ)
ってだけのメッセージでしょ
(translate-logical-pathname "ccl:library;lispequ.lisp") の場所にファイルがあれば何も問題ないはず >>846
なるほど実は(rebuild-ccl :clean t)は必要なかったんですかね
気を取り直してCCL本体はmakeせずrebuildも打たない形にしてみたんですが
やっぱりdexadorは同じところで止まるようです
しかしCCLで動いている方もいるようなので(>>825)
こうなるとますますわかりません
何か設定がおかしいのか、足りないのか・・
とりあえず現状で:F 1から:F10まで追ってみたんですが
SSLっぽい引数が全部NILってことに気づいてSSLをしくっている可能性を考えました
internet-familyはIPv6/IPv4に対応しているような感じは受けますがそこはまずおいておいて
IPv4を返しているwww.niconico.jpをgetさせたらkilled: 9でCCL自体落ちました (続き)
こうなるとdexadorがCCLに対応していない可能性があると思い
ttps://github.com/fukamachi/dexador
ここを見ると特に対応情報とかはないようですがサンプルから
? (dex:get "http://lisp.org/")
"<HTML>
<HEAD>
<title>John McCarthy, 1927-2011</title>
・・・中略・・・・
<a href=¥"http://www-formal.stanford.edu/jmc/¥;">John McCarthy's Home Page</a><br>
<a href=¥"http://news.stanford.edu/news/2011/october/john-mccarthy-obit-102511.html¥;">Obituary</a>
</BODY>
</HTML>
"
200
#<HASH-TABLE :TEST EQUAL size 10/60 #x302002997A5D>
#<QURI.URI.HTTP:URI-HTTPS https://lisp.org/>
#<SSL-STREAM for #<BASIC-TCP-STREAM ISO-8859-1 (SOCKET/11) #x30200299FA3D>>
?
んー?落ちてきますねえ・・
https://lisp.org/に変えても落ちてきます。
dexadorに頼っていいのかどうかわからなくなってきました >>847のリンクを間違えました
誤 IPv4を返しているwww.niconico.jpをgetさせたらkilled: 9でCCL自体落ちました
正 IPv4を返しているwww.nicovideo.jpをgetさせたらkilled: 9でCCL自体落ちました >>847
High Sierra + CCL 環境で問題なくgetできてるよ
quicklisp周りのアップデートしたら直るんじゃないかな 環境構築めんどくせえからxyzzyかPortacleでいいや lisp.orgなる良いドメイン確保してるの初めて知った…
stanfordのjmcのhpへのリンクがあるだけ?
(いまお外でスマホブラウザftpできない) ubuntsu で普通にaptでsbcl落とせたはず、ccl は知らんけど
850のコメントが正しいと思う、usocket が壊れてるとかかな やってみました
? (ql:update-client)
The most up-to-date client, version 2021-02-13, is already installed.
T
? (ql:update-all-dists)
1 dist to check.
You already have the latest version of "quicklisp": 2021-02-28.
NIL
特に何も変わらないようです・・
ccl自体はquicklispの管理には入っていないと思うのですがこれを組み込むべきと言うことでしょうか? >>854
あと考えられるのは
quicklisp/.. . .. /cl+ssl-20210228-git/src/reload.lisp で
libcrypto.dylib, libssl.dylib をロードしようとしていて
システム標準ライブラリに付いてるコメントが怪しい ( MacPorts/Homebrew etc. の dylib を優先的に探索している)
"libcrypto.dylib" ;; default system libcrypto, which may have insufficient crypto
"libssl.dylib" ;; default system libssl, which may have insufficient crypto
「これだと暗号化が不十分かも」という事は、 https 通信で問題起こす可能性があるということ
そこで拒否られる ( connection refused ) かどうかはサーバーのバージョンと設定次第なんじゃないかと
なので 自力 make install か homebrew とかで を最新の openssl をインストールしたら直るかもよ
それと dexador/drakma はサーバーがLocation属性で示したリダイレクト先(大抵は https://... ) 見に行くようなので
httpなら大丈夫だった, httpでも拒否られた ってのはアテにならない気がする ああ、qlはssl対応してないんだっけな(遠い目)
永久にβ版 >>854 あと rebuild-ccl についてなんだが
https://github.com/Clozure/ccl/releases を見ると
Windowsや macOS Catalina だと (rebuild-ccl :full t) はうまくいかないかも
Xcode 11 (Mojave) の一部バージョンだと make も通らんかもとあるが
我々の環境 Xcode 10.1 (High Sierra) では大丈夫なはず
;; git 版 rebuild-ccl ;;
ccl-dev❦:./dx86cl64 --no-init
? (rebuild-ccl :full t)
. . ... . .
;Building lisp-kernel ...
;Kernel built successfully.
できた
;; roswell 版 rebuild-ccl ;;
~❦:ros install ccl-bin {まだ入れてなければ}
~❦:ros +Q +R run { +Q: quicklisp無し, +R: "--no-init" に相当 }
? (rebuild-ccl :full t)
. . ... . . できた
~❦:ros run {普通に起動}
? (ql:quickload :dexador)
? (dex:get "https://lisp.org")
. . ... . .
とりあえず問題無さそう
素のCCLとの性能差は体感では分からなかった >>855
libcryptoとlibsslは自分でビルドしたのを/usr/local/libに置いてます
そんなに古いわけじゃないとは思うんですが早速更新して見ます
SSL関係はCLの標準ライブラリとして持ってるものだと思ってました・・ うーんだめでした
CCL本体のmakeをせずrebuildもしないものと
CCL本体をmakeしrebuildも実行したものどっちも同じ結果です
[package dexador.error]...........................
[package dexador.backend.usocket].................
[package dexador].
(:DEXADOR)
? (ql:update-all-dists)
1 dist to check.
You already have the latest version of "quicklisp": 2021-02-28.
NIL
? (dex:get "https://ja.wikipedia.org/wiki/Common_Lisp")
> Error: Error #<USOCKET:CONNECTION-REFUSED-ERROR #x3020023388AD>
> While executing: USOCKET::RAISE-ERROR-FROM-ID, in process listener(1).
OpenSSLの最新はmake testをパスしてます
/usr/local/libは優先パスになってるので通常そこはいいはずなんですが
quicklisp側に設定がいるんでしょうか
前から気になるのはquicklispのsetupを実行するといつまでたっても終わらないことですね
仕方ないので
rm -rf ~/quicklispで消してから
ccl ―load quicklisp.lisp
(quicklisp-quickstart:install)
(ql:quickload :dexador)
(dex:get "https://ja.wikipedia.org/wiki/Common_Lisp")
とかやってます そんなにこだわることかね?安定版、あわよくばプリコンパイル済の入れて差分は手動パッチの方が楽じゃないの
俺なんか素のリスプイメージから10代くらいsave-lisp-and-dieし続けた秘伝のイメージだから、もはやどうやって再現していいのかわからん 特にmakeせずgitでプリコンパイルされているものを使ってもだめなのでよくわからないんですよね
common lispの環境もよくわかっていないので問題解決もままならないです
OpenSSLは正しく/usr/local/libに入っているのを確認しているのでそこは大丈夫なはずですが
何かしらの理由で読んでいないとかだとまずいですねえ・・ >>860
それはそれでダメだろw
再現できる環境作れなきゃ、時代遅れ過ぎる >>861
あと思いつくのは
・コンパル済みキャッシュ
念のため真っさらに
rm -rf ~/.cache/common-lisp/ccl-1.12-f98-macosx-x64
・Fink, MacPorts, Homebrew 経由の古い libcrypt.dylib, libssl.dylib
こいつらは /usr/local/lib/* より参照優先度が高い ( sbcl だと大丈夫な理由が分からんけど )
インストールした覚えがなくてもチェックしときましょうか
とか? ld.conf.d とか変に弄ったのを忘れてるに一票 >>864
fink /sw ~/sw はありませんでした
MacPorts /opt 以下はX11だけでした
Homebrew /opt/homebrew はありませんでした
コンパイル済みキャッシュ・・はどこにあるのか結局わからなかったので
CLLのフォルダごと削除して新しくgit cloneしました
~/.cache/common-lisp/ccl-1.12-f98-macosx-x64 はありました
他にsbclとかも入っていたので全て消しました
あとは同じように
m -rf ~/quicklisp
ccl ―load quicklisp.lisp
? (quicklisp-quickstart:install)
? (ql:quickload :dexador)
? (dex:get "https://ja.wikipedia.org/wiki/Common_Lisp")
> Error: Error #<USOCKET:CONNECTION-REFUSED-ERROR #x30200246AE5D>
ダメでした・・
URLによってエラーになったりならなかったりよくわからないですね
>>865
特に触っていないと思います
この間始めたばかりの素人なのでインストールガイドに書いてあることくらいしかできてないのです
そういうわけなので設定とかもしかしたら必要なのかもしれませんが全くやっていません システム標準の "libcrypto.dylib" "libssl.dylib" が connection refused の原因なのか?という件
quicklisp/dists/quicklisp/software/cl+ssl-20210228-git/src/reload.lisp を編集して
どのdylibも存在しないパスに書き換えると (ql:quickload :dexador) に失敗するので「リストにあるどれか」を必要としている事は確か
そして システム標準以外を見に行かないようにすると...
少なくとも https://lisp.org, https://nicovideo.jp に関しては問題なく ( dex:get ... ) ができました
>>866
/usr/local/lib/ にインストールしたOpenSSL は大丈夫なはず!
かどうかは分からないので同じように試してみるといいかもしれない 動いてないの質問者1人で動いてるやつ3人くらいいる状況だと質問者の環境がおかしいとしか・・ >>867
このように変えてみました
(:darwin (:or "/usr/local/lib/libcrypto.dylib" ;; personalized install
))
(:darwin (:or "/usr/local/lib/libssl.dylib" ;; personalized install
))
改変のreload.lispを適当に他のディレクトリに置いておいて・・
rm -rf ~/quicklisp
ccl ―load quicklisp
(quicklisp-quickstart:install)
別のシェルで 改変後のreload.lispを置き換えようとしましたが
~/quicklisp/dists/quicklisp/software のディレクトリがありませんでした
(ql:quickload :dexador) を実行するとsoftwareディクトりができます
quicklisp/dists/quicklisp/software/cl+ssl-20210228-git/src/reload.lisp が存在しているようなので
これを改変したもので置き換えて確認・・
? (dex:get "https://ja.wikipedia.org/wiki/Common_Lisp")
> Error: Error #<USOCKET:CONNECTION-REFUSED-ERROR #x30200230B4ED>
だめでした・・
もしかしてreload.lispを評価していないんじゃないかとも思うのですがやり方がわからないです
>>868
多分そうなんじゃないかと思うんですが初心者すぎてどうにもならないです
お手数かけます先輩方 >>869 のパターンだと /usr/local/lib にインストールしたやつ「だけ」がロードされる状態になってる
俺が言いたかったのは そいつが悪い (CCLと相性が悪い?) んじゃないかということ
本当に CCL がこの reload.lisp を読み込んでいるのか気になるなら
まず全部に x つけて ( "x/usr/local/lib/libssl.dylib" みたいに ) から quickloadしてみればいい
リストに合致する dylib がねーよ...と文句言われればOK Lisp以外は初心者だと思ってないから環境初期化して試さないんでしょ?
デフォ環境からカスタマイズどれくらいされてるかわからん状態でエスパーする意味ある?
手元ではappストアで配布のcclとhomebrewのデフォルトインストールのsbclで動いてるよ
usocketの環境問題の切り分けならsbcl試すべきでしょどっちもだめならlisp以前のもんだい >>870
やってみようと思ったんですがちょっとやり方がわからないです
というのも
~/quicklispが作られるのが
ccl ―load quicklisp.lisp
? (quicklisp-quickstart:install)
の後で
software以下のディレクトリができるのが
(ql:quickload :dexador)
の後なので
これ以降の修正しかできない感じです
どうしたらいいでしょうか
>>871
sbclだと動いてます
毎回quicklispは消してやってるので環境初期化は大丈夫だと思うんですが
皆さんには常識のこととか多分私にはわかってません あとはすごく気になるのが
quicklispのインストールが終わった後で
CCLを(quit)してしまうと
ccl ―load quicklisp.lisp
をやっても(ql: を評価しないし
(load #P で~/quicklispのsetupを読み込むとそこで止まります
インストール後なら(ql: は使えるのでdexadorは読み込めるんですが・・ もしかしてスレ建て以来最高に盛り上がってる?
次スレ必要? >>874
早いよw
普通に環境依存の話だろうね
既に指摘されてるけど初心に返って、
環境変数全部見直すか、
タイムマシーンで以前の状態に戻すとか、
新規にユーザ作ってそれで試すとか、
そこら辺をちゃんと地道にやるしかないと思うよ >>875
質問する前から新規ユーザーで既にやってました
その辺は言われることなので
環境変数とかもそんなわけでライブラリパス以外は割とスカスカですね
lisp関係はここに出ている作業くらいのものなので
lisp関係の細かい設定とかそういうのは一切やってないんですよね
そういえばsbclに関して思うことがありますが
あれはOpenSSLを更新する前にビルドしてあったものですねえ・・ >>876
おっと失礼した
そこまでちゃんと分かってるなら後は、
変えてないつもりのものとか、
動いているつもりのものを疑ってみることを
勧めるよ うーん・・調べてはいるんですが手がかりがあまりにもなさすぎて
どう手をつけたものかって感じです・・
git版でも動くようなのでなぜこうなるのかますますわかりませんが・・ >>872
> software以下のディレクトリができるのが
> (ql:quickload :dexador)
> の後なので
> これ以降の修正しかできない感じです
「これ以降の修正」それでいいんです
(quit)状態で 修正して、起動して (ql:quickload :dexador) すると
依存するパッケージのソース変更を自動察知してコンパイルが走りますんで
今回のが openssl に起因する問題なのか不明だけど
縁の下なライブラリを自力で makeインストールするのはあまりオススメできませんね
脆弱性報告を随時チェックして...
configure オプションの推奨設定なんかを毎回調べて...
依存するライブラリ/プログラム群を必要に応じてアップデート ...
それらが Homebrew のアップデートコマンドを週一で叩くだけで済むならその方が良くないですか? マカーでないのでよく分からんが、うちの界隈で新しいマックはdll(dylibっていうんだっけ?)の仕様代わって大変ってどこかで聞いた
invarid/unsafe accessとかそんな感じのエラー吐いてない?
相対パスの使用が厳しくなって怒られるらしい、ブロブをsls(macだとgrep?)に掛けてパスっぽいものを絶対パスに置換するだけでよいらしいが 細かいところから
>>873
> quicklispのインストールが終わった後で
> CCLを(quit)してしまうと
> ccl --load quicklisp.lisp
> をやっても(ql: を評価しないし
この quicklisp.lisp は quicklisp.org から落としてきたものだと思うけど、それなら当たり前。
quicklisp.lisp は Quicklisp のインストーラに過ぎなくて ql パッケージは入ってないから、 quicklisp.lisp を読むだけでは使えない。
インストール済みの Quicklisp を (load #P"~/quicklisp/setup.lisp") で読み込むと ql パッケージが使えるようになる。
起動の度に毎回 load するのが面倒なら、 quicklisp インストール後に (ql:add-to-init-file) で処理系が起動時に読み込むファイルで load するよう書いてくれる。
でも
> (load #P で~/quicklispのsetupを読み込むとそこで止まります
止まるわけないんだけどなあ。止まるってどういう意味でしょ。かっこの閉じ忘れとかじゃないよね。 >>869 でUSOCKET:CONNECTION-REFUSED-ERROR が出たとか言ってるあたり、ソケットのレベルで導通してるかも気になる。
これは成功するんだよね?
? (usocket:socket-connect "ja.wikipedia.org" 443)
#<USOCKET:STREAM-USOCKET #x3020020A09FD>
ちなみに俺の環境
? (lisp-implementation-type)
"Clozure Common Lisp"
? (lisp-implementation-version)
"Version 1.12 (v1.12-39-g6c1a9458) DarwinX8664" 遅くなりましたすみません開始します
>>879
手順把握しました
makeに関しては昔MacPortsでやるとうまくいかないやつがちらほらあって
手動で細かく制御するとできるとかがあったのでそれっきりだったんですよね
今ではそんなこともないということでしたら考え直します
おすすめはhomebrewでしょうか?
>>880
high sierraなのでその辺は大丈夫なはず・・です
>>881
(load #P"~/quicklisp/setup.lisp")
これを実行するとそのまま止まって次のプロンプト(?)が出てこないんです
原因は全く不明なんですが
(ql:add-to-init-file) これはやってみます >>882
For more information, see http://www.quicklisp.org/beta/
NIL
? (lisp-implementation-type)
"Clozure Common Lisp"
? (lisp-implementation-version)
"Version 1.12 (v1.12-39-g6c1a9458) DarwinX8664"
?
これは大丈夫そうですね (ql:add-to-init-file) を実行すると
~/.ccl-init.lisp が生成されるようです
(quit)で終了して・・
CCLを単独で起動すると
(ql:quickload :dexador) は通りました
この状態では以下変わりません
? (dex:get "https://ja.wikipedia.org/wiki/Common_Lisp")
> Error: Error #<USOCKET:CONNECTION-REFUSED-ERROR #x30200311B01D>
.ccl-init.lispを見るとsetupを実行しているように見えなくもないのですが
特に止まるとかそういうことはこの手順だとないようです
次にSSLライブラリを読むかどうかのチェックをしてみます reload.lispを変更しlibssl , libcryptを見に行かないようにしました
CCLを起動しdexadorを読みます
CCL is free software. It is distributed under the terms of the Apache
Licence, Version 2.0.
? (ql:quickload :dexador)
To load "dexador":
Load 1 ASDF system:
dexador
; Loading "dexador"
..................................................
[package dexador.encoding]........................
[package dexador.connection-cache]................
[package dexador.decoding-stream].................
[package dexador.keep-alive-stream]...............
[package dexador.util]............................
[package dexador.body]............................
[package dexador.error]...........................
[package dexador.backend.usocket].................
[package dexador].
(:DEXADOR)
? (dex:get "https://ja.wikipedia.org/wiki/Common_Lisp")
> Error: Error #<USOCKET:CONNECTION-REFUSED-ERROR #x302001DAED7D>
これは・・
再確認します 更新して書き換えられたかもと思いましたがそんなことはなかったようです
reload.lispはこのようになっていました
(:darwin (:or "x/usr/local/lib/libcrypto.dylib" ;; personalized install
))
・・中略・・
(:darwin (:or "x/usr/local/lib/libssl.dylib" ;; personalized install
))
手がかりになるでしょうか? ~/.cacheを消し忘れていたので実行後に
再度(ql:quickload :dexador)をやりました
reload.lispは改変のまま置かれていますが
[package dexador.error]...........................
[package dexador.backend.usocket].................
[package dexador].
(:DEXADOR)
? (dex:get "https://ja.wikipedia.org/wiki/Common_Lisp")
> Error: Error #<USOCKET:CONNECTION-REFUSED-ERROR #x30200230142D>
ここは変わりませんでした >>887 これは予想がつく
こっちでも試してみたんだが ql:quickload の挙動は
○○○.lisp のタイムスタンプが コンパイル済みファイル ( ~/.cache/. . ... . . /○○○.dx64fsl )
よりも「新しくなった時」に ソース変更あり!と判断しているようだ
つまりまだ「新しい」reload.dx64fsl がキャッシュにあるのでそれをロードして何も変化が起きなかったんだろうなと
準備しておいた 改変済み reload.lisp (古い) に差し替えじゃなくて
生で置かれた reload.lisp を直に編集して保存 (新しい) しとけば良かったと
だとしても >>888 の説明がつかん
そちらの手順に何か勘違いがあるんじゃないかな 繰り返しになるけど、まずは
(:darwin (:or "X/opt/local/lib/libcrypto.dylib" ;; MacPorts
"X/sw/lib/libcrypto.dylib" ;; Fink
"X/usr/local/opt/openssl/lib/libcrypto.dylib" ;; Homebrew
"X/usr/local/lib/libcrypto.dylib" ;; personalized install
"Xlibcrypto.dylib" ;; default system libcrypto, which may have insufficient crypto
"X/usr/lib/libcrypto.dylib"))
libssl.dylib も同様に改変して
これを読ませてエラーになる事を確認してから
(:darwin (:or "X/opt/local/lib/libcrypto.dylib" ;; MacPorts
"X/sw/lib/libcrypto.dylib" ;; Fink
"X/usr/local/opt/openssl/lib/libcrypto.dylib" ;; Homebrew
"X/usr/local/lib/libcrypto.dylib" ;; personalized install
"libcrypto.dylib" ;; default system libcrypto, which may have insufficient crypto
"X/usr/lib/libcrypto.dylib"))
これで試してみましょう >>889-890
手順に気をつけてもう一度やって見ました
まずは.cacheの
rm -rf common-lisp
~/quicklisp/dists/quicklisp/software/cl+ssl-20210228-git/src/reload.lisp
を直接編集してタイムスタンプが変わっていることを確認します
>ccl
? (ql:quickload :dexador)
[package dexador.util]............................
[package dexador.body]............................
[package dexador.error]...........................
[package dexador.backend.usocket].................
[package dexador].
(:DEXADOR)
※ここでreload.lispを確認して改変されたままであることはわかりました
? (dex:get "https://ja.wikipedia.org/wiki/Common_Lisp")
> Error: Error #<USOCKET:CONNECTION-REFUSED-ERROR #x30200225506D>
こうなるようです・・ 思ったんですが
どの変数がpathを握っているのか表示できないものでしょうか? 結局何がしたくて、何が出来てて、何が出来てないんだっけ? 普段過疎ってるのに急に優しさに満ちたな…
ついでに興味深いレスも書き捨ててってよ >>893
まずはCCLでdexador動くところまでですかね・・
CCLはObjCのインターフェース持っててnibも読めるので
ネイティブアプリのように振る舞えるかなと思いまして
今の問題が解決したら進めてみようと思ってます
毎日お手数おかけします先輩方
ほんとすいません >>884
これ試してっていってるのとちがうくないん?
usocket:socket-connectのほうでしょ >>891 これでとりあえず openssl は無罪だったと思っていいのかな
>>892
ちょっと意味が分からないけど
この先はエラー発生時のDEBUG操作をちゃんと調べるしかないかも
実は自分もほぼ初心者なので教えられる事はなさそう
それか丹念に dexador のソースを追って内部進行を再現してみるとか?
src/dexador.lisp :45 (defun get (uri &rest args
src/dexador.lisp :50 (apply #'request uri :method :get args))
backend/usocket.lisp :423 (defun-careful request (uri &rest args ...
結構大変そう
>>894
優しさというか
未知のトラブルの際に実際どうするのが正解なのか自分も知りたいだけっすね
なので「なんか分からんうちに治りましたあw」で終わられても困る >>896
すいません見落としてました
[package dexador.error]...........................
[package dexador.backend.usocket].................
[package dexador].
(:DEXADOR)
? (usocket:socket-connect "ja.wikipedia.org" 443)
> Error: Error #<USOCKET:CONNECTION-REFUSED-ERROR #x30200225C34D>
> While executing: USOCKET::RAISE-ERROR-FROM-ID, in process listener(1).
> Type :POP to abort, :R for a list of available restarts.
> Type :? for other options.
1 >
reload.lispがオリジナルでも改変でも変わらないようです >>897
うーん・・pathを無効にしてもquicklisp自体は動いてるように見えるんですよね
とりあえず現在有効にした状態なので
なんとなくこうしたら挙動が変わりました
? (dex:get "https://nicovideo.jp" )
> Error: Can't resolve foreign symbol "_SSL_get_peer_certificate"
> While executing: CCL::RESOLVE-EEP, in process listener(1).
> Type :POP to abort, :R for a list of available restarts.
> Type :? for other options.
1 >
以前はkilled: 9でccl自体落ちてたんですよね・・
symbolがないとかは通常ならわかりやすいんですがCCLだとどうなんでしょう
でもこれ明らかに外部ライブラリ呼びに行ってしくってる感じですねえ うちの環境だと
# Homebrew版
ccl-dev❦: nm /usr/local/opt/openssl/lib/libssl.dylib | grep SSL_get_peer_certificate
0000000000018d23 T _SSL_get_peer_certificate
# system default 版
ccl-dev❦: nm /usr/lib/libssl.dylib | grep SSL_get_peer_certificate
0000000000037290 T _SSL_get_peer_certificate
>>899 そちらで
nm /usr/local/lib/libssl.dylib | grep SSL_get_peer_certificate
を叩くとどう出ます? >>901
早速やって見ましたが何も出ません
もしかしてこれですかね dexador のソースを読むと (dex:get "...." ) はおおよそ次のように進行する
;; ------------------------------------------
(defvar uri (quri:uri "https://ja.wikipedia.org/wiki/Common_Lisp"))
(defvar connect-timeout dex:*default-connect-timeout* );; 10 {秒}
(defvar con-uri (quri:uri uri));; 結局 con-uri == uri になる
(defvar connection (usocket:socket-connect (quri:uri-host con-uri) (quri:uri-port con-uri)
:timeout connect-timeout :element-type '(unsigned-byte 8)))
(defvar stream (usocket:socket-stream connection))
(defvar scheme (quri:uri-scheme uri));; "https"
(defvar read-timeout dex:*default-read-timeout* );; 10 {秒}
(setf (usocket:socket-option connection :receive-timeout) read-timeout)
(cl+ssl:ensure-initialized) ;; SSLの前準備的な? 返値はNIL
(defparameter *ca-bundle*
(uiop:native-namestring
(asdf:system-relative-pathname :dexador #P"certs/cacert.pem")))
;; ...dexador-20210228-git/certs/cacert.pem ルート証明書みたいな?
(defvar ctx (cl+ssl:make-context :verify-mode cl+ssl:+ssl-verify-peer+ :verify-location *ca-bundle*))
(defvar insecure dex:*not-verify-ssl*);; この値は NIL であるべき (セキュアってこと)
(cl+ssl:with-global-context (ctx :auto-free-p t)
(cl+ssl:make-ssl-client-stream stream
:hostname (quri:uri-host uri)
:verify (not insecure)
:key nil
:certificate nil
:password nil))
;; --------------------------------------------------------------------------------
libssl.dylib の問題で解決ならもう↑これは不要かな
まあ面白かったから気にしないでくれ /usr/local/libで参照先を見ました
libssl.dylib -> libssl.3.dylib
調べたら3.0.0 alphaになってますねOpenSSL
もしかしてこのせいですかね もう少し教えてください
おすすめはhomebrewってことでいいでしょうか? Wikipediaより OpenSSL
開発元 The OpenSSL Project
最新版 1.1.1j - 2021年2月16日(30日前)[1] [±]
最新評価版 3.0 Alpha 13 - 2021年3月11日
Homebrew版は 1.1.1j でした
3.0はまだ「分かってる人」だけが使う段階なのでしょう
Homebrew なんですが...
High Sierraはもうとっくに正式サポートから外れたので
パッケージのインストールがほぼソースからコンパイルになるんですわ
以前はコンパイル済みの (bottole) が提供されて、 コンパイルしたければオプションで選べたんですがね
こっちは惰性で使ってるだけなので、MacPorts の選択もアリだと思います わかりましたそうしたら・・
とりあえず1.1.1jをmakeしてみます
明日また報告します
いつもありがとうございます 一番先に試すべきは system default の dylib で dex:get を試すべきなんだけど... まあいいや
> Error: Can't resolve foreign symbol "_SSL_get_peer_certificate"
あとこれは当初の CONNECTION-REFUSED-ERROR とは別に現れたエラーなのかな?
そうだとして推測すると
当初は /usr/local/lib/libssl.dylib に存在しないシンボル _SSL_get_peer_certificate を /usr/lib/libssl.dylib から拾い上げて進行してたんじゃないかな
そして他のシンボルも opensslバージョン違いでミックスされる、その結果ちょっとした不整合が生じて向こうのサーバーに拒否られたと
SBCLで大丈夫だったのは個々のLISP実装によって通信パラメータの扱いに多少の差があってもおかしくないから
「通信したいんでしょ?なのでココのnil値は妥当な値に変えておきました」みたいな感じ
ソース改変で /usr/local/lib/libssl.dylib しか見えなくなった状態では
_SSL_get_peer_certificate がどこにも見つからねーよ... と 別のエラーが生じたと
雑だけど大体当たってるんじゃないかな >>898 見る限り、 connect する段階で失敗してるように見えるなあ。
俺からは二つ試してみてもらいたい。
一つ目。 (trace openmcl-socket:make-socket) を呼んでソケットを開く関数に trace を出させた後で接続を試して、関数にどんな引数が渡ってるのか見ること。
俺が試したらこんな感じになる:
? (trace openmcl-socket:make-socket)
NIL
? (usocket:socket-connect "ja.wikipedia.org" 443)
0> Calling (MAKE-SOCKET :TYPE :STREAM :ADDRESS-FAMILY :INTERNET6 :REMOTE-ADDRESS #<IP6-SOCKET-ADDRESS [2001:df2:e500:ed1a::1]:443> :FORMAT :TEXT :EXTERNAL-FORMAT :UNIX :DEADLINE NIL :NODELAY NIL :CONNECT-TIMEOUT NIL :INPUT-TIMEOUT NIL)
<0 MAKE-SOCKET returned #<BASIC-TCP-STREAM ISO-8859-1 (SOCKET/24) #x30200212C1CD>
#<USOCKET:STREAM-USOCKET #x30200212BE4D>
二つ目。IPv4 ソケットで connect 出来るか試してみて欲しい。
ソース見る限り usocket は IPv6 ソケットを作りたがるっぽいが、IPv4 だとどうなのか見てみたいから。
IPv4での繋ぎ方は以下:
(openmcl-socket:make-socket :type :stream :remote-host "ja.wikipedia.org" :remote-port 443 :address-family :internet)
俺が trace も有効な状態で試した結果は以下のようになった:
? (openmcl-socket:make-socket :type :stream :remote-host "ja.wikipedia.org" :remote-port 443 :address-family :internet)
0> Calling (MAKE-SOCKET :TYPE :STREAM :REMOTE-HOST "ja.wikipedia.org" :REMOTE-PORT 443 :ADDRESS-FAMILY :INTERNET)
<0 MAKE-SOCKET returned #<BASIC-TCP-STREAM ISO-8859-1 (SOCKET/32) #x30200215E80D>
#<BASIC-TCP-STREAM ISO-8859-1 (SOCKET/32) #x30200215E80D> 遅くなりました
>>908
/usr/localではなく/usr/libを見るように変えました
いつものようにキャッシュを消してからCCL起動
(ql:quickload :dexador) ののちに
? (dex:get "https://ja.wikipedia.org/wiki/Common_Lisp")
> Error: Error #<USOCKET:CONNECTION-REFUSED-ERROR #x302003C411CD>
? (dex:get "https://nicovideo.jp" )
Killed: 9
nicovideoを参照するとkilled 9でCCL自体落ちるようです >>909
現在/usr/libを参照している状態でやってます
? (trace openmcl-socket:make-socket)
NIL
? (usocket:socket-connect "ja.wikipedia.org" 443)
> Error: There is no package named "USOCKET" .
> While executing: CCL::%PARSE-TOKEN, in process listener(1).
おや・・・no package named が出ると?
? (openmcl-socket:make-socket :type :stream :remote-host "ja.wikipedia.org" :remote-port 443 :address-family :internet)
0> Calling (MAKE-SOCKET :TYPE :STREAM :REMOTE-HOST "ja.wikipedia.org" :REMOTE-PORT 443 :ADDRESS-FAMILY :INTERNET)
<0 MAKE-SOCKET returned #<BASIC-TCP-STREAM ISO-8859-1 (SOCKET/4) #x302000A0E4ED>
#<BASIC-TCP-STREAM ISO-8859-1 (SOCKET/4) #x302000A0E4ED>
?
こんな感じになるようです
OpenSSLの1.1.1jのビルドしてきます・・ 1.1.1j できました
libssl.dylib -> libssl.1.1.dylib
libcrypto.dylib -> libcrypto.1.1.dylib
nm /usr/local/opt/openssl/lib/libssl.dylib | grep SSL_get_peer_certificate
nm /usr/local/lib/libssl.dylib | grep SSL_get_peer_certificate
000000000001e290 T _SSL_get_peer_certificate
Symbolはありますね キャッシュを消して
reload.lispを標準に戻します
CCL起動からdexadorをquickload…
? (dex:get "https://ja.wikipedia.org/wiki/Common_Lisp")
> Error: Error #<USOCKET:CONNECTION-REFUSED-ERROR #x30200229120D>
? (dex:get "https://nicovideo.jp" )
Killed: 9
ええ・・
/usr/localのみ参照するreload.lispへ戻します
? (dex:get "https://ja.wikipedia.org/wiki/Common_Lisp")
> Error: Error #<USOCKET:CONNECTION-REFUSED-ERROR #x30200225C10D>
? (dex:get "https://nicovideo.jp" )
Killed: 9
またCCLが落ちました CCL本体でSSL関係を静的リンクしているかチェックしてみましたが
そのようなことはありませんでした
うーん・・ 念のため
OpenSSL 1.1.1jの make testを再度実行した結果
../test/recipes/95-test_external_boringssl.t ....... skipped: No external tests in this configuration
../test/recipes/95-test_external_krb5.t ............ skipped: No external tests in this configuration
../test/recipes/95-test_external_pyca.t ............ skipped: No external tests in this configuration
../test/recipes/99-test_ecstress.t ................. ok
../test/recipes/99-test_fuzz.t ..................... ok
All tests successful.
Files=158, Tests=2629, 207 wallclock secs ( 3.41 usr 0.43 sys + 124.00 cusr 66.96 csys = 194.80 CPU)
Result: PASS >>911 見ると IPv4 ソケットは繋がるっぽいな。じゃあ ccl に IPv4 を使わせてみて試そう。
以下の手順を試してみて欲しい。
1. あらかじめ SSL の設定は元に戻しておく。
(ここは 911 がどうやったか分からんので自分でやってくれ)
2. asdf のキャッシュを消す。
~/.cache/common-lisp/ 以下を全削除。
3. ccl を起動して、以下の順に打つ:
(setf *features* (delete :ipv6 *features*))
(ql:quickload "dexador")
(dex:get "https://ja.wikipedia.org/wiki/Common_Lisp") >>916
やってみました
通常通り初期化、同条件の/usr/libを参照する形に戻しています
? (setf *features* (delete :ipv6 *features*))
(:QUICKLISP :ASDF3.3 :ASDF3.2 :ASDF3.1 :ASDF3 :ASDF2 :ASDF :OS-MACOSX :OS-UNIX :ASDF-UNICODE :PRIMARY-CLASSES :COMMON-LISP :OPENMCL :CCL :CCL-1.2 :CCL-1.3 :CCL-1.4 :CCL-1.5 :CCL-1.6 :CCL-1.7 :CCL-1.8 :CCL-1.9 :CCL-1.10 :CCL-1.11 :CCL-1.12 :CLOZURE :CLOZURE-COMMON-LISP :ANSI-CL :UNIX :OPENMCL-UNICODE-STRINGS :OPENMCL-NATIVE-THREADS :OPENMCL-PARTIAL-MOP :MCL-COMMON-MOP-SUBSET :OPENMCL-MOP-2 :OPENMCL-PRIVATE-HASH-TABLES :STATIC-CONSES-SHOULD-WORK-WITH-EGC-IN-CCL :PACKAGE-LOCAL-NICKNAMES :X86-64 :X86_64 :X86-TARGET :X86-HOST :X8664-TARGET :X8664-HOST :DARWIN-HOST :DARWIN-TARGET :DARWINX86-TARGET :DARWINX8664-TARGET :DARWINX8664-HOST :64-BIT-TARGET :64-BIT-HOST :DARWIN :LITTLE-ENDIAN-TARGET :LITTLE-ENDIAN-HOST)
? (ql:quickload "dexador")
To load "dexador":
Load 1 ASDF system:
#〜中略〜
("dexador")
# reload.lispの変更点を再確認、OK
? (dex:get "https://ja.wikipedia.org/wiki/Common_Lisp")
"<!DOCTYPE html>
<html class=¥"client-nojs¥" lang=¥"ja¥" dir=¥"ltr¥">
#〜中略〜
</body></html>"
200
#<HASH-TABLE :TEST EQUAL size 22/60 #x30200316897D>
#<QURI.URI.HTTP:URI-HTTPS https://ja.wikipedia.org/wiki/Common_Lisp>
#<SSL-STREAM for #<BASIC-TCP-STREAM ISO-8859-1 (SOCKET/4) #x3020030AE94D>>
?
成功したように見えます・・! >> 917 それはよかった。
917の環境は、 "ja.wikipedia.org" が IPv6 アドレスに解決されるのにそれを使って connect すると失敗するという状態なんだろうか。知らんけど。
IPv6 で繋がらない原因は Lisp の範疇じゃないし、917自身がネットワーク設定を見るしかないと思う。
あと ccl で IPv6 を常に抑制したいというなら、 ccl の起動時読み込みファイルに同じ設定を書き込む必要があると思う。
~/.ccl-init.lisp に、以下の式:
(setf *features* (delete :ipv6 *features*))
を追記しとけば IPv6 を抑制できて暫定措置になるんじゃないの。 >>918
調べてはいますがおそらくその通りだと思います
ifconfigでIPv6アドレスを持っていてIPv6パススルーも生きていることはわかったのですが
httpsに関してはIPv4しか通らないようです
DNSはIPv6を返します
問い合わせないといけないかもしれないので時間かかります
また報告しますすいません・・ CCL with IPV6 feature:
(openmcl-socket:resolve-address :HOST "www.wikipedia.org" :PORT 443 :SOCKET-TYPE :STREAM)
⇒ IPアドレス #<IP6-SOCKET-ADDRESS [2001:df2:e500:ed1a::1]:443>
[ 参考: usocket-0.8.3/backend/clozure.lisp line: 15〜 ]
SBCL:
(usocket:get-hosts-by-name "www.wikipedia.org")
⇒ (#(103 102 166 224) #(32 1 13 242 229 0 237 26 0 0 0 0 0 0 0 1))
⇒ (car ... ) ⇒ IPアドレス #(103 102 166 224)
[ 参考: usocket-0.8.3/backend/sbcl.lisp line: 321〜 ]
つまり
CCLでは CCL実装の resolve-address で得られるIPアドレス (この場合 ipv6) をそのまま採用する
SBCLでは usocket:get-hosts-by-name で得られるIPアドレスが複数 (ipv4, ipv6) あったら 先頭のエントリ (ipv4) を採用する
「SBCLでは大丈夫だったのに」の謎はこれで解けた 迂闊なアップデートは止めましょう、パッケージマネージャはあんまり信用しないように、ということで
俺はそのままでいいや… >>921
乙
つまりipv6で問題あったってことか
やはりソースは追ってみるもんだなぁ ネットワーク環境についてなんですが
こちらの設定だけでは改善できないことがはっきりしましたので
問題点も明らかになっていることから、今回の質問については終了したいと思います
粘り強く対応して頂いた先輩方には感謝しております
こちらの不手際のせいで巻き込んでしまってすみませんでした
ありがとうございました
次へ進みたいと思います >>924 ちょっと待ってくれー
(openmcl-socket:resolve-address :HOST "nicovideo.jp" :PORT 443 :SOCKET-TYPE :STREAM)
そちらでこれ↑はどういう値が返ってきますか?
こちらの環境では #<IP4-SOCKET-ADDRESS 133.152.43.29:443> つまり ipv4 で返ってくる (※)
もし ipv4 で Kill: 9 になる ( >>913 ) なら ipv6 とは別の問題も抱えてるって話になります
分かったところで何ができるよ?と思われるかもしれませんが、少し気になってました
※ そしてキー値引数 :ADDRESS-FAMILY :internet6 を追加すると ipv6 になる
wikipedia.org だとデフォールトで ipv6 ( DNS の返答順に差があるんですかね ) >>925
そうでした
killed:9の問題は忘れてました
? (openmcl-socket:resolve-address :HOST "nicovideo.jp" :PORT 443 :SOCKET-TYPE :STREAM)
#<IP4-SOCKET-ADDRESS 133.152.43.29:443>
/usr/lib参照の設定だとこうなりますね >>926
ほんと分かったところで何もできないけど、とりあえず確認ありがとう >>925-926
俺の環境でも "Killed: 9" が出る現象が再現できた。
IPv6 ソケットを開くのにあえて失敗させた後、 ファイルディスクリプタを開きまくっていると ccl が死ぬっぽい。
俺が見つけた再現手順は以下。暇なら 925 や 926 も再現できるか試してみてほしい。
1. asdf のキャッシュを消す
~/.cache/common-lisp 以下を全削除。
2. ccl を起動し、以下の順に実行
(ql:quickload "usocket")
(usocket:socket-connect "ja.wikipedia.org" 65500) ; これは connection refused になって失敗する。 :pop で abort して抜ける。
(usocket:socket-connect "nicovideo.jp" 443)
(ql:quickload "dexador") ; I/Oが重い処理ならなんでもいい
最後の ql:quickload の箇所はI/Oが多い処理ならなんでもいいようで、俺はこれで "Killed: 9" になるのが確認できた。
まだ調査中だけど、この現象は usocket か ccl のバグっぽい気がする。
もう少し調べてみて必要なら本家に報告するわ。 >>929 同じ手順で "Killed: 9" 再現しました
環境は
Clozure CL: Version 1.12 (v1.12-39-g6c1a9458) DarwinX8664
OS: macOS High Sierra ver. 10.13.4
~❦:ulimit -n
256
ファイルディスプリタの(プロセス単位の?)上限は、256
少ないようには見えませんが、CCLが処理しきれる上限はもっと低いんですかねえ >>929
? (ql:quickload "dexador")
To load "dexador":
Load 1 ASDF system:
dexador
; Loading "dexador"
.Killed: 9
同手順で落ちました
てっきり自分の環境でしか起きないものかと思ってたんですがまだ色々ありそうですねこれ
>>930
私のはこうなってます
ulimit -n
10000
ulimit -u
2048
自分のはかなり前にファイルを大量に扱わねばならない時があったので変更していたのを思い出しました >>930
>>931
ありがとう。これだけ再現するってことは本当にバグを見つけたのかもね。
俺の方では、 USOCKET:SOCKET-CONNECT で接続に失敗した時の backtrace を見て、 abort して抜ける時にどこかの unwind-protect で走るコードがおかしいんじゃないかと思って眺めてみてる。
で、そういう unwind-protect があるのはこの ccl::make-tcp-socket 関数だけだった:
ttps://github.com/Clozure/ccl/blob/6c1a9458f7a5437b73ec227e989aa5b825f32fd3/library/sockets.lisp#L647-L692
上の再現手順で Connection Refused にしたとき、この関数の688行目でエラーが起きるんだが、その場合 unwind-protect の効果で692行目の処理で FD が閉じられる。一方で、この FD は663行目の処理で socket 構造体の作成にも使われていて、その socket 構造体は閉じられていない。
ここからは完全に俺の推測。
Connection Refused 後の unwind-protect で FD が閉じられた後、次の処理でたまたま同じ数字のFDが開かれ、その直後にこの放置された socket 構造体がGCに回収されるときに何か起きてるんじゃないかと思う。 IPv6 の struct sockaddr_in6 と IPv4 の struct sockaddr_in を取り違えて free() する・・的な。
まあそんな今更なバグが ccl にあるとも思えないので、全く推測の域を出ないけど。
俺も普段使いはSBCLで、CCLのソースを見るのは初めてだから時間がかかると思うけど、もう少し調べてみるわ。 あぁこれ Killed: 9 のたびにクラッシュログが残りますね
~/Library/Logs/DiagnosticReports/dx86cl64_2021-03-21-213811_Sierra.crash
Process: dx86cl64 [58558]
... .. .
Exception Type: EXC_GUARD
Exception Codes: 0x4000000100000006, 0x542c042077498a54
Exception Subtype: GUARD_TYPE_FD, id=0x542c042077498a54, fd=6, flavor=0x00000001 (CLOSE)
... .. .
さっぱり意味は分からないけどシステムを怒らせたっぽい事は伝わってきます
禁忌に触れようとした的な? パッチ書いてプルリク出してみた。
https://github.com/Clozure/ccl/pull/362
>>933 のいうようにクラッシュレポート見たら、俺の環境でも close で死んでた。
色々調べたけど、どうやら CCL の GC が close 済みのFDをもう一度 close しようとすると死ぬっぽい。
(ただ、close 済み FD を二回 close する簡単な C プログラム書いて実験しても、 EBADF が返るくらいで kill されたりはしないんだよね・・このあたり微妙。)
そんなわけで close 済み FD を参照する一時オブジェクトをエラー時に解放するよう unwind-protect したら直ったっぽく見えたのでPRにしてみた。
(932 では struct sockaddr_in が・・とかヌカしてたけど、さすがにこれは無かった。俺の杞憂だったわ。) >>934
GJ!
オレは完全に環境依存の話かと思い込んでたわ、
すまんかった…反省する >>934 あなたは偉い!
全く別件ですが詳しい方々に質問です
CCL で簡単な cocoa アプリを作ってみよう思い (require :cocoa) を評価すると Hemlock editor が立ち上がります
そのためのコンパイルとロードも毎回走ります
欲しいのは ns:ns-window とかなのに不要なエディタを除外したアプリは作れないのでしょうか? Hemlock editor てのは Clozure CL64.app を立ち上げると出てくるのと似たようなもんです、というか違いが分かりません
そっちの場合は 初めから (require :cocoa) された状態になってます
慣れの問題かもしれませんが、入力補完もhistoryも効かないこのエディタは使いづらいです
快適な Emacs+slime で作業してるのに (require :cocoa) で余計なのが立ち上がる、なんなんだコレはと思ってしまいます あのエディタは必要なのか必要でないのかよくわからないんですよね
examples/coco/ui-elements/howto.html とかを見ると
(in-package :ccl)
(setf my-window (#/alloc (@class ns-window)))
window生成できるってことなってるんですがエラーになるおかげで悩みました
これ(require “cocoa”)をしておけば問題なく生成できますね・・
ただ同ページの
(ns:with-ns-rect (r 100 100 400 300)
(#/initWithContentRect:styleMask:backing:defer:
my-window
r
(logior #$NSTitledWindowMask
#$NSClosableWindowMask
#$NSMiniaturizableWindowMask
#$NSResizableWindowMask)
#$NSBackingStoreBuffered
#$NO))
で初期化して表示できるとなってますがこちらでは動かないんですよね
色々とわかってないことが多いので地道に調べてます・・ あれから試行錯誤してみましたが
https://trac.clozure.com/ccl/wiki/GradientWindow
例えばここのサンプルコードを
(require :objc-support)
↑と↓で挟めば
(ql:quickload :trivial-main-thread)
(defun main ()
(trivial-main-thread:with-body-in-main-thread ()
(show-gradient-window)
(#/run (#/sharedApplication ns:ns-application))))
(main) でウィンドウが出ます
サイト脚注の gui:execute-in-gui はcocoaパッケージで提供されるのでここでは使えません
examples/cocoa/ui-elements/HOWTO.html の例も
(%make-nsstring "Hello!") → #@"Hello!"
(@SELECTOR "greet:") → (objc:@SELECTOR "greet:")
のように書き換えてやると動きます それと (ccl:save-application "foo.image") とやれば現状のバイナリイメージが保存されます
dx86cl64 -n -b -Q -I foo.image -e "(main)"
のようにして実行できます
サンプルでは終了処理が省略されてるのでウィンドウを閉じても終わりません
例えば killall -9 dx86cl64 で始末してやる必要があります
ちなみに (require :cocoa) の状態でイメージ保存をすると何故か 0バイトの空ファイルができます
あと :cocoa では ccl::build-application を使ってアプリケーションバンドルが作れるという話になってるのですが
これもちょっと分かりませんでした
ガワ(〜.app)は出来ても実行できない、エラーを見るとイメージが見つからない、
じゃあ手動で作ればいいのか? 保存できないじゃん... という循環です CCLのメーリングリストでやったら?
もし有益な情報だったらここに書かれててもCCLユーザーは目にすることはないし
逆にここでやられてもCCLでapp作るっての長々やられても正直うざい Clojureが一番多いだろうけど、結局Web関連が大半だろうな 会社の仕事で使わせようとするとこは地雷っぽく感じる
Lisperが集まった少人数ベンチャーでもなければ、普通は採用言語とはならんて 速さが必要なとこはC++UIはC#
設定とか外部ファイルはjson Steele御大がカバーに推薦文書いてるからってclでHacker's Delight一通りなぞったけど
dpb, deposit-field, log~, boole-~,bit-vector...
clの無駄に細かく柔軟なbyte/bit関数がめっちゃ生きるなこれ
byte-specのおかげで32bit想定で16進定数まみれのc(っぽい)サンプルコードがキレイになる
変なビット幅使ったら性能は察しだけども
4bit整数のboole-定数も真理値表とcltl2、(hsによれば処理系定義だけど)処理系毎に思想が見えて面白い byteはsize, pos, stepの3タプルだったら、もっと良かったかもな lispで構造体の配列はどの様に宣言するのですか。
教えてください。 構造体の型を :element-type に指定して make-array するとか。
standard-object の配列を作るなら
(make-array 42 :element-type 'standard-object) nconcとかの最初のnってなんの意味?
破壊系は大抵nがついてるようだけど 実践Common Lispにはnon-consingを意味すると書いてあるな クロージャー?判ってなさそうなミスして困った
https://pastebin.com/MmYWsxce
CL-USER> (answer-status)
(B . 0) (R . 0) (G . 0) (Y . 0) (P . 2) (W . 0)
(B . 1) (R . 0) (G . 0) (Y . 0) (P . 0) (W . 1)
(B . 0) (R . 0) (G . 0) (Y . 2) (P . 0) (W . 0)
(B . 1) (R . 0) (G . 0) (Y . 0) (P . 0) (W . 1)
NIL
CL-USER> (answer-status)
(B . 0) (R . 0) (G . 0) (Y . 0) (P . 4) (W . 0)
(B . 2) (R . 0) (G . 0) (Y . 0) (P . 0) (W . 2)
(B . 0) (R . 0) (G . 0) (Y . 4) (P . 0) (W . 0)
(B . 2) (R . 0) (G . 0) (Y . 0) (P . 0) (W . 2)
NIL
CL-USER> (answer-status)
(B . 0) (R . 0) (G . 0) (Y . 0) (P . 6) (W . 0)
(B . 3) (R . 0) (G . 0) (Y . 0) (P . 0) (W . 3)
(B . 0) (R . 0) (G . 0) (Y . 6) (P . 0) (W . 0)
(B . 3) (R . 0) (G . 0) (Y . 0) (P . 0) (W . 3)
NIL
関数呼ぶ時に counters が初期化されずに値をキープするので
呼ぶ度に増えてしまう
どう定義すればリセットされるのだろうか? なんでcounterをdefparameterで定義してるの? >>954
実践 Common Lisp に
>この2つのフォーの違いは
>DEFPARAMETER は評価されるたに常に初期値を代入し、
と書いてあったから
2回目移行の関数呼び出しの時に初期値代入してくれることを期待していた
>>955
thanks
copy-tree 始めて見た >>956
よくわかってないけど、defunの中のdefparameter はただのletじゃだめなの?
トップレベルとそうでない場所でのdefparameter は挙動が違うと思う リテラルオブジェクトを破壊的に変更した結果が未定義だからだね assoc cdr nth越しにfるアクセサ志向プログラミングが気になる
いや悪いと思わんよsetfパワーはclの売りだし
ただなかなか見たことないので感心?した >>957
全然 let でいいですね
今回スコープ広くしなくていいし
>>959
コンソールで対話型のもの書くのにLispがエラー時に変数見れたり色々やりやすかった記憶があったので
ひさびさに Lispを選んだ
うる覚えなのでスタイルが面妖なことになってるかもしれないw グラフ探索でモノを見つけたら帰りがけに空リストへcar/cdrをpushしていくのはやったことあるな
(#'car #'car #'cdr ...)で表現したアドレスと値が帰ってくる(以下#'等省略)
値を処理したら(compose '(car car cdr...))でアクセス関数を生成してsetfで更新
なんで俺はそのノードへの参照を直接返さず無駄にリスト返したのか、と書いてて疑問に思ったけど思い出したわ
そのノードの周りをn階層刈ったり、途中の階層から相対アクセスしたかったんだ
(compose '(cons curried-butlast-n '(car car cdr ...)))
的な感じで
何れにせよcar/cdrがsetfableな恩恵だね リードした時点でcadaddadadaaaar自動生成みたいなしょうもないマクロをpaul grahamだったかで見た事あるけど、もしかしてこれ使えるかも?
a/dを文字列ででも返して、それを関数として使いたい時だけcとrで挟んでinternする感じで 効率は悪そうだけどとてもlispらしい
placeだけダイナミック変数に確保したとしても、誰から指されてるか(親)は経路を何らかの方法で保存してないと原理的に辿れない
(複数から指されている可能性もあるので)
順にスタック片付けずに一気に脱出したいところだけど、帰りにpushする為に必要なんだな
逆に次にアクセスするノードへのアクセサをpushする方法が考えられるけど、これなら見つかり次第アキュムレータ末尾再帰かthrow 'top/catchで帰れる
外れノードから戻る時にアクセサをpopするコストも負うけど…
とりあえず効率は無視して、外れノードから一段降りる時にアクセサをpopするのではなく、returnを積んでしまえば、探索のログとしてデバッグに役立ちそう
car cdrに加え、returnまで合成した関数がちゃんとsetfableかまではちょっと自信がない リスト上でreturnと直前の呼び出しを対消滅させて最適化するイメージは湧くが意外と面倒くさそう
returnが連続するケースにカウンタが要る
括弧のパースでよくやるロジックだけど 「Common Lisp」って、市販の書籍を読んでも歴史や文法等の事は書いてあっても、
REPLで試せるだけで、コンパイルして実行可能ファイルを作る方法が不明だな。
ネットを調べてもコンパイルして実行ファイルを作成する情報が見つからない。
運良く見つかっても、商用系のコンパイラを使った場合の話だったりする事が多々有る。 これが間違ったことを書いてツッコミを貰う式問題解決法ですか 規格で決まってないし、そもそもバイナリに固めて配布する需要がそんなに無い >>972
save-lisp-and-die
これって、規格に含まれてないの?
バイナリに固めて配布する気はない、
自分で書いたLispプログラムを実行ファイル形式にしたいだけだ。 解っている人にしか理解不可能な会話をされたら、
新参者はちんぷんかんぷんですね。 SBCLではデフォルトで固めて実行ファイルを作れるが、サイズが最低でも40MBほどになる
SBCLビルド持にオプションを追加すると、圧縮した実行ファイルを作れる
それだと10MB程度になるから、まぁ現実的なサイズかなと
ちなみに圧縮されてても一瞬で起動するからデメリットは全く無い save-lisp-and-dieはsbcl系だろうか、sb-ext:とかそんなパッケージプレフィックス付いてない?
eclだとsaveinitmemだとかその辺はてんでバラバラ
自分の環境で素早くロードして実行したいのならそれでベストだと思うよ、メモリをダンプしたのをそのまま読み込むだけだから
ただし全部入りだから、ファイルサイズに気を付けてね >>969
わざわざ有り難うございます。
リンク先を参照して勉強します。 >>976
コンパイラ毎に、バラバラだったんですね、
コンパイルして生成されるファイルは巨大ですね。 Common Lisperの7割以上が使ってると思われるSBCLの実行ファイルの作成に関して、具体的に書いた俺のレスは無視かよw
まともに聞く気が無いならもう来んなよ 老婆心だけど、プログラム事にコアイメージを量産するんじゃないぞ(違ったらごめん)
ライブラリや書いたコードの最適化コンパイル、実行時でなくてよい計算を済ませて、スクリプトを食わせる sbclなら常に関数をコンパイルしながら走るので、動的に関数生成するそこそこ規模ならお釣りが来るよ
実行時入力を与えて走らせればイメージが最適化されるので、そこをまたダンプ
熟成と呼んでる
パッケージマネージャ用に主なアーキテクチャ向けビルド作ってるけど、デバッガやrepl削るとffi関連のアップデートで泣く cl界隈はソース配布で自動ビルドがなかなか混沌としてるからな このスレ7年たつらしいけどLisp Schemeスレ一本に合流にして単独スレいらんのではないか
「いいものの本質は、いかなる時代においても変わらない」byパワーズのパワーズってなんなん? emacs lisp の方が実用化には成功しているのかも知れないぬ SBCL等のCommon-Lispでプログラムを作る際に、
ファイル若しくは画面にデバッグログを出力出来るライブラリの様なは無いのかな。
ググったり、Githubの中を探してたら、Log4CLってのを見つた。 いま、検索したら日本語で詳しく紹介してるブログを見つけました。
他にもロギングライブラリらしきものが存在するらしい。 transcriptって無かったっけ
そういうのじゃだめか >>989
dribble
正直開発時にログライブラリなんかいらんREPLある >>990
REPL上でログ出力しても結構使えますよ。
ログレベルが選べるのが良いですね。 ロガーとslimeが連携でもしてくれるのなら有用だと思うがそうじゃないならたいして使えるものではないな
コンパイラの警告,trace,breakはロガーライブラリを導入しなくても標準で使えるし,slimeと連携もする >>987
単に*debug/trace/error/standard...-output*へ自前のストリームをsetfすると画面への出力が食われるのかな?自前のreplはどう?色付けたり楽しいよ
(loop (funcall print-tee (funcall (eval (funcall read))))
print-teeで好きな標準ストリームをread-lineし、好きなところに書き込む
試してないので雰囲気だけ…(処理系のreplは裏で色々やってるので、それを元に改造するべき 一時期SBCL入れて入門していました。
取り敢えずチュートリアルサイトを途中までこなして、ふと(BASICで言う)ステートメントをダイレクト実行しかしていない事に気が付く。
しかもlistとかのダイレクトコマンド専門命令の説明がない。
ググって見付けたサイト覗いても、その辺りの説明がない。
いくら生まれが古くても、ここまで生き残った言語なら運用に不足がある訳ないのだけれど・・・。 >>996
> ステートメントをダイレクト実行しかしていない
これはreplでしかつかってないということなんだろうけど、
> しかもlistとかのダイレクトコマンド専門命令
これはなんのことなんだろう。 BASICがアマチュアプログラミングの標準だったのはかれこれ40年前ですよ・・・
LISPが古いのとは別次元で時代錯誤・・・ このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 2474日 11時間 53分 0秒 5ちゃんねるの運営はプレミアム会員の皆さまに支えられています。
運営にご協力お願いいたします。
───────────────────
《プレミアム会員の主な特典》
★ 5ちゃんねる専用ブラウザからの広告除去
★ 5ちゃんねるの過去ログを取得
★ 書き込み規制の緩和
───────────────────
会員登録には個人情報は一切必要ありません。
月300円から匿名でご購入いただけます。
▼ プレミアム会員登録はこちら ▼
https://premium.5ch.net/
▼ 浪人ログインはこちら ▼
https://login.5ch.net/login.php レス数が1000を超えています。これ以上書き込みはできません。