Before LISPs Just Part of the Past ~#8 Rindoh~

3,350 views
3,298 views

Published on

An idea to stack and launch unit tests.

Published in: Sports
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
3,350
On SlideShare
0
From Embeds
0
Number of Embeds
3,015
Actions
Shares
0
Downloads
2
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

Before LISPs Just Part of the Past ~#8 Rindoh~

  1. 1. Before LISPs Just Part of the Past 〜 #8 Rindoh 〜
  2. 2. Motivation 1 (defun stride-mapcar (stride fn lst) (labels ((rec (lst acc) (if (<= stride (length lst)) (rec (drop lst stride) (cons (funcall fn (car lst)) acc)) (rec lst nil))) beginner (nreverse acc))))
  3. 3. Motivation 1 (defun stride-mapcar (stride fn lst) (labels ((rec (lst acc) (if (<= stride (length lst)) (rec (drop lst stride) (cons (funcall fn (car lst)) acc)) (rec lst nil))) (nreverse acc)))) (stride-mapcar beginner 2 #'symbol-name '(alpha a beta b)) ; => (“ALPHA” “BETA”)
  4. 4. Motivation 1 (defun stride-mapcar (stride fn lst) (labels ((rec (lst acc) (if (<= stride (length lst)) (rec (drop lst stride) (cons (funcall fn (car lst)) acc)) (rec lst nil))) beginner (nreverse acc))))
  5. 5. Motivation 1 (defun stride-mapcar (stride fn lst) (labels ((rec (lst acc) (if (nth (1- stride) lst) (rec (drop lst stride) (cons (funcall fn (car lst)) acc)) (rec lst nil))) beginner (nreverse acc))))
  6. 6. Motivation 1 (defun stride-mapcar (stride fn lst) (labels ((rec (lst acc) (if (nth (1- stride) lst) (rec (drop lst stride) (cons (funcall fn (car lst)) acc)) (rec lst nil))) (nreverse acc)))) (stride-mapcar beginner 2 #'symbol-name '(alpha a beta b)) ; => (“ALPHA” “BETA”)
  7. 7. Motivation 1 ● たまに短い値が返ってくる ● とりあえず以前の定義で同じ値を返すのかが知りたい – – ● 同じ値を返すなら、アルゴリズムを見直す 違う値を返すなら、書き換えるときに無茶な仮定をしていないか見直す 関数定義を一時的に前の定義に戻して使う構文が欲しい – 呼び出し連鎖の中から値を取り出すのは面倒なので、レキシカルではなく大域的に (with-version ((stride-mapcar 0)) (foo ...)) ; FOO indirectly uses STRIDE-MAPCAR beginner
  8. 8. Motivation 1 ● たまに短い値が返ってくる ● とりあえず以前の定義で同じ値を返すのかが知りたい – – ● 同じ値を返すなら、アルゴリズムを見直す 違う値を返すなら、書き換えるときに無茶な仮定をしていないか見直す 関数定義を一時的に前の定義に戻して使う構文が欲しい – 呼び出し連鎖の中から値を取り出すのは面倒なので、レキシカルではなく大域的に (with-version ((stride-mapcar 0)) (foo ...)) ; FOO indirectly uses STRIDE-MAPCAR beginner
  9. 9. Motivation 1 ● たまに短い値が返ってくる ● とりあえず以前の定義で同じ値を返すのかが知りたい – – ● 同じ値を返すなら、アルゴリズムを見直す 違う値を返すなら、書き換えるときに無茶な仮定をしていないか見直す 関数定義を一時的に前の定義に戻して使う構文が欲しい – 呼び出し連鎖の中から値を取り出すのは面倒なので、レキシカルではなく大域的に (with-version ((stride-mapcar 0)) (foo ...)) ; FOO indirectly uses STRIDE-MAPCAR beginner
  10. 10. Motivation 1 ● たまに短い値が返ってくる ● とりあえず以前の定義で同じ値を返すのかが知りたい – – ● 同じ値を返すなら、アルゴリズムを見直す 違う値を返すなら、書き換えるときに無茶な仮定をしていないか見直す 関数定義を一時的に前の定義に戻して使う構文が欲しい – 呼び出し連鎖の中から値を取り出すのは面倒なので、レキシカルではなく大域的に (with-version ((stride-mapcar 0)) (foo ...)) ; FOO indirectly uses STRIDE-MAPCAR beginner
  11. 11. Motivation 1 ● たまに短い値が返ってくる ● とりあえず以前の定義で同じ値を返すのかが知りたい – – ● 同じ値を返すなら、アルゴリズムを見直す 違う値を返すなら、書き換えるときに無茶な仮定をしていないか見直す 関数定義を一時的に前の定義に戻して使いたい      – 呼び出し連鎖の中から値を取り出すのは面倒なので、レキシカルではなく大域的に (with-version ((stride-mapcar 0)) (foo ...)) ; FOO indirectly uses STRIDE-MAPCAR beginner
  12. 12. Motivation 2 fledgling
  13. 13. Motivation 2 fledgling
  14. 14. Motivation 2 ● 定義を修正した時には既に期待していた答えを忘 れている – ユニットテスト書く? – 引数と返り値を全部保存しといたらいいんじゃ... fledgling
  15. 15. Motivation 2 ● 定義を修正した時には既に期待していた答えを忘 れている – ユニットテスト書く? – 引数と返り値を全部保存しといたらいいんじゃ... fledgling
  16. 16. Motivation 2 ● 定義を修正した時には既に期待していた答えを忘 れている – ユニットテスト書く? – 引数と返り値を全部保存しといたらいいんじゃ... fledgling
  17. 17. Motivation 1 関数定義に細工して 定義を保存する beginner fledgling
  18. 18. Motivation 2 関数定義に細工して 実行時に 引数列と返り値を保存する beginner fledgling
  19. 19. Motivation 1&2 関数定義に細工する novice fledgling
  20. 20. RINDOH:VDEFUN ● vdefun name lambda-list form* => name ● DEFUNフォームが保存される ● 適用のたびに引数とその評価結果が保存される ● VDEFUNフォームを評価すると、テストを実施する ● テストケース全てをパスしないと定義を更新できない beginner
  21. 21. RINDOH:VDEFUN ● vdefun name lambda-list form* => name ● DEFUNフォームが保存される ● 適用のたびに引数とその評価結果が保存される ● VDEFUNフォームを評価すると、テストを実施する ● テストケース全てをパスしないと定義を更新できない fledgling
  22. 22. RINDOH:VDEFUN ● vdefun name lambda-list form* => name ● DEFUNフォームが保存される ● 適用のたびに引数とその評価結果が保存される ● VDEFUNフォームを評価すると、テストを実施する ● テストケース全てをパスしないと定義を更新できない fledgling
  23. 23. RINDOH:VDEFUN ● vdefun name lambda-list form* => name ● DEFUNフォームが保存される ● 適用のたびに引数とその評価結果が保存される ● VDEFUNフォームを評価すると、テストを実施する ● テストケース全てをパスしないと定義を更新できない beginner fledgling
  24. 24. RINDOH:WITH-VERSION ● with-version (version-spec*) form* => result ● 指定されたバージョンの関数を使ってformを評価する (with-version ((iota 3) (stride-mapcar 1)) (stride-mapcar 2 #'twice (iota 10))) beginner
  25. 25. その他 ● WITH-RAW-FN ● DEFINE-TEST-FORM, DEFINE-TEST-CASE ● RUN-TEST ● STDIFF – ● 意外と見辛い 版管理?
  26. 26. 課題 ● 関数定義構文を囲むレキシカル環境が見えない – (let ((counter -1)) (vdefun gen-id () (incf counter))) ● 呼び出しフォームを捕まえるために&RESTパラメータを強制して いる – (vdefun iota (n &optional (start 0)) ...) => (defun iota (&rest params) ...) ● テストや定義をファイルに保存する形式 – VDEFUNフォーム vs エントリ (MAKE-LOAD-FORM)
  27. 27. 課題 ● 関数定義構文を囲むレキシカル環境が見えない – (let ((counter -1)) (vdefun gen-id () (incf counter))) ● 呼び出しフォームを捕まえるために&RESTパラメータを強制して いる – (vdefun iota (n &optional (start 0)) ...) => (defun iota (&rest params) ...) ● テストや定義をファイルに保存する形式 – VDEFUNフォーム vs エントリ (MAKE-LOAD-FORM)
  28. 28. 課題 ● 関数定義構文を囲むレキシカル環境が見えない – (let ((counter -1)) (vdefun gen-id () (incf counter))) ● 呼び出しフォームを捕まえるために&RESTパラメータを強制して いる – (vdefun iota (n &optional (start 0)) ...) => (defun iota (&rest params) ...) ● テストや定義をファイルに保存する形式 – VDEFUNフォーム vs エントリ (MAKE-LOAD-FORM)

×