4

"call/cc"는 임의의 제어 흐름 구성을 구현하는 데 사용될 수 있으므로 "call/cc"를 사용하여 이러한 모든 구성을 구현하려고하지만 문제가 있습니다. "if"가 없다고 가정하면 "define-syntax"와 "call/cc"를 어떻게 사용합니까? 그럴 수 있습니까, 아니면 제가 잘못 인도 되었습니까? "call/cc"를 사용하여 무조건 점프를 구현하는 방법을 알고 있지만 기계 수준에서 조건부 실행은 프로세서의 상태 비트에 따라 실행되는 분기 명령으로 수행됩니다. 이 유형의 구조가 없으면 어떻게 할 수 있는지 보지 못합니다."call/cc"를 사용하여 "if"를 구현할 수 있습니까?

답변

7

당신은 할 수 없다 - 당신은 일부 어떤 것을 시험하고 그것이 진실인지 거짓인지에 따라 행동해야한다. 당신은 부울의 기능적 표현과 함께 가까이에 갈 수 있습니다. 예를 들어, 일반적인 교회 인코딩 :

(define (true x y) x) 
(define (false x y) y) 

을 지금 당신은 "성공"지속과 "실패"를 받아들이는 함수로 (이 인코딩 된 논리 값 중 하나를 반환) 시험을 고려 할 수 있습니다 계속하려면 사용 : 당신이 일을 썽크 필요하므로

(define (if c x y) (c x y)) 

이 실험 할 경우, 당신은, 계획은 게으른 언어 아니라는 사실을 고려해야합니다. 예를 들어 :

(define (true x y) (x)) 
(define (false x y) (y)) 
(define-syntax if 
    [(if c x y) (c (lambda() x) (lambda() y))]) 

은 (하지만 당신은 여전히 ​​이러한 논리 값을 반환하는 등 기존 조건을 수정해야합니다.) 자체 call/cc 정말 관련 아무것도하지 않는

어느 쪽이든을 ...

+0

나는 할 수 있다고 생각하지 않았다. 부울 값을 함수로 정의하면 부울 연산자가 다시 정의되어야하는 방식으로 언어의 의미를 변경합니다. Scheme에서 부울 값으로 간주 될 때 모든 함수가 false가 아니기 때문입니다. – N4tur41Myst1c

+0

네, 그런 변화는 다른 언어로 이어질 것입니다 ... 그래서 나는 "할 수 없다"로 시작했습니다. –

2

고차원 절차 만 사용하는 경우 을 구현할 수 있습니다. 이것은 명백한 창세자없는 교회 인코딩입니다 :

IF ? T E === (? (lambda() T) (lambda() F)) 

TRUE  === (lambda (t _) (t)) 
FALSE === (lambda (_ f) (f)) 

당신은 전혀 계속할 필요가 없습니다. True는 첫 번째 인수를 실행하는 이진 함수입니다. False는 두 번째 인수를 실행하는 이진 함수입니다. If는 테스트 (?)에 의해 결정된 True/False를 얻음으로써 그것들을 함께 나열하고 그 결과를 지연시키는 두 가지 함수를 제공하는 삼항 함수입니다.

관련 문제