Before LISPs Just Part of the Past ~#8 Rindoh~
Upcoming SlideShare
Loading in...5
×
 

Like this? Share it with your network

Share

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

on

  • 3,120 views

An idea to stack and launch unit tests.

An idea to stack and launch unit tests.

Statistics

Views

Total Views
3,120
Views on SlideShare
323
Embed Views
2,797

Actions

Likes
1
Downloads
1
Comments
0

4 Embeds 2,797

http://shibuya.lisp-users.org 2693
http://127.0.0.1 83
http://localhost 16
http://www.google.co.jp 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 ~#8 Rindoh~ Presentation Transcript

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