2ちゃんねる ★スマホ版★ ■掲示板に戻る■ 全部 1- 最新50  

■ このスレッドは過去ログ倉庫に格納されています

【Lisp】プログラミング言語 Clojure #2【JVM】

1 :デフォルトの名無しさん:2011/10/13(木) 18:41:38.12
JVM上で動作するLisp方言「Clojure」のスレ。

Clojure - home
http://clojure.org/
http://www.try-clojure.org/

前スレ:
【Lisp】プログラミング言語 Clojure【JVM】
http://hibari.2ch.net/test/read.cgi/tech/1255533519/

203 :デフォルトの名無しさん:2011/11/29(火) 21:32:55.00
>>198はメッセージの通り、docというマクロ自体を引数として与えようと事によるエラー
Clojureのマクロは今の所それ自体の「値」を直接手に入れることができない

>>200は1.2では内部関数であるprint-docが外部にむき出しになっていたのが
1.3でちゃんと外部から直接呼べないようになったので動かなくなった

ところで、要するにdocの出力を文字列として受け取ればいいんだよな?
Clojureでは標準入出力を直接使う代わりに*in*や*out*という名のvarを使い、それらがデフォルトで標準入出力になってる
with-out-strは内側で*out*を動的にStringWriterへ束縛して、*out*に出力された文字列を返り値にする
なので、こうすれば望んだ結果が得られる

(map (fn [name] (with-out-str (doc name))) '(list))

204 :デフォルトの名無しさん:2011/11/29(火) 21:45:56.51
あ、*in*などを使うのは強制ではないし、System/inなどをハードコードしてる場合もリダイレクトできるってわけじゃない
coreは勿論、大抵のClojureライブラリも*in*などを使ってるんだけど、出力先を指定できないJavaライブラリを使うときは注意

205 :デフォルトの名無しさん:2011/11/29(火) 21:56:08.39
>>203
俺もそんな感じでいけるんじゃないかと思ったが
docが変数名そのものから展開してしまって思うようにいかなかったわ
そのコード例だと、(fn …)の返り値が全部#'clojure.core/nameのドキュメントになる

>>200
(defmacro docs [& xs]
(apply list 'list (for [x xs] `(with-out-str (doc ~x)))))
とマクロを定義して
(docs print println def defn)
で(doc …)の文字列のリスト取得できるようになる…と思う
可変長引数じゃなくてベクタやリストを渡したければ[& xs]を[xs]にでもしてくれ



206 :デフォルトの名無しさん:2011/11/29(火) 21:57:50.54
(source doc)してみれ docのマクロは読める。

207 :デフォルトの名無しさん:2011/11/29(火) 22:07:29.05
1.3で(macroexpand '(doc list))するとどうなるの?
1.2.1だと(clojure.core/print-doc (var list))になるんで>>199にしてみたんだが。

208 :デフォルトの名無しさん:2011/11/29(火) 22:13:49.63
>>207
1.3だと((var clojure.repl/print-doc) (clojure.core/meta (var list)))になったよ

それじゃあと、(use '[clojure.repl :only (print-doc)])としてみたんだが
IllegalAccessError print-doc is not public clojure.core/refer (core.clj:3774)
というエラーが出た。

243 KB
■ このスレッドは過去ログ倉庫に格納されています

★スマホ版★ 掲示板に戻る 全部 前100 次100 最新50

read.cgi ver 05.02.02 2014/06/23 Mango Mangüé ★
FOX ★ DSO(Dynamic Shared Object)