if
ブール論理とマクロを使用して独自のものを書きたかったのです。私は次の実装を思いつきました:
(defmacro -if (condition if-true if-false)
"Implements `if` in terms of Boolean logic only"
`(or (and ,condition ,if-true)
(and (not ,condition) ,if-false)))
いくつかのケースで手動でテストしましたが、期待どおりに動作します。しかし、一連のテストを実行するための簡単なテスト関数を書いたところ、まだ理解できない結果が 1 つ得られました。私は次のように関数を書きました:
(defun -if-test ()
(let ((passed 0)
(test-format "TEST: ~50a ==> ~:[FAILURE~;SUCCESS~]~%")
(cases '((return-value (> 2 1) true)
(return-value (< 2 1) false)
(standard-output (> 2 1) "true")
(standard-output (< 2 1) "false"))))
(dolist (test-case cases)
(destructuring-bind (type test expected) test-case
(let ((result (case type
(return-value
(eq (-if test 'true 'false) expected))
(standard-output
(with-output-to-string (out)
(string= (-if test (print "true" out) (print "false" out)) expected)))
(otherwise (error "Unknown test type: ~a" type)))))
(when result (incf passed))
(format t test-format test-case result))))
(format t "Result: ~a/~a tests passed.~%" passed (length cases))))
テストを実行すると、次の出力が得られます。
TEST: (RETURN-VALUE (> 2 1) TRUE) ==> SUCCESS
TEST: (RETURN-VALUE (< 2 1) FALSE) ==> FAILURE
TEST: (STANDARD-OUTPUT (> 2 1) true) ==> SUCCESS
TEST: (STANDARD-OUTPUT (< 2 1) false) ==> SUCCESS
Result: 3/4 tests passed.
NIL
2 番目の失敗例は、手動で実行した場合と、この関数の一部として実行した場合で明らかに異なる結果になります。SLDB でデバッグしてみましたが、実際にスタンドアロンで実行した場合とは結果が異なります。重要な実行の詳細などを見逃していたのではないかと思います。誰かがここで何が起こっているのか説明できますか? 助けて本当に感謝しています。
PS私の実装はClozure CLです。