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

🔗References