- ハンドル: masatoi
- Emacs歴は20年くらい?
- Common Lispでスマホ決済プラットフォームのバックエンドを作っている
- 例) 渋谷区: ハチペイ、 大学生協アプリ etc…
- 大学では機械学習の研究をしていた、今でも趣味でやっている
- Common Lispでやっていたが最近はPythonを使う必要が出てきた…
- PythonでもLispで書きたい!
- Python上で動くLisp https://github.com/hylang/hy
- PythonのASTに変換される(Python <-> Hyで変換可能)
- マスコットのイカ
- シンタックスはClojureっぽい
- Lispなのでマクロにより拡張可能
(defn fact1 [n]
(loop [[cnt 1] [acc 1]]
(if (= cnt n)
acc
(recur (inc cnt) (* acc cnt)))))
(defn fact2 [n]
(let [acc 1]
(for [i (range 1 n)]
(setv acc (* acc i)))
acc))
- 最近まで破壊的変更がゴリゴリに入っていたが安定してきた・・・?
- Emacs用のhy-modeはあるが、メンテナンスされていない
- https://github.com/hylang/hy-mode
- Pythonの静的解析ツールJediベースのJedhyを使っている
- リアルタイムの処理系の状態は取れない
- 最低限欲しい機能
- eval
- REPL
- コードファイル内からの式の評価
- 処理の中断 (interrupt)
- completion
- シンボル補完
- lookup
- 定義ジャンプ
- 引数ヘルプ
- eval
=> 作る!!
- hy-mode:
- Hyの基本的なシンタックスハイライトやインデントを行う。Emacsのメジャーモード
- HyREPL: Hy用のnREPLサーバ
- nREPLとはプログラミング言語処理系と開発環境を仲介するサーバ
- 元々はClojure用だがプロトコルは汎用
- Hyで書かれている。最新のHyで動かなかったのでフォークしてほとんど書き直した
- Rail: 移植性重視のシンプルなnREPLクライアント。Emacsのマイナーモード
- こちらもフォークして拡張している
構成図
参考: Clojureの場合
既にpython3.8以降がインストール済とする
Hyをインストール
pip install hyrule==0.6.0 hy==0.29.0
HyREPLをインストール
pip install git+https://github.com/masatoi/HyREPL.git
Railをインストール
cd ~/.emacs.d/site-lisp/ git clone https://github.com/masatoi/Rail.git
hy-modeをインストール。MELPAにある
M-x package-install hy-mode
Emacsの設定ファイル
(add-to-list 'load-path (locate-user-emacs-file "site-lisp/Rail"))
(require 'rail)
(autoload 'hy-mode "hy-mode" "Mode for editing Hylang source files" t)
(add-hook 'hy-mode-hook
(lambda ()
(rail-interaction-mode)
(rail-setup-eldoc)))
(setq auto-mode-alist (append '(("\\.hy$" . hy-mode)) auto-mode-alist))
- 起動
HyREPL起動
$ hyrepl
REPL接続
M-x rail localhost:1337
.hyファイルを開くとhy-modeになっている
- 式の評価
- モジュールのimport、シンボル補完
- オブジェクトの属性/メソッドの補完
- 引数ヘルプ
- 定義ジャンプ (to Hy, to Python)
- デバッグ機能 スタックトレースやインスペクタなど
- インタラプト機能 長い処理を中断するためのオペレータ
- 名前空間 Pythonのモジュールのコンテキストで評価する
言語処理系からの情報の取得部分は自前で作る必要があるが、UIの出し方の部分はEmacsの提供している標準的なモジュールをほとんどそのまま使える!
- REPL: comint
- シンボル補完: completion-at-point
- 引数ヘルプ: Eldoc