2014-01-05 70 views
2

我記得我讀過的地方不是一個宏,而是內置於核心語言。就像那樣,我不確定,因爲我再也不記得我從哪裏讀到它了。那麼struct是否在Racket中有宏?如果不是,它爲什麼被嵌入到核心語言中?是在Racket中構造一個宏嗎?

+1

很少有Racket中的語法形式不是宏:非宏的完整列表如下:http://docs.racket-lang.org/reference/syntax-model.html#%28part._fully-expanded %29 –

回答

3

宏; struct.rkt

(define-syntax (struct stx) 
    (define (config-has-name? config) 
     (cond 
     [(syntax? config) (config-has-name? (syntax-e config))] 
     [(pair? config) (or (eq? (syntax-e (car config)) '#:constructor-name) 
          (eq? (syntax-e (car config)) '#:extra-constructor-name) 
          (config-has-name? (cdr config)))] 
     [else #f])) 
    (with-syntax ([orig stx]) 
     (syntax-case stx() 
     [(_ id super-id fields . config) 
     (and (identifier? #'id) 
       (identifier? #'super-id)) 
     (if (not (config-has-name? #'config)) 
      (syntax/loc stx 
       (define-struct/derived orig (id super-id) fields #:constructor-name id . config)) 
      (syntax/loc stx 
       (define-struct/derived orig (id super-id) fields . config)))] 
     [(_ id fields . config) 
     (identifier? #'id) 
     (if (not (config-has-name? #'config)) 
      (syntax/loc stx 
       (define-struct/derived orig id fields #:constructor-name id . config)) 
      (syntax/loc stx 
       (define-struct/derived orig id fields . config)))] 
     [(_ id . rest) 
     (identifier? #'id) 
     (syntax/loc stx 
      (define-struct/derived orig id . rest))] 
     [(_ thing . _) 
     (raise-syntax-error #f 
          "expected an identifier for the structure type name" 
          stx 
          #'thing)])))) 

球拍IDE,您可以使用Open Defining File功能定位的源代碼(如果可用)。

+0

感謝您的回答。順便說一下,DrPacket中的_Open Defining File_在哪裏? – day

+0

在定義窗口中,右鍵單擊源代碼中的* struct *。該選項應顯示在上下文菜單中。如果Racket無法正確解析源代碼,它有時不起作用,所以在語法上正確的s-expr上使用它。 – uselpa

+0

請注意,結構擴展到'define-struct/derived'。新問題:'define-struct/derived'是宏還是基元? – soegaard

0

除了usepla最偉大的答案,我想補充:

  1. 在球拍文檔中,「藍盒子」在右上角,如proceduresyntax短語。對於struct它說syntax

  2. 如果您考慮struct做了什麼,除其他外,它定義了從結構名稱派生的命名函數。所以(struct foo (a b))將定義一個foo?謂詞和訪問器foo-a,foo-b。一個普通的函數不能像這樣定義新的命名事物,所以它必須是一個宏。

+0

我認爲OP的問題不是關於宏vs程序,而是宏與內建。 –

+0

啊我現在看到了。所以我剛發佈了另一個答案。 :) –

3

看起來我誤解了這個問題,當我回答以前。所以這裏是對這個問題的回答:

結構是內置的和原始的;他們支持實施。事實上,大約2007年,馬修·弗拉特評論說,PLT的計劃(如球拍是衆所周知的話),在一定意義上的一切是一個結構:

>在週四,2007年16時45分25秒-0700 5月31日, YC寫道:
>出於好奇 - PLT方案實際上使用結構作爲基本的複合類型,即在結構體頂部實現閉包等。

我認爲它的方式,一切都是一個結構,但有些東西使用了特殊表示,因爲它們足夠重要。 ( 極端情況是fixnum)。

但同樣有效的答案是:不,不是所有的化合物類型都使用 與來自結構構造函數的值相同的表示形式。

- Source

Start of the thread

+0

您是否認爲Flatt持有這種觀點是因爲'struct foo'創建了類型檢查函數,'foo?',並且在考慮'integer?','boolean?'等方面幾乎沒有明顯的優勢,因爲它們有着根本性的不同各種功能? –

+0

好吧,馬修花了幾十年時間思考這些概念和實現,所以我毫不猶豫地把話放在嘴裏。如果你在郵件列表上詢問_him_會更好。 :)儘管如此:球拍結構提供聚合,封裝,繼承和應用程序。從概念?一切你需要的。現實?也許不會。因爲空間和/或速度。 –

相關問題