수색…


구문 규칙이 포함 된 위생적이며 참조가 투명한 매크로

LISP와 Scheme이 다른 주류 프로그래밍 언어에 비해 가장 큰 이점은 매크로 시스템입니다. C 전 처리기 및 다른 매크로 언어와 달리 Scheme 매크로는 구문 분석 된 코드를 입력으로 사용하고 확장 된 코드를 출력으로 반환합니다. 이것은 Scheme의 "code is data"문구의 응용 프로그램 중 하나이며 언어를 그렇게 강력하게 만듭니다.

Scheme의 매크로는 여러 가지 방법으로 매크로를 정의 할 수있는 define define-syntax 으로 생성됩니다. 가장 간단한 방법은 패턴 일치를 사용하여 입력 코드를 출력 코드로 변환하는 syntax-rules 을 사용하는 것입니다.

이 예제에서는 for item in list 대해 단순하게 만들고 for item in list 에있는 요소를 반복하는 for list as item 구문 for list as item for item in list 만듭니다.

(define-syntax for
  (syntax-rules (in as) ; 'in' and 'as' keywords must match in the pattern
    ; When the 'for' macro is called, try matching this pattern
    ((for element in list
          body ...) ; Match one or more body expressions
     ; Transform the input code
     (for-each (lambda (element)
                 body ...)
               list))
    ; Try matching another pattern if the first fails
    ((for list as element
          body ...)
     ; Use the existing macro for the transform
     (for element in list
          body ...))))

이 두 매크로는 다음과 같이 사용되어보다 긴급한 스타일을 제공 할 수 있습니다.

(let ((names '(Alice Bob Eve)))
  (for name in names
    (display "Hello ")
    (display name)
    (newline))
  (for names as name
    (display "name: ")
    (display name)
    (newline)))

코드를 실행하면 예상되는 결과가 제공됩니다.

Hello Alice
Hello Bob
Hello Eve
name: Alice
name: Bob
name: Eve

주의해야 할 가장 일반적인 실수는 올바른 값을 매크로에 전달하지 않아서 매크로 호출 대신 확장 된 양식에 적용되는 도움이되지 않는 오류 메시지가 나타나는 경우가 많습니다.

for 구문의 정의는 상기 식별자들이하고 목록을 전달되는지 여부를 검사하지 않기 때문에 임의의 다른 타입의 전달은 가리키는 에러가 발생할 것이다 for-each 대신의 호 for 호. 디버깅은 매크로의 목적을 무효화하므로 사용자가 수표를 넣고 사용 오류를보고하는 것은 사용자의 몫입니다.이 오류는 컴파일 할 때 잡힐 수 있습니다.



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow