#:g1: 番号付き括弧

Posted 2021-05-12 01:47:37 GMT

PDP-11上のLISP処理系であるLISP-11のマニュアルを眺めていたところ、括弧の下の行に番号を付与している記述がありました。
1960年代初頭のパンチカード時代に良く利用されていたようですが、編集時の括弧のずれでエラーになった場合に不整合を素早く検知できたりするかもしれないので、そういうエディタコマンドを作成してみます。

(ql:quickload "split-sequence")

(defun numbered-parens (str) (with-output-to-string (out) (let ((pc 0)) (format out "~&~{~A~^~%~}" (mapcan (flet ((subchar (pc) (character (princ-to-string (mod pc 10))))) (lambda (line) (list line (map-into (make-string (length line)) (lambda (c) (case c (#\( (prog1 (subchar pc) (incf pc))) (#\) (prog2 (decf pc) (subchar pc))) (otherwise #\Space))) line)))) (split-sequence:split-sequence #\Newline str))))))

#+LispWorks (progn (editor:defcommand "Numbered Parens" (p) "" "" (declare (ignore p)) (editor::with-random-typeout-to-window () (editor::with-defun-start-end-points (beg end) (editor:current-point) (write-string (numbered-parens (editor::points-to-string beg end))))))

(editor:bind-key "Numbered Parens" "Control-N"))

括弧のエスケープの処理をきちんと処理するのは手間なので実装していませんが、こんな感じに表示します。

(defun numbered-parens (str)
0                      1   1
  (with-output-to-string (out)
  1                      2   2
    (let ((pc 0))
    2    34    43
      (format out
      3        
              "~&~{~A~^~%~}"

(mapcan (flet ((subchar (pc) 4 5 67 8 8 (character (princ-to-string (mod pc 10))))) 8 9 0 09876 (lambda (line) 6 7 7 (list line 7 (map-into (make-string (length line)) 8 9 0 09 (lambda (c) 9 0 0 (case c 0 (#\( (prog1 (subchar pc) (incf pc))) 1 2 3 4 4 4 432 (#\) (prog2 (decf pc) (subchar pc))) 2 2 2 3 3 3 321 (otherwise #\Space))) 1 109 line)))) 8765 (split-sequence:split-sequence #\Newline str)))))) 5 543210

まとめ

近頃だと括弧を虹色に分別して表示する機能があり、LispWorksにも標準で実装されていたりしますが、60年前のrainbow modeというところですね。
個人的には色分けされても括弧対応が判然としないのですが、数字付きだとさすがにはっきりします。
さて、果してデバッグで役に立つかどうか、しばらく使ってみます。


HTML generated by 3bmd in LispWorks 7.0.0

comments powered by Disqus