2017-11-04 29 views
2

私はマクロを使用してスキームにおけるこのような何かを実装しようとしているこのRacketスタイルの構造体を実装する方法は?ラケットで

(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と識別子作ることができます:あなたは、これが#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 racketimplementation of struct at githubを見たり、DrRacketのシンボルを単に右クリックして、 "ファイルを開く"を選択して他のファイルと同様にソースを開くことができます。これに秘密はありませんが、それはあなたが交渉したものより少し複雑かもしれません。

NB:define-structがもはや#lang racketで好ましい形態であるが、ちょうど後方互換性のために提供されていること。 structが好ましい。

関連する問題