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

■ このスレッドは過去ログ倉庫に格納されています
2021/06/29(火) 12:35:01.10ID:aO3q0Gho
Lisp Schemeスレでは恥ずかしくて聞けないようなことを質問したり、
Lisp Schemeスレの話題は高度すぎて気後れする人が話しあったり。
それ以外でもCommon Lispについての話題なら歓迎します。

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

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

■前スレ
【入門】Common Lisp その11【質問よろず】
https://mevius.5ch.net/test/read.cgi/tech/1411307361/
【入門】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/
2021/06/29(火) 12:40:54.79ID:mA0b8OxC
祝7年ぶり12回目
2021/06/29(火) 15:43:43.66ID:MbPIkP/a
コードを書く気が起きないときはどうしたらいいですか?
2021/06/29(火) 15:53:22.47ID:jgdHCqsM
>>3
データを書いてください
2021/06/29(火) 16:40:02.63ID:aO3q0Gho
コードを書くコードを書きます
2021/06/29(火) 22:07:20.07ID:vAeooDjH
>>3
repl いじってればやる気出てくるよ
泥団子遊び
2021/07/02(金) 22:43:08.42ID:VlYkPpmP
関数の定義をREPLから呼び出すことはできないのかな?
つまりソースを返すということだけど
それともコンパイルされてバイナリが保持されるからそういう機能はそもそも無い?
2021/07/03(土) 03:15:19.11ID:5m5WWun6
できるシステムとできないシステムがあるよ
function-lambda-expressionがあるよ
できないシステムでも簡単に定義できるよ
やり方は教えないよ
2021/07/03(土) 12:05:36.41ID:GyqXK2AC
できらぁ!
10デフォルトの名無しさん
垢版 |
2021/07/03(土) 12:21:12.15ID:L8iSoH00
教えないんじゃなくて知らないだけだろ
2021/07/03(土) 23:53:55.51ID:SsVGoP7c
普通にtagsファイル作ってるけど

;.init-common.lisp
(declaim (optimize (speed 0) (safety 3) (debug 3)))
(setf (fdefinition 'f2lam) (function fun...))
etc

;sbcl
(compile 'fdes);⇒FDES(副作用として定義置き換え、のはず)
(f2lam (fun fdes))
;defunされた時 (LAMBDA ..., T, FDES
;組み込み NIL, T CAR

こんな感じだったかと
安全取ってるからかもだけど
2021/07/04(日) 00:01:20.66ID:B+AVCUuE
init読まないでイメージ固めようとするとよくコケるのはご愛嬌

処理系のディレクトリに普通はソースあるはずだから、検索コマンドに指定しておくとよい(vimなら:find funでソースが開く)
2021/07/04(日) 00:08:40.22ID:B+AVCUuE
S式を実行時にフォームとして使いたいなら、クオートした状態で持っておいて、適宜functionでクロージャ化して使おう

replに居るときはぜひ欲しいから、fdefinition, function, macro-functionなんかでぜひ短くしておきたい子
2021/07/04(日) 00:27:46.75ID:S8kjsPD9
&wholeを掠め取ってdefunに渡すだけのdefun*でも定義しておけばコンパイル方式がminimumでもfurtherでも大丈夫だろう
plistにでもしまっておこう
symbol-functionにdefunがsetしてくれるし普通に呼べる
2021/07/04(日) 01:15:15.63ID:B+AVCUuE
sbclはランタイムある限りdescribeでソースの場所吐くね
#P"SYS:SRC;CODE;LIST.LISP"
のように
処理系、サード、自前でも任意のオブジェクトのパスを返す

ただし印字するだけで値で返してくれない、REPLから(ed *)でエディタに飛べたら便利なのに、惜しい…

(let ((*standard-output* (make-output-stream))
(describe 'funname)
(get-output-string-stream))

でとりあえずキャプチャはできそうだから、成形する関数をde/strと定義しておき

(ed (de/str 'fun))

で快適にREPLから読めると思います
(*ed-functions*の設定もよしなに)
2021/07/04(日) 01:17:22.55ID:B+AVCUuE
訂正
(get-output-string)→(get-output-string *standard-output*)
です、年のため
2021/07/04(日) 01:20:06.43ID:B+AVCUuE
あっ、年だわ…
2021/07/04(日) 01:44:00.62ID:OmnpCZ06
自作するのであれば5chの書き込みは鵜呑みにしないでslimeのソースコードを参考にするようにしてね
2021/07/04(日) 02:06:58.99ID:lr3qaFF0
印字されるならdescribeのソースでパス取得関数を呼んでるだろうし、非公開でも::で呼んじゃえば
文字列から拾う時点でもう十分行儀が悪いんだし
2021/07/04(日) 13:30:03.34ID:mhtKNh0C
>>7
これは関数定義の位置に飛びたいだけなの?
それとも式そのものが欲しいの?
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況