2017-11-04 8 views
2

내가 매크로를 사용하여 계획이 뭔가를 구현하기 위해 노력하고있어이체계에서 라켓 스타일의 구조체를 구현하는 방법은 무엇입니까? 라켓에서

(define-struct example (a b)) 

(define var (make-example 1 2)) 

(example? var) 

(example-a var) 

처럼 구조 유형을 생성하고 사용할 수있는 기회를 가질 수 있지만 결합 된 이름을 가진 절차의 생성에 문제가 (make-example 1 2)처럼 대신에을 절대적으로 사용할 수 있습니다. 이러한 이름을 가진 프로 시저 또는이 문제를 해결하는 다른 방법을 정의하는 방법이 있습니까?

답변

3

Scheme을 구현해야합니까?

이미 존재하는 기능을 다른 언어로 볼 필요가 없습니다. 다른 이름 만 있습니다 : records!

SRFI-9 Defining record types에 정의되어 있으며 최신 R7RS에는 이와의 역 호환성이 있으므로 R5RS에서도이 옵션을 선택하는 것이 좋습니다. 많은 R5RS 구현에 포함되어 있습니다. R6RS는 호환되지 않는 레코드의 구현이 다르므로 현재로서는 피해야합니다.

#!r6rs 
;; You want to use SRFI-9 rather than the d\included define-record-type 
(import (except (rnrs) define-record-type) 
     (srfi :9)) 

(define-record-type :example 
    (make-example a b) 
    example? 
    (a example-a set-example-a!) 
    (b example-b set-example-b!)) 

(define var (make-example 1 2)) 
(example? var) ; ==> #t 
(example-a var) ; ==> 1 

당신은 학습과 즐거움

그리고 가장 좋은 방법은 직접이 문제를 파악하려고하는 것입니다 어쨌든 시도하려는. 연결 식별자를 만드는 매크로를 만들려면 define-syntax을 사용할 수 없으므로 사용할 수 없습니다. 속임수를 쓰지 않고 매크로를 사용하면 매크로를 더 잘 이해할 수 있습니다. R6RS syntax-case에 포함 된 라이브러리에 있었고, 당신은 datum->syntax로 식별자를 만들 수 :

#!r6rs 
(import (rnrs) 
     (rnrs syntax-case)) 

(define-syntax make-predicate 
    (lambda (stx) 
    (define (s->p sym) 
     (string->symbol (string-append (symbol->string sym) "?"))) 

    (syntax-case stx() 
     [(_ name) 
     (with-syntax 
      ([predicate (datum->syntax #'name (s->p (syntax->datum #'name)))]) 
     #'(define (predicate v) 
      (and (pair? v) 
        (eq? (car v) 'name))))]))) 

(make-predicate circle) 
predicate?     ; ==> #<procedure-predicate?> 
(predicate? '(predicate x)) ; ==> #t 

을이 일을하는 것은 내가 syntax-case이 존재하는 생각 #lang racket보다는 표준 계획이며,이와 호환 후에 경우. 또한 더 많은 라켓 관련 기능을 보려면 Greg Hendershott's fear of macros을 읽어 보시기 바랍니다.

그냥 완료 방법을 알고 싶습니다.

글쎄요. SRFI-9 spec을 보면 구현이 제공되며 #lang racketimplementation of struct at github을 보거나 DrRacket의 심볼을 마우스 오른쪽 버튼으로 클릭하고 "다른 파일과 마찬가지로 소스를 열려면"파일 열기를 선택하십시오. 이것에 대한 비밀은 없지만 당신이 협상 한 것보다 약간 더 복잡 할 수 있습니다.

NB :define-struct은 더 이상 #lang racket에서 선호하는 양식이 아니며 하위 호환성을 위해 제공됩니다. struct이 바람직합니다.