読者です 読者をやめる 読者になる 読者になる

レガシーコード生産ガイド

私に教えられることなら

Parenscriptで別ファイルでPSマクロを定義する

ずっとできなくて悩んでたんだけどGithubでコード見て回ったらわかった。最初から見れば良かった…他人のコード読むの大事だ。

psマクロ内でdefmacroして、それをどうにかして別ファイルから使おうと悪戦苦闘していたけど、psマクロ外でdefpsmacroを使えばいいだけだった。

サンプル

ps-app-lib.lispで、->というマクロを定義する。定義したマクロ名はexport

(load "~/quicklisp/setup.lisp")
(ql:quickload :parenscript)

(defpackage :ps-app-lib
  (:use :cl :parenscript)
  (:export ->))

(in-package :ps-app-lib)

(defpsmacro -> (&body body)
  "chainのショートカット"
  `(chain ,@body))

それを使うapp.lisp

(load "~/quicklisp/setup.lisp")
(ql:quickload :parenscript)

(load "./ps-app-lib.lisp")

(defpackage :test-app
  (:use :cl :parenscript :ps-app-lib))

(in-package :test-app)

(print
 (ps (-> console (log 1))))

これで"console.log(1);"というjavascriptコード(の文字列)が出力される。

あとで調べる

  • inotifywaitで自動ビルドするためにsbcl --scriptで実行しているから、loadしているけど、ps-app-lib, appともにコンパイルして、それらを使うスクリプトを別に書いたほうがいいんだろうか?うまいやり方が知りたい
  • いちいちload書かずに:useでカレントディレクトリ下からモジュールを探す方法
  • 自動的にexportにdefpsmacroで定義したシンボルを登録する方法(解決)

解決済み

  • 自動的にexportにdefpsmacroで定義したシンボルを登録する方法

(export 'sym)でsymを公開できる。

(defmacro defpsmacro-ex (name args &body body)
  `(progn
     (defpsmacro ,name ,args ,@body)
     (export ',name)))

(defpsmacro-ex -> (&body body)
  "chainのショートカット"
  `(chain ,@body))
広告を非表示にする