Bye Bye Moore

PoCソルジャーな零細事業主が作業メモを残すブログ

uLispで動作中のS式を直接加工する

Common lispのヤバすぎる特徴として動いてる関数を直接加工できるというアレがあります。

postd.cc

これを基礎にしてるuLispにも、同様の機能があります。

実際のところ

こんな関数が動いていたとします。

(defun b (x) (pinmode 13 t) (digitalwrite 13 x) (delay 500) (b (not x)))

実行はいつも通り、REPLで。

1182> (b t)

これを加工し、遅延時間を500ミリ秒から100ミリ秒にします。
まずはエディタを開きます。

(edit 'b)

この状態でEnterをおすと、?とかえってきます。
エディットモードになりました。

1182> (edit 'b)

?

qと出すと、最新のS式が出てきます。

1182> (edit 'b)
q
(lambda (x) (pinmode 13 t) (digitalwrite 13 x) (delay 500) (b (not x)))

実際に動かしてみると、こんな感じ。
aがcar、dがcdr、rが置き換え、bが構文木の遡りです。
コマンドは一文字で、複数文字を使っても可能です。

1182> 
(edit 'b)
d
?
((x) (pinmode 13 t) (digitalwrite 13 x) (delay 500) (b (not x)))
d
?
((pinmode 13 t) (digitalwrite 13 x) (delay 500) (b (not x)))
d
?
((digitalwrite 13 x) (delay 500) (b (not x)))
d
?
((delay 500) (b (not x)))
ada
!
500
r100

100
b
?
(100)
b
?
(delay 100)
q
(lambda (x) (pinmode 13 t) (digitalwrite 13 x) (delay 100) (b (not x)))

うまくうごかないとき

  • 改行コードが設定されてないと、シリアル通信がうまくできまません。私はこれで5分ほど詰まりました。