2011-03-08 3 views

답변

1

이 코드는 상당히 세분화되어 있습니다.

로 시작하려면,

(define-syntax (check stx) 
    (syntax-case stx() 
     [(f (x y)) 
     #'(list 'second: f x y)])) 

(check (3 4)) 

오류를 얻을 : 확인 : 나쁜 구문 :

문제를 확인하지만, 확장에 표시되는 'F'의 사용입니다. 이를 확인하려면, 그것을 밖으로 데리고 나가보십시오

(define-syntax (check stx) 
    (syntax-case stx() 
     [(f (x y)) 
     #'(list 'second: 1234 x y)])) 

(check (3 4)) 

이 생산, 좋은 평가 '(초 : 1234 3 4)

그래서

, 왜 첫 번째 실패는 무엇입니까? 문제는 첫 번째 예에서,

(check (3 4)) 

는하지만,

(list 'second check 3 4) 

에이의 문제를 확장한다는 것이다가 확장에서 '확인'매크로의 또 다른 사용은 '확인'이다 따라서 이어야하며 확장되어야하며이 두 번째 확장은 올바른 모양이 아니어야합니다.

이것을 보려면 매크로 스테퍼를 사용하여 프로그램을 확장 해보십시오. 매크로 스테퍼를 실행하고 풀다운 메뉴를 사용하여 "표준"매크로 숨김을 선택하고 "끝 ->"버튼을 클릭 한 다음 한 단계 뒤로 이동하십시오. 호기심에서

(define-syntax (check stx) 
    (syntax-case stx() 
     [(_ (x y)) 
     #'(list 'second: 1234 x y)])) 

(check (3 4)) 

:

일반적인 규칙은 다음과 같이 패턴에서 매크로 이름에 일치하는 "걱정하지 않는다"상징으로 밑줄 "_"를 사용하는 것입니다 : 이 코드의 출처는 어디입니까?

+0

라켓에서 구문을 배우고 있으며 코드는 테스트 용입니다. 첫 번째 예제에서'f'를'(f (x y))'로 바꾸면 코드는 무한 재귀를 끝내기는하지만 구문이 정확합니다. 고마워. –

+1

John : 매크로 스테퍼에 대해 언급 했어야합니다! –

관련 문제