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
と識別子作ることができます:あなたは、これが#lang racket
ではなく、私はsyntax-case
が存在し、これに対応していると思わ標準スキームで行った後であれば
#!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
を。また、より多くのラケット特有の機能については、Greg Hendershott's fear of macrosとお読みください。
あなたはそれがどのように行われたかを知りたいだけです。
SRFI-9 specを見ると、それは実装を提供し、さらに#lang racket
implementation of struct at githubを見たり、DrRacketのシンボルを単に右クリックして、 "ファイルを開く"を選択して他のファイルと同様にソースを開くことができます。これに秘密はありませんが、それはあなたが交渉したものより少し複雑かもしれません。
NB:注define-struct
がもはや#lang racket
で好ましい形態であるが、ちょうど後方互換性のために提供されていること。 struct
が好ましい。