Skip to content

Instantly share code, notes, and snippets.

@masatoi
Created August 3, 2024 20:06
Show Gist options
  • Save masatoi/471ae597d860b37c304aabd8b4308314 to your computer and use it in GitHub Desktop.
Save masatoi/471ae597d860b37c304aabd8b4308314 to your computer and use it in GitHub Desktop.

プログラミング言語Hyのモードを作る話

プログラミング言語Hyのモードを作る話

自己紹介、モチベーション

  • ハンドル: masatoi
  • Emacs歴は20年くらい?
  • Common Lispでスマホ決済プラットフォームのバックエンドを作っている
    • 例) 渋谷区: ハチペイ、 大学生協アプリ etc…
  • 大学では機械学習の研究をしていた、今でも趣味でやっている
    • Common Lispでやっていたが最近はPythonを使う必要が出てきた…
    • PythonでもLispで書きたい!

Hyとは

  • Python上で動くLisp https://github.com/hylang/hy
    • PythonのASTに変換される(Python <-> Hyで変換可能)
  • マスコットのイカ

    ~/Documents/emacs-tokyo-hy-mode/cuddles.png

  • シンタックスは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はあるが、メンテナンスされていない
  • 最低限欲しい機能
    • eval
      • REPL
      • コードファイル内からの式の評価
      • 処理の中断 (interrupt)
    • completion
      • シンボル補完
    • lookup
      • 定義ジャンプ
      • 引数ヘルプ

=> 作る!!

開発環境の構成

  • hy-mode:
    • Hyの基本的なシンタックスハイライトやインデントを行う。Emacsのメジャーモード
  • HyREPL: Hy用のnREPLサーバ
    • nREPLとはプログラミング言語処理系と開発環境を仲介するサーバ
    • 元々はClojure用だがプロトコルは汎用
    • Hyで書かれている。最新のHyで動かなかったのでフォークしてほとんど書き直した
  • Rail: 移植性重視のシンプルなnREPLクライアント。Emacsのマイナーモード
    • こちらもフォークして拡張している

構成図

~/Documents/emacs-tokyo-hy-mode/hy-mode-overview.drawio.png

参考: Clojureの場合

~/Documents/emacs-tokyo-hy-mode/hy-mode-overview-clojure.drawio.png

How to use

既に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
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment