다음 매크로가 작동 중임을 확인하십시오. 나는 일반적인 경우의 매개 변수 목록에서 a3
을 떠날 경우xor에 대한 체계 매크로 정의
(define-syntax xor
(syntax-rules()
((xor a1 a2)
(if a1
(false? a2)
(true? a2)))
((xor a1 a2 a3 ...)
(let ((a (xor a1 a2)))
(xor a a3 ...)))))
그러나 보인다, 그것은 제대로 작동하지 않습니다.
(define-syntax xor
(syntax-rules()
((xor a1 a2)
(if a1
(false? a2)
(true? a2)))
((xor a1 a2 ...)
(let ((a (xor a1 a2)))
(xor a ...)))))
따라서 두 번째 경우의 줄임표가 정확히 무엇인지 궁금합니다.
1x. 생략 부호를 제외한 각 매개 변수 목록은 올바르게 실행하려면 고유해야합니다.
주어진 입력 예 : (xor #t #t #t)
, 첫 번째는 #t
이고 두 번째는 #f
입니다.
내가 사용하는 통역자는 mit-scheme
입니다.
질문 2. 그리고 그것을 단락시킬 수 있습니까?
감사합니다.
[라켓의 'oneof'기능의 기능 변형]의 사용 가능한 복제 (http://stackoverflow.com/questions/38820738/functional-variant-of-oneof-function-in-racket) –
매크로로 이것을하는 것이 합리적입니까? 2-ary 확장은 첫 번째 인수와 관계없이 두 번째 인수를 평가해야하므로'(λ (a b) (a가 아닌 경우))'함수와 어떻게 다릅니 까? –
@ JoshuaTaylor 맞습니다. 단락이없는 경우 함수로 정의하는 것이 좋습니다. 여기서 매크로로 시도해보고 생략 문제를 해결하려고하면 ** Q1 **를 참조하십시오. 실 웨스터 (Sylwester)의 말에 따르면, 단락 회로를 만드는 방법이 존재합니다. 그러면 매크로는이 경우 함수보다 더 유용합니다. – Ling