2011-02-04 4 views
4

if (or에 대한 로컬 바인딩 지원)으로 환산하여 and, ornot으로 표현하기 쉽습니다. 그 반대가 사실인지 알고 싶습니다. 내 순진 첫 번째 시도는 : #fconseq#f입니다 test가 아닌 경우Scheme에서 부울 연산자의 조합으로 표현할 수 있습니까?

(if test conseq altern) => (or (and test conseq) altern) 

그러나 번역이 잘못 인 altern로 평가합니다.

if의 단락 특성을 유지하면서 올바른 값으로 평가되는 번역이 있습니까?

+0

어쩌면 (또는 (및 테스트 (또는 conseq #t)) altern)? – knivil

+0

아,하지만'(if #t #f #t)'는'# t'으로 평가됩니다. 이러한 것들은 제가 해결하려고하는 종류의 트릭입니다. – acfoltzer

답변

4

if이 (가) andor보다 조금 더 좋은 이유가 분명한 것 같습니다. 하지만 당신은 속임수와 실제 결과를 지연하는 lambda를 추가 할 수있는 경우 :

(define-syntax-rule (if c t e) ((or (and c (lambda() t)) (lambda() e)))) 
+0

니스; 저는 게으름을 더하는 아이디어를 좋아합니다. 속임수없이 그것이 가능할 수있는 방법에 대한 생각? – acfoltzer

+0

게으름은 필요하지 않습니다. 중요한 것은 그것을 평가할 수있는 것으로 감싸는 것입니다. – user102008

+0

그 게으름이 필요합니다. 즉, * 값 *이 아닌 계산이 * 포함되어야합니다. 그렇지 않으면'(if #f (print-stuff) 1)'이 물건을 출력하지 못하게하는 단락 속성을 얻지 못한다. –

2

는 일반적인 패턴으로 (or (and test conseq) (and (not test) altern))을보십시오. 두번째 and에서 test을 부정함으로써 test이 참일 경우 conseq#f이거나 test이 거짓 인 경우 #faltern 중 하나가 될 것입니다.

+2

이것은 "test"를 두 번 평가할 수 있다는 단점이 있습니다 – Sean

+0

Nice; 로컬에서 'test'를 바인딩하고이 패턴을 사용하면 작동하는 것처럼 보입니다.바인딩없이 가능한지 궁금합니다. – acfoltzer

1

이 대신 람다에서 포장의 제외 엘리 바질 레이의 대답과 동일, 내가 1 요소 목록 그런데

(if test conseq altern) => (car (or (and test (list conseq)) (list altern))) 

에 포장, 파이썬 전 2.5이 정확한 문제가 있었다 . 파이썬에서 조건식 (즉, test ? conseq : altern을 C에 쓰는 좋은 방법)이 없었습니다. 이것은 Python에서 if이있는 Scheme입니다. 간단한 시도는 대부분의 경우에서 근무

test and conseq or altern 

했지만 실패 conseq이 (등, 0, 빈리스트, 빈 문자열, 즉 거짓) 파이썬에서 거짓으로 간주됩니다. 위에서 발견 한 정확한 문제는 무엇입니까? 추한 외모

(test and [conseq] or [altern])[0] 

를 : 수정 프로그램 (비어 있지 않은 목록은 항상 해당) 목록에 싸서 다시 추출했다. 그래서 그들은 파이썬 2.5에서 구문 conseq if test else altern을 추가했습니다.

관련 문제