Before
LISPs
Just Part of the Past
〜 #5 syntax tree diff 〜
Motivation
(defun iota (n)
- (let (lst)
- (dotimes (i n (nreverse lst))
- (push i lst))))
+ (if (< n 0)
+ (error "Negative...
Motivation
そこ、インデントしか変わってないんですが...
(defun iota (n)
- (let (lst)
- (dotimes (i n (nreverse lst))
- (push i lst))))
+ (if (<...
Motivation
● 粒度
– 行 vs 構文要素
● 表示
– ソースコード vs 構文木
– Lispはソースコード ≒ 構文木
Syntax Tree diff
(defun iota (n)
(if (< n 0)
(error "Negative N is given : ~a." n)
(let (lst)
(dotimes (i n (nreverse lst)...
検出したい操作
● 構文木上の節点の
– 追加
– 削除
– 置換
– 包含
– 抽出
● ここで、節点は内部節点または外部節点
追加と削除
(defun foo (n)
(+ n 1))
(defun foo (n)
(+ n 1 2))
追加
削除
置換と包含と抽出
置換
置換
包含
抽出
(eq (car lst)
refmark)
(if lst
(eq (car lst)
refmark))
(and lst
(eq (car lst)
refmark)
経路
● 節点までの道順
– 経路 = (cons 自分の順位 親の経路)
– 根の経路 = (0)
nreverseの経路 : (0 2 1 2 3 0)
(dotimes (i n (nreverse lst))
(push i lst))...
経路の編集距離
● 外部節点自体はEQUALか否かしか考慮しない
● 新旧にEQUALな節点がある場合、その経路の編集距離が近い場合には追加ではなく
包含や抽出と考えたほうが妥当
● 特に、編集距離 =1 の場合、
(cond ((= (len...
現状
● diffの前後でなくなった節点は削除として検出
– 内部節点では、その要素が1つも新に残っていない場合のみ削除として検出
– (x y z w) -> (x z w)
● (x y z w) vs (x z w) vs (x y z ...
その他
● 結果の表示
– 木には2次元的な広がりがあるので、時間的な前後をどう表示するか
● 外部節点の比較方法
– コンセプトとしてはEQを採用したい
● リーダマクロの取り扱い
– READしたコードのdiffなので、リーダマクロ展開済み...
Upcoming SlideShare
Loading in …5
×

Before LISPs Just Part of the Past ~#5 syntax tree diff ~

431 views
383 views

Published on

report about the first implementation of syntax tree diff.

Published in: Technology
0 Comments
4 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
431
On SlideShare
0
From Embeds
0
Number of Embeds
4
Actions
Shares
0
Downloads
3
Comments
0
Likes
4
Embeds 0
No embeds

No notes for slide

Before LISPs Just Part of the Past ~#5 syntax tree diff ~

  1. 1. Before LISPs Just Part of the Past 〜 #5 syntax tree diff 〜
  2. 2. Motivation (defun iota (n) - (let (lst) - (dotimes (i n (nreverse lst)) - (push i lst)))) + (if (< n 0) + (error "Negative N is given : ~a." n) + (let (lst) + (dotimes (i n (nreverse lst)) + (push i lst))))) (defun iota (n) (let (lst) (dotimes (i n (nreverse lst)) (push i lst)))) (defun iota (n) (if (< n 0) (error "Negative N is given : ~a." n) (let (lst) (dotimes (i n (nreverse lst)) (push i lst))))) diff
  3. 3. Motivation そこ、インデントしか変わってないんですが... (defun iota (n) - (let (lst) - (dotimes (i n (nreverse lst)) - (push i lst)))) + (if (< n 0) + (error "Negative N is given : ~a." n) + (let (lst) + (dotimes (i n (nreverse lst)) + (push i lst)))))
  4. 4. Motivation ● 粒度 – 行 vs 構文要素 ● 表示 – ソースコード vs 構文木 – Lispはソースコード ≒ 構文木
  5. 5. Syntax Tree diff (defun iota (n) (if (< n 0) (error "Negative N is given : ~a." n) (let (lst) (dotimes (i n (nreverse lst)) (push i lst))))) (defun iota (n) (let (lst) (dotimes (i n (nreverse lst)) (push i lst)))) (defun iota (n) (if (< n 0) (error "Negative N is given : ~a." n) (let (lst) (dotimes (i n (nreverse lst)) (push i lst))))) syntax-tree-diff
  6. 6. 検出したい操作 ● 構文木上の節点の – 追加 – 削除 – 置換 – 包含 – 抽出 ● ここで、節点は内部節点または外部節点
  7. 7. 追加と削除 (defun foo (n) (+ n 1)) (defun foo (n) (+ n 1 2)) 追加 削除
  8. 8. 置換と包含と抽出 置換 置換 包含 抽出 (eq (car lst) refmark) (if lst (eq (car lst) refmark)) (and lst (eq (car lst) refmark)
  9. 9. 経路 ● 節点までの道順 – 経路 = (cons 自分の順位 親の経路) – 根の経路 = (0) nreverseの経路 : (0 2 1 2 3 0) (dotimes (i n (nreverse lst)) (push i lst)) の経路 : (2 3 0) 0
  10. 10. 経路の編集距離 ● 外部節点自体はEQUALか否かしか考慮しない ● 新旧にEQUALな節点がある場合、その経路の編集距離が近い場合には追加ではなく 包含や抽出と考えたほうが妥当 ● 特に、編集距離 =1 の場合、 (cond ((= (length old-route) (1+ (length new-route))) '抽出) ((= (length old-route) (1- (length new-route))) '包含) (t '追加か削除)) ; orderの大小関係で追加か削除か決まる という関係がわかっているので、こういうのをうまく使いたい – 編集距離 > 1 で成り立つ関係はまだ見つけていない
  11. 11. 現状 ● diffの前後でなくなった節点は削除として検出 – 内部節点では、その要素が1つも新に残っていない場合のみ削除として検出 – (x y z w) -> (x z w) ● (x y z w) vs (x z w) vs (x y z w) (x z w) ● 旧に存在しない外部節点は追加として検出 ● 経路が同じでEQUALでない外部節点は異なる外部節点として扱う – これを置換とすべきか ● EQUALな節点の経路が似ている場合に包含を検出 ● 置換・抽出についてはまだ検討してない – 特に内部節点の置換
  12. 12. その他 ● 結果の表示 – 木には2次元的な広がりがあるので、時間的な前後をどう表示するか ● 外部節点の比較方法 – コンセプトとしてはEQを採用したい ● リーダマクロの取り扱い – READしたコードのdiffなので、リーダマクロ展開済み ● 経路の編集距離 >1 の場合にどんな関係が成り立つのか? ● 他の実装の調査 ● Zubora library

×