Before LISPs Just Part of the Past ~#5 syntax tree diff ~
Upcoming SlideShare
Loading in...5
×
 

Like this? Share it with your network

Share

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

on

  • 459 views

report about the first implementation of syntax tree diff.

report about the first implementation of syntax tree diff.

Statistics

Views

Total Views
459
Views on SlideShare
454
Embed Views
5

Actions

Likes
4
Downloads
0
Comments
0

1 Embed 5

https://twitter.com 5

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

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

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