tags. 🔖org-mode 🔖Emacs 🔖Literate Programming
Clojure w/ org-babelによる文芸的プログラミングまとめ
org-modeのノート上からREPLにjack-inしてコードを評価. すなわち, Design Journal を org-modeから実施する(aka. Literature Programming). m 昔からずっと興味があり追求したいテーマであるものの, 情報が少ないため自分で開拓していく.
resultオプションまとめ(アウトプット)
org-babelのresultsオプションまとめ.
vladkotu.github.io/clj-plot.org at source - GitHubより.
標準的な出力(:results pp)
#+begin_src clojure :results pp
1
#+end_src
#+RESULTS:
: 1
:
結果のリスト表示(:results value list)
#+begin_src clojure :results value list
[1 2 3]
#+end_src
#+RESULTS:
- 1
- 2
- 3
結果のテーブル表示
:results value tableをつかう.
#+begin_src clojure :results value table
[{:a 1 :b 2} {:c 1 :d 2}]
#+end_src
#+RESULTS:
| :a | 1 | :b | 2 |
| :c | 1 | :d | 2 |
ppとclojure.pprint/print-tableを使う.
#+begin_src clojure :results value pp
(clojure.pprint/print-table
[{:a 1 :b 2} {:a 3 :b 4}])
#+end_src
#+RESULTS:
: | :a | :b |
: |----+----|
: | 1 | 2 |
: | 3 | 4 |
Tips/HOWTO
header options
- begin_src clojureを指定してorg-babelにclojureを設定.
- :results ppをすることで結果をpretty print
- valueという評価結果を表示する指定はdefaultのため省略されている.
- :ns fooを宣言すると, 起動時のnamespaceを設定できる.
- resultは指定した nsにbindされる.
(require '[lib.twitter.guest :as guest]) (guest/get-user "richhickey")
org-babel実行
- まず事前にREPLを立ち上げておく.
- C-c C-c を実行することでコードを評価.
- cider-jack-in or cider-connectの選択を求められる.
- 事前に立ち上げておいたREPLにcider-connect
✅Org-modeでclojureコードを評価(ob-clojure)
通常は M-x org-edit-src-codeでコード編集だが, org-modeから編集するTips.
org-babel で 実行したい言語としてclojureをenable. デフォルトでは emacs-lisp だけ.
(org-babel-do-load-languages
'org-babel-load-languages
'((lisp . t)
(shell . t)
(clojure . t)))
これで code blockに関わらずclojureがかける. 評価はorg-modeではC-x C-eがemacs-lispの評価に取られているので, 別のkeybindを設定する.
(org-defkey org-mode-map "\C-u\C-x\C-e" 'cider-eval-last-sexp)
see also: Org-modeで使用できる言語を増やすには?
org-edit-src-exit/org-edit-src-abortをrebinings
clojure-modeでorg-edit-src-exit/org-edit-src-abortのキーバインドが上書きされるので, re-biningsするといい.
(define-key clojure-mode-map (kbd "C-c C-x k") 'org-edit-src-exit)
(define-key clojure-mode-map (kbd "C-c C-x q") 'org-edit-src-abort)
namespaceの設定
いつもどおりnsを定義する.
#+begin_src clojure :results pp
(ns kk.test)
(def he "hi")
#+end_src
org-src-editでコードを評価するときは, 接続先のREPLのnamespaceと一致させる. 例えばこの場合は, (in-ns ‘kk.test)などでREPLのnamespaceを移動.
org-babel-headerに :ns属性を設定すると, org-babelからの評価で指定したnamespaceで評価される(そうでなければREPLのnamespace). この:nsオプションはob-clojure特有かも.
✅orgファイルからnamespaceにconenctしcljファイルをplaygroundにする
orgファイルからあるnamespaceに接続しつつ, cljファイルからも接続する. 言い換えると, REPLを経由してorgファイルとcljファイルのデータや関数の定義を共有する.
こうすると, いろいろと試したいときは白紙のcljファイルをplaygroundにしつつ, ある程度形が定まったらorgに移動することができる. ここでのポイントはREPLを通じて両者の環境はつながっている.
これは, Design Journalの手法に似ている. Clojureでは comment をつかうことで試行錯誤をそこで作業しつつ, 完成したら上のほうへコピーする. しかしcljファイルに文章を書くのはあまり効率がよくない. そこで, cljファイルにいろいろと書くのではなくて, orgファイルに設計や分析を書いていく.
または, orgファイルから, org-src-editを起動することでミニバッファ上で操作をすることもできるが, ガッツリひとつの関数を作り込むのにはどうもorg-src-editだと狭い.
画像の表示を切り替え
M-x org-toggle-inline-images