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 racket
implementation of struct at github을 보거나 DrRacket의 심볼을 마우스 오른쪽 버튼으로 클릭하고 "다른 파일과 마찬가지로 소스를 열려면"파일 열기를 선택하십시오. 이것에 대한 비밀은 없지만 당신이 협상 한 것보다 약간 더 복잡 할 수 있습니다.
NB :define-struct
은 더 이상 #lang racket
에서 선호하는 양식이 아니며 하위 호환성을 위해 제공됩니다. struct
이 바람직합니다.