トップページtech
991コメント414KB

【入門】Common Lisp その8【質問よろず】

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2011/07/06(水) 17:15:15.55
lispを触ってみたい入門者のQ&A
初心者のQ&A
本スレでは恥ずかしくて聞けない人のQ&A
本スレは高度すぎて割り込めない人のQ&A
linuxでなくてwindowsでやりたいんですが・・・Q&A
lispを使用してC#やJAVAの代替にするための方法(おまけ)

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

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

(list
(url http://pc8.2ch.net/test/read.cgi/tech/1101386936/l50 :part 1)
(url http://pc11.2ch.net/test/read.so/tech/1140012484/l50 :part 2)
(url http://pc11.2ch.net/test/read.so/tech/1181479267/l50 :part 3)
(url http://pc11.2ch.net/test/read.cgi/tech/1201402366/l50 :part 4)
(url http://pc11.2ch.net/test/read.cgi/tech/1215834213/l50 :part 5)
(url http://pc12.2ch.net/test/read.cgi/tech/1234884136/l50 :part 6)
(url http://hibari.2ch.net/test/read.cgi/tech/1270370267/l50 :part 7)


□テンプレート置き場□
ttp://wiki.fdiary.net/lisp/ (id:guest pass:cl)
0237デフォルトの名無しさん2011/10/29(土) 17:03:58.19
>>235
読み込み速度とデバッグの関係がわからない。なにをどうしたいんだ?
0238デフォルトの名無しさん2011/10/29(土) 17:11:13.44
>>237
俺の作ったデータを読み込む
    ↓
エラーがあるから無論エラー文が返される
    ↓
しかし速すぎ見えないワロタwww
みたいな流れ。
0239SCHEME餃子 ◆8X2XSCHEME 2011/10/29(土) 17:23:00.81
>>238
コンソールが閉じるってこと?
それともエラーの量が多すぎて流れちゃうってこと?
0240デフォルトの名無しさん2011/10/29(土) 17:23:28.68
>>236
それって gensym みたいだ
lispや関数型言語で悩むのは関数の名前だというのは避けられないな。
特に、英語のボキャブラリの足りなさと前置詞の使い方の理解不足が
日本人にとって鬼門だと思ってるよ。
0241デフォルトの名無しさん2011/10/29(土) 17:26:48.12
common lispにはtraceやstepがあるから、それを意識した関数の作り方
をすれば混乱するところはずいぶん減るよ。
意識してプログラミングしてみな。けっしてdefunの中身をでかくするんじゃないぞ
0242デフォルトの名無しさん2011/10/29(土) 17:32:22.33
小分けした関数でいいから、最適化をするときにインライン化もできるしね。
だから、1つの関数に5行で収まることを意識した作りをしてみればいい。
condやcase/ifを使うと大きくなりがちだけど、条件のところを上手に
関数化すると関数の膨らみは抑えられるし、デバッグもあとで楽になる。
traceを使うときも条件分けした所でどこに富んだかは一目瞭然になるしね。
手続きグセなのか関数の中にオールインワンの方向に作っちゃう人はいるけど
あれは、デバッグで悩むことになるからやめたほうがいいよ。
優れたlisperのソースでも長いものはあるけど(macroでmacroや関数をまとめて
作るような場合は特にね。)最初は小分けから、最適化するに連れて色々変える
ことを意識してったほうが効率はいい。
0243デフォルトの名無しさん2011/10/29(土) 17:32:29.26
>>238
前者で合ってる
0244デフォルトの名無しさん2011/10/29(土) 17:37:04.27
確か、初めて本の中でletが登場した辺りだったと思う
S式眺めてると関数なんだかシンボルなんだかわからなくなる
ってなってた頃はx1とか変数然としてて読みやすかった記憶がある
0245SCHEME餃子 ◆8X2XSCHEME 2011/10/29(土) 17:40:07.18
>>238
普通は Emacs と繋げるだろう jk
0246デフォルトの名無しさん2011/10/29(土) 18:37:19.17
>>238
なにが速いんだ? >>239 の推測どーりなら、
コンソールが閉じる => コマンドプロンプトから起動すれば?
文字が流れちゃう => エラーでたら止まるようにプログラムしとけば?
という感想。状況がいまいちわからん。
0247デフォルトの名無しさん2011/10/29(土) 21:39:37.13
SLIME経由で使わないCommon Lispとかマジ罰ゲームだろ。
開発効率が十倍以上変わってくるぞ。
0248デフォルトの名無しさん2011/10/29(土) 21:44:27.07
>>247
その昔 グレアムはviでclispを・・・
ということがあったようだ。slimeがあまりにもいいからな。
いまはslimvというvimのものがあるが。
02492382011/10/29(土) 21:51:03.24
>>245,246,247
サンクス、いろいろ試してみる
0250デフォルトの名無しさん2011/10/29(土) 21:55:13.75
GNU CLISPってことはwindowsかな?
だとすると、slime+clisp がついてくるlispcabinetが
おすすめ
インストールするだけで環境が整うよ
0251SCHEME餃子 ◆8X2XSCHEME 2011/10/29(土) 22:01:13.63
Lisp は言語としては (今となっては相対的に) それほど複雑とも難しいとも言えないし、日常的なスクリプトを書くのにも使えるけれど、
実質的には実用的な開発環境が Emacs か Vi しかないっつーのは環境をととのえるとこからめんどくさくて初心者にはハードルが高いよな。
Lispbox 使えよ。
0252SCHEME餃子 ◆8X2XSCHEME 2011/10/29(土) 22:02:08.85
最近は lispcabinet なんてのもあるのか。
導入の楽さでは Lispbox よりも上っぽいな。
0253デフォルトの名無しさん2011/10/29(土) 22:02:45.70
Slimv - SLIME for Vim - YouTube
http://www.youtube.com/watch?v=dSofx9hur1Q

見てみたけど面白いね。vimでここまで出来るなら、使い勝手がよさそう
0254デフォルトの名無しさん2011/10/29(土) 22:16:23.99
quicklispのことまで考えたらcabinetのほうがいいけどな。
そもそもwindowsで関数型言語をやる環境は整えるのが大変だわ。
msのところに本拠があるはずのhaskellだってlinuxのほうが扱いやすい。
windowsはさっさと捨てて、linuxを使ったほうが変な悩みは減るよ。
0255デフォルトの名無しさん2011/10/29(土) 22:18:37.60
Vimとか、Vimスクリプトの時点でお帰り下さいって感じだわ。
Emacs Lispも大概だけど、曲がりなりにもLispだからまだマシ。

という煽りはさておき、LispboxとかLisp Cabinetとかって、
Emacsに薄い皮を被せただけだから、トラブルとか起きると、
結局Emacsの深い所に突っ込んで行かないといけなくて、
そんなにありがたくないんだよね。インストールが楽なだけで。

RacketみたいにIDEも付けてくれると、住み分けできると思うんだけど、
そっちの方向に期待できるのは商用かCCLくらいしかない。
0256デフォルトの名無しさん2011/10/29(土) 22:42:10.35
emacsをもっとwindowsフレンドリーに改変してくれればいいんだろうけど
(環境設定のあたりとか)
現状で満足する人が大多数だから、そうはならないだろうね
dual bootできない環境ならvirtual machine 経由でlinuxを動かすのが現実的な案か
0257デフォルトの名無しさん2011/10/30(日) 03:39:26.35
>>253
綺麗にまとまっているように見えるけど、モードのあるviでREPLって操作性があんまり想像できんわ
上のウィンドウで直接入力してEvalしたりとかもできるんだろうか?

Clojureつかったjettyサーバがトラブった時にemacs入れなくても現場デバッグできるからうれしいんだが。
0258デフォルトの名無しさん2011/10/30(日) 03:48:29.45
>>257
Ctrl-Wwでウインドウを移動して、モードを変える 書き込みはファイルをいじる時と同じ。
Clojureも対応してるし、実はClojureように細工して使ってる。笑
0259デフォルトの名無しさん2011/10/30(日) 12:46:20.68
windowsでもvmware playerでlinuxを別窓にして使ったほうが精神衛生上はるかにいい
0260デフォルトの名無しさん2011/10/30(日) 19:11:51.71
最近はもうVMware使ってないわ
VirtualBoxかqemuで充分だし
0261デフォルトの名無しさん2011/10/30(日) 19:22:19.92
Vimはモードがあると言ったって、モード毎にキーマップがあるから
挿入モードのキーマップで普通は入力しないようなキーに
評価コマンドを割り当てればいいんじゃね

Emacsのsexpと同じような「括弧の釣り合いが取れる」範囲指定も標準装備してるし
(範囲と操作を直交するものとして定義しているから
範囲を受け付けるように操作を定義すればどんな範囲指定とも組み合わせられる。
逆に新しい範囲を定義すれば範囲を受け付けるどんな操作とも組み合わせられる)
0262デフォルトの名無しさん2011/10/31(月) 08:17:52.34
おすすめの入門書てありますか?
0263デフォルトの名無しさん2011/10/31(月) 10:07:16.39
とりあえずANSI Common Lispじゃね?
実践Common LispもWebアプリとか現代的な例があっていいと思う

それはそうとだれかLand of Lisp読んでみた奴いない?
http://landoflisp.com/
なんだか楽しそうなんだがwww
0264デフォルトの名無しさん2011/10/31(月) 13:29:29.19
>>262
絶版だけど、すごい!Lisp
0265デフォルトの名無しさん2011/10/31(月) 13:30:05.90
あれ、これがLispだ!だったっけ。。。
0266デフォルトの名無しさん2011/10/31(月) 16:55:51.20
まさに!Lisp!
0267デフォルトの名無しさん2011/10/31(月) 19:15:09.27
>>263
あのイラスト一杯は行ってるけど普通にLispの本だったよ
0268デフォルトの名無しさん2011/10/31(月) 20:45:21.07
>>263
かなり良い本だから、そのうち邦訳されると思ってる。
小学校の指定教科書にしたいくらいだ。
0269デフォルトの名無しさん2011/10/31(月) 21:00:47.07
出版社も あのシリーズ(manga guide)を扱ってる関係で
押さえられててもおかしくないもんな。
0270デフォルトの名無しさん2011/10/31(月) 22:10:31.57
プログラミング初心者にお勧めのLisp入門書ありますか?
0271デフォルトの名無しさん2011/10/31(月) 22:34:19.71
little schemerのシリーズでいいんちゃう?
0272デフォルトの名無しさん2011/10/31(月) 23:42:40.19
The Common Lisp Cookbook - Using the Win32 API
http://cl-cookbook.sourceforge.net/win32.html

このページの初めのサンプルスクリプトが動かないのですが
(lispworks personal edition version 6.0)
どう改変すれば動くようになるのでしょうか
0273デフォルトの名無しさん2011/10/31(月) 23:45:37.76
scheme手習いシリーズは初心者が手にとるもんじゃない、Gauche本がいいって結論じゃなかったっけ。
0274デフォルトの名無しさん2011/10/31(月) 23:50:05.14
Gauche本をプログラミング初心者に勧める奴がいたら神経疑う。悪いけど
0275デフォルトの名無しさん2011/11/01(火) 00:01:18.48
とりあえずいろいろ厚手だしネット上で読めるし、いいんじゃね?
神経疑ってるひとの補足があればさらにいいが。
0276デフォルトの名無しさん2011/11/01(火) 00:19:57.98
common lisp 入門
http://www.geocities.jp/m_hiroi/xyzzy_lisp.html#abclisp
このぐらいの分量でちょうど良い
0277デフォルトの名無しさん2011/11/01(火) 00:23:37.47
>>275
まえがきの「対象読者」から引用

> 本書は、GaucheやSchemeについてはよく知らないけれど、他の
> プログラミング言語でなら開発経験があるという読者を
> 主な対象にします。

ずぶの素人に独習で読ませたらEmacs導入のところで放りなげるよ
0278デフォルトの名無しさん2011/11/01(火) 00:28:07.94
そう言う意味じゃemacs Lispの入門書がプログラミング自体が初心者という人には良いのかもな
0279デフォルトの名無しさん2011/11/01(火) 00:46:15.74
>>272
エラーメッセージ詳しく。
0280デフォルトの名無しさん2011/11/01(火) 00:47:09.38
そうなるのか
0281デフォルトの名無しさん2011/11/01(火) 00:50:52.09
>>279
CL-USER 1 > (require "win-header")

Error: Unknown module "win-header".
1 (abort) Return to level 0.
2 Return to top loop level 0.

Type :b for backtrace or :c <option number> to proceed.
Type :bug-form "<subject>" for a bug report template or :? for other options.

これです
0282デフォルトの名無しさん2011/11/01(火) 00:59:15.38
俺はグレアムのansi common lispで勉強したけど。あれで十分だった。
ただ、anti-loopistだからそのへんは理解しておいていいかも。
俺はいまだにloopは嫌いなくらい。
0283デフォルトの名無しさん2011/11/01(火) 01:24:00.78
>>281
LispWorks自体にはwin-headerなるモジュールは付属してない。
だから、"Unknown module"って言われてる。LispWorksのドキュメントにも、
Windows APIはサポートしてないから、自分でFLI使って定義してね、って書いてるし。

多分、そこのページにある、Appendix Aをwin-header.lispとか名付けてrequireして、
さらにdefpackageでwhを定義する必要がある。不完全なコードなので、即投げ捨てて良い。

こっちを読むべき。

http://www.lispworks.com/documentation/lw60/FLI/html/fli.htm
0284デフォルトの名無しさん2011/11/01(火) 01:29:34.27
>>283
なるほど、そういうことですか。
紹介して下さったfliのページを読んでみます
ありがとうございます
0285デフォルトの名無しさん2011/11/01(火) 01:40:38.22
Windows APIを直叩きしたいなら、Clozure CLが楽だと思う。
examplesのmswin.lispにウィンドウを表示するサンプルがある。

あとは、Doorsっていうライブラリが複数の処理系に対応してるけど、
ドキュメントないし、Quicklispにも収録されてないので、
ASDF知らないとインストールで引っ掛かるかも。

https://github.com/Lovesan/doors
0286デフォルトの名無しさん2011/11/01(火) 01:56:11.75
>>273
ごめん^^; 手習いシリーズは 詰将棋や 一人チェスの入門問題集みたいだったな。
0287デフォルトの名無しさん2011/11/01(火) 07:50:41.67
Little Schemer に一票 >> 初心者向け

しかも和訳でなく、原書の方。

英語版で読むと幼稚園児でも出来そうに見えるのに、
日本語版で読むと同じ内容でも小難しく感じる不思議。
0288デフォルトの名無しさん2011/11/01(火) 10:49:20.43
>>267>>268
そうかありがとう
どうしよっかな、買っちゃおうかな
0289デフォルトの名無しさん2011/11/01(火) 12:40:20.45
>>288
8章のサンプルは公開されてるから、それを読んでみて理解できるか確認すればよい。
平素な英語で書かれているので、初めての洋書としても向いてると思うけどね。
0290デフォルトの名無しさん2011/11/01(火) 13:33:19.95
英語でのある人のおすすめってこうらしい
http://carcaddar.blogspot.com/2011/10/common-lisp-is-best-language-to-learn.html
Between Land of Lisp, David Touretzky's Common Lisp: A Gentle Introduction to
Symbolic Computation (really great book for people new to programming,
available for free) and The Little LISPer (3rd edition, editions four and up
use Scheme) you have three really great resources to get started.

David Touretzkyの本はすでに絶版になっててオンラインでPDFで著者が公開してるくらい
しかない。金がなくて始めたいという人ならいいかもしれない。
0291ミサワ2011/11/01(火) 14:34:15.10
つれー 日本語訳が小難しいからつれーわー 日本語訳が小難しいからなー
0292デフォルトの名無しさん2011/11/01(火) 19:11:45.82
金がない場合は知恵がいる
知恵がない場合は金がいる
0293初心者2011/11/02(水) 02:28:47.09
レスさんくすです。

CLスレだけど、プログラミング初心者向けはschemeがいいみたいですね。

LispSchemeスレの過去ログみたらSCHEME餃子さんが、Gauche本、プログラミング言語 SCHEMEの後に
手習いシリーズ勧めてたみたいだけど、これはscheme初心者向けであってプログラミング初心者向け
の場合は逆になるって事ですね。

まずは>>276のサイトでCL勉強してみます。ありがとうございました。
0294デフォルトの名無しさん2011/11/02(水) 19:54:50.09
schemeならSICPは外せないだろ
英語版はWebで無料公開されてるし
0295デフォルトの名無しさん2011/11/02(水) 20:13:37.48
SICPはSchmeの勉強のためには書かれていない

たいして勉強しないでもSchemeを使えるような奴のために書かれている
0296デフォルトの名無しさん2011/11/03(木) 02:26:32.03
windowsでecl-11.1.1を使っています。
Unicodeが使えるそうなので、ためしに"あ"を表示するスタンドアロンのプログラムを作っています。
REPLでは以下の通り実行することで、"あ"を表示することができました。

> (setf (stream-external-format *standard-output*) :cp932)
> (write-char #\U3042)

しかし、これをそのままコンパイルしてもうまく動きません。
どうすればできるか教えてください。
あと、"#\U3042"ではなく"#\あ"と書いても動かせる方法があればそれも教えてください。
0297デフォルトの名無しさん2011/11/03(木) 04:18:23.74
どのように上手く動かないか、情報が足りないから何とも言えない。
多分、コンパイル後コンソールで実行したら文字化け、ってパターンだと思うけど。

ECLってexternal formatのサポートが不完全だったと思うんだけど、それは直ったの?
リファレンスマニュアルの"13.2. Input/Output model"の部分。

> - No support for external formats. Reading and writing is performed using the 8-bit code of the character.
> - No support for Unicode characters. The code of large characters is simply truncated.

これが直ってないなら、利用するエンコーディングのバイト列に自分で変換して、
write-sequenceとかで出力しないといけないけど。

とりあえず、コンソールで動かしたときのexternal formatの値をprintするとか、
出力されたデータを16進表示してどのエンコーディングか判断したりとか、
問題の切り分けから始めてみるのを勧める。
02982962011/11/03(木) 15:57:48.85
external formatのサポートについては知りませんでした。
気長にやってみます。
ありがとうございました。
0299デフォルトの名無しさん2011/11/03(木) 23:30:38.58
ECLを使ってるのがコンパクトな実行形式を作るためなら、
SBCLに移行して、圧縮したコアイメージで実行形式を作るっていう手もあるよ。
SBCLならその辺りのサポートはきちんとしてるし、圧縮率も割と良いみたい。
0300デフォルトの名無しさん2011/11/05(土) 09:40:41.36
ポールグラハムの話で時折出てくるロバートモリスって、
sendmailワームの人?
0301デフォルトの名無しさん2011/11/05(土) 09:57:12.99
そうだよ。

モリスがその事故起こした時に相談受けていろいろ動いたりした「友人」ってのがポールグレアム。
0302デフォルトの名無しさん2011/11/05(土) 11:45:26.42
そうなんだ
ありがとう
0303デフォルトの名無しさん2011/11/05(土) 15:12:25.63
うちのVAX11感染したの思い出した
0304デフォルトの名無しさん2011/11/06(日) 12:47:58.86
>>303
おっさん乙
0305デフォルトの名無しさん2011/11/06(日) 13:10:18.71
マクロをapplyするにはどうしたらいいんでしょうか
こんな感じのことがしたいんですが。
(let((a '(true 1 2)))(apply if a))
0306デフォルトの名無しさん2011/11/06(日) 13:33:18.66
(let ((a '(true 1 2))) (eval `(if ,@a)))
0307デフォルトの名無しさん2011/11/06(日) 19:24:21.74
そういう風にevalを使うのは、某文書の言う所のレッドフラッグってヤツだと思う。
実行時にメタプログラミングをしてたりするなら話は別だけど。

質問自体が最初に結論ありきな感じだけど、>>305は本当にifをapplyしないといけないの?
実はifの上に単純なマクロを構築すれば良い話だったりしないかな。
0308デフォルトの名無しさん2011/11/06(日) 21:39:17.26
>>305
CLHSみるとifはoperatorであって、どんな実装になってるか規定されてないわけだが
なぜifがマクロだって思ったんだ?
0309デフォルトの名無しさん2011/11/07(月) 18:13:10.80
まさにこの話だと思う

apply-macroの話
ttp://e-arrows.sakura.ne.jp/2010/12/common-lisp-apply-macro.html
0310デフォルトの名無しさん2011/11/07(月) 18:34:52.87
関数とマクロとスペシャルフォーム
Lisp で一番ややこしい部分だと個人的に思っている。
0311デフォルトの名無しさん2011/11/07(月) 18:37:18.98
マクロあるいは特殊形式のapplyてどういときに嬉しいんだろ
0312デフォルトの名無しさん2011/11/07(月) 22:45:04.56
関数・マクロ・special operator の区別がついてないときに嬉しい

…と、昔の自分を思い出してそう思った。
ややこしい部分ではないんだけど落とし穴になりそうな概念だとは思う。
0313デフォルトの名無しさん2011/11/14(月) 08:17:17.68
Lisp中級ぐらいになるには
だいたいどの位の期間が必要ですか?
0314デフォルトの名無しさん2011/11/14(月) 08:41:17.56
計算機科学の素養があれば一ヶ月もあれば中級Lisperになれると思うけど、
プログラミング経験ゼロからのスタートなら数年はかかると思う。
0315デフォルトの名無しさん2011/11/14(月) 11:14:44.24
>>313のいう初級中級上級の定義はわからないけど、shiroさんところに”ネタ”として
10段階に分けたページがあったな。
0316デフォルトの名無しさん2011/11/17(木) 22:47:48.09
普段大学でcommon lispを習っていて、emacsでslimeを起動して勉強しています。
自宅でもやりたいなと思い、ubuntu11.10を導入してemacs23とslimeをインストールして
起動まではできました。

そこで大学で書いたプログラムをロードしようとしたら、
The value 1985828 is not of type (MOD 1114112).
[Condition of type TYPE-ERROR]
このようなエラーが出たのですがどういうことでしょうか?
大学では何も問題なく、動いてたプログラムです。
色々調べて見たのですが解決法がわかりません。
どなたか回答よろしくお願いします。
0317デフォルトの名無しさん2011/11/18(金) 00:01:03.56
>>316
大学の処理系は64ビットで、自宅の処理系が32ビットだったりしない?

http://www.lispworks.com/documentation/HyperSpec/Body/t_mod.htm

を読んでもらうと分かると思うけど、1114112より小さい正の整数しか許されない型に、
1985828を値として渡してエラーになってる。コードが変わっていないなら、
処理系やOSなどが原因で、リミットに引っかかっている可能性が高い。

とりあえず、SLIMEなら下にスタックトレースが出ると思うんだけど、
上から10個くらいはどうなってる? どっかで見た数なんだけど、思い出せない。
0318デフォルトの名無しさん2011/11/18(金) 00:04:47.80
ああ、分かった。Unicodeだ。#x110000。

ファイルやネットワーク通信のデータとかに、適切じゃないデータが入ってるとか、
code-charに変なデータ渡してるとか、external formatの設定が適正じゃないとか、
その変はどう?
0319デフォルトの名無しさん2011/11/18(金) 00:13:08.90
>>317
大学も自宅も32bitマシンです。

適切じゃないデータは入ってない・・・と思います。
code-charやexternal formatについてはよく分かりません。
すみません・・・。
0320デフォルトの名無しさん2011/11/18(金) 00:21:06.60
>>319
とりあえず、処理系の名前は?

それと、エラーが出たとき、「Restarts:」の下に「Backtrace:」ってのがあって、
そこに番号振ったS式が出て来るよね? それの0〜10くらいまで晒してくれない?
それによって、どういうコードでエラーが発生してるのか分かる。

10まで表示されてないよ、って場合は「--more--」までカーソル持ってくと、
次のが出て来る。
0321デフォルトの名無しさん2011/11/18(金) 00:24:04.98
>>320

処理系はどちらもSBCLです。

Backtrace:
0: (SB-KERNEL::OBJECT-NOT-TYPE-ERROR-HANDLER ..)
Locals:
SB-DEBUG::ARG-0 = :<NOT-AVAILABLE>
SB-DEBUG::ARG-1 = #.(SB-SYS:INT-SAP #XB5E0E470)
SB-DEBUG::ARG-2 = #<SB-ALIEN-INTERNALS:ALIEN-VALUE :SAP #XB5E0E12C :TYPE (* ..)>
SB-DEBUG::ARG-3 = (399 16)
1: (SB-KERNEL:INTERNAL-ERROR #.(SB-SYS:INT-SAP #XB5E0E12C) #<unavailable argument>)
Locals:
SB-DEBUG::ARG-0 = #.(SB-SYS:INT-SAP #XB5E0E12C)
SB-DEBUG::ARG-1 = :<NOT-AVAILABLE>
2: ("foreign function: call_into_lisp")
[No Locals]

Backtraceにはこれしか書いていません。
0322デフォルトの名無しさん2011/11/18(金) 00:29:01.94
SBCLのFFI APIでエラーが起きてる。FFI使ってる?
Cのライブラリのバインディングか何か?
コードを晒すことって可能? エラーが起きる場所が把握できてるなら、
そこだけでも良い。
0323デフォルトの名無しさん2011/11/18(金) 00:35:36.75
>>322

FFIとはなんでしょうか?
コードは800行あるので全部は晒せません。
またエラーが起きてる場所も自分では把握できてないです。
何もわかってなくてすみません。
0324デフォルトの名無しさん2011/11/18(金) 00:47:26.79
>>323
Foreign Function Interface。LispからCの関数を呼んだりする仕組み。
分からないのは最初はみんなそうだから気にせんで良いよー。

単にコードの大きさが問題で貼れないなら、

http://paste.lisp.org/

とかGist(https://gist.github.com/)でも大丈夫。

エラーが起きてる場所は普通バックトレース(スタックトレース)とかで把握するけど、
それで分からないなら、(print "function-xx: in")みたいなのを関数の最初に追加しても良い。

実行はどういう風にしてるの? C-c C-c? C-c C-e? それとも*slime-repl sbcl*から?
0325デフォルトの名無しさん2011/11/18(金) 00:56:05.59
FFIというは多分使ってないと思います。
コードはこれで見れるでしょうか?
https://gist.github.com/1373494

実行は
emacs開く
M-x slimeでslime起動
C-c C-lで上のコードをロードする。
するとロード中に当初のエラーが起きます。
0326デフォルトの名無しさん2011/11/18(金) 01:03:32.25
>>325
こっち(Windows XP SP3、SBCL 1.0.52)で評価したけど、普通に通るコード。

原因が分かった気がする。保存したファイルの文字コードがEUC-JPじゃない?
EmacsでC-x RET fして、utf-8-unix指定した後で保存して、再度ロードするとどうなる?
0327デフォルトの名無しさん2011/11/18(金) 01:10:33.26
>>326
できました!!
ありがとうございます!
ファイルの文字コードが大学と自宅じゃ違ったということでしょうか?
これは自動で変換してくれたりはしないのでしょうか?
毎回指定して保存しなければならないのでしょうか?
0328デフォルトの名無しさん2011/11/18(金) 01:15:38.92
>>327
おめでとう。お疲れ様。

ファイル自体のエンコーディングが大学と自宅で違ったか、
処理系の標準のエンコーディングの設定が大学と自宅で違ったかだと思う。

sb-impl::*default-external-format*を.sbclrcで設定したり、
slime-net-coding-systemを.emacsで設定したりすることで、
自分の普段使ってるエンコーディングを標準で使うことができるよー。
これらのキーワードでグーグル先生に尋ねれば、色々出てくると思う。
0329デフォルトの名無しさん2011/11/18(金) 01:21:37.56
>>327
本当にありがとうございました。

エンコーディングについては自分で調べて努力してみます。
0330デフォルトの名無しさん2011/11/18(金) 17:23:12.67
dig 2ch.net | grep 2ch | tail -n 1 > get.dat
cat get.dat
2ch.net. 8 IN A 206.223.154.230

このget.datを読み込んでリスト化ってどうやりますか?
0331デフォルトの名無しさん2011/11/19(土) 00:10:57.50
>>329
ソースの一行目に";; -*- coding:utf-8-unix -*-"とかコメント行を入れるといいかも。
0332デフォルトの名無しさん2011/11/19(土) 00:27:26.94
SBCLもそれ解釈してくれるの?
0333デフォルトの名無しさん2011/11/19(土) 00:40:17.53
>>330
(with-open-file (s "get.dat")
(mapcar (lambda (x)
(ppcre:split "\\s+" x))
(loop for l = (read-line s nil) while l collect l)))
;=> (("2ch.net." "8" "IN" "A" "206.223.154.230"))
0334デフォルトの名無しさん2011/11/19(土) 01:36:27.02
>>333
ありがとうございます。lambdaとmapcarってこうやって使うんですね。
0335デフォルトの名無しさん2011/11/19(土) 02:12:07.73
(cadddr (with-open-file (s "get.dat")
(mapcar (lambda (x)
(ppcre:split "\\s+" x))
(loop for l = (read-line s nil) while l collect l))))
引き出せないのはなんで?
(cadddr (loop for x from 1 to 10
collect (loop for y from 1 to x
collect y) ))
;;=> (1 2 3 4)
0336デフォルトの名無しさん2011/11/19(土) 06:48:52.64
おはよう。1要素しかないのにcdrのcdrのcdrのcarを参照してるから。
(("2ch.net." "8" "IN" "A" "206.223.154.230"))のcdrはnil。
nilのcdrはnilで、そのcdrもnil。nilのcarはnil。

(defparameter *lines*
(with-open-file (s "get.dat")
(loop for l = (read-line s nil)
while l collect (ppcre:split "\\s+" l))))

(caar *lines*)
;=> "2ch.net."
(cadar *lines*)
;=> "8"

普通は頭が混乱するので、firstやsecond、eltなどを使う。

(let ((first-line (car *lines*)))
(values (first first-line) (second first-line)))
;=> "2ch.net.", "8"

(let ((first-line (car *lines*)))
(values (elt first-line 0) (elt first-line 1)))
;=> "2ch.net.", "8"
■ このスレッドは過去ログ倉庫に格納されています