我記得我讀過的地方不是一個宏,而是內置於核心語言。就像那樣,我不確定,因爲我再也不記得我從哪裏讀到它了。那麼struct
是否在Racket中有宏?如果不是,它爲什麼被嵌入到核心語言中?是在Racket中構造一個宏嗎?
回答
宏; 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
功能定位的源代碼(如果可用)。
除了usepla最偉大的答案,我想補充:
在球拍文檔中,「藍盒子」在右上角,如
procedure
或syntax
短語。對於struct
它說syntax
。如果您考慮
struct
做了什麼,除其他外,它定義了從結構名稱派生的命名函數。所以(struct foo (a b))
將定義一個foo?
謂詞和訪問器foo-a
,foo-b
。一個普通的函數不能像這樣定義新的命名事物,所以它必須是一個宏。
我認爲OP的問題不是關於宏vs程序,而是宏與內建。 –
啊我現在看到了。所以我剛發佈了另一個答案。 :) –
看起來我誤解了這個問題,當我回答以前。所以這裏是對這個問題的回答:
結構是內置的和原始的;他們支持實施。事實上,大約2007年,馬修·弗拉特評論說,PLT的計劃(如球拍是衆所周知的話),在一定意義上的一切是一個結構:
>在週四,2007年16時45分25秒-0700 5月31日, YC寫道:
>出於好奇 - PLT方案實際上使用結構作爲基本的複合類型,即在結構體頂部實現閉包等。我認爲它的方式,一切都是一個結構,但有些東西使用了特殊表示,因爲它們足夠重要。 ( 極端情況是fixnum)。
但同樣有效的答案是:不,不是所有的化合物類型都使用 與來自結構構造函數的值相同的表示形式。
- Source。
您是否認爲Flatt持有這種觀點是因爲'struct foo'創建了類型檢查函數,'foo?',並且在考慮'integer?','boolean?'等方面幾乎沒有明顯的優勢,因爲它們有着根本性的不同各種功能? –
好吧,馬修花了幾十年時間思考這些概念和實現,所以我毫不猶豫地把話放在嘴裏。如果你在郵件列表上詢問_him_會更好。 :)儘管如此:球拍結構提供聚合,封裝,繼承和應用程序。從概念?一切你需要的。現實?也許不會。因爲空間和/或速度。 –
- 1. 如何在Racket中禁用「構造器式打印」?
- 2. 在C99宏中循環構造
- 3. 構造函數可以在C++中調用另一個構造函數嗎?
- 4. 球拍「匹配」結構 - 它是一個宏嗎?
- 5. 構造函數 「是不是一個構造函數」
- 6. Java:Object類有一個構造函數嗎?
- 7. Can Racket宏可以使用關鍵字參數嗎?
- 8. 檢查構造函數是否在ES6中繼承另一個構造函數
- 9. 接口在Java中有一個構造函數嗎?
- 10. 在抽象類中有一個構造函數很好嗎?
- 11. 在.NET中,一個類可以有虛擬構造函數嗎?
- 12. 這是構造器注入的一個理智的實現嗎?
- 13. 這是一個常規的構造函數嗎?
- 14. 原型是它的構造函數的一個實例嗎?
- 15. 構造函數總是一個函數對象嗎?
- 16. 這是一個構造函數聲明嗎?
- 17. 這是隱式地調用一個拷貝構造函數嗎?
- 18. ponylang:在另一個構造函數中調用構造方法?
- 19. EasyMock:在java中構造一個構造函數調用
- 20. 在構造函數中調用另一個構造函數
- 21. 在異常構造函數中記錄錯誤是一個好習慣嗎?
- 22. 構造一個通用對象(不是默認構造函數)
- 23. CAN總線和構造是一起在一個類中的Java
- 24. 是否有可能直接在C++中的另一個構造函數的參數中構造一個對象?
- 25. 是否有可能將構造函數放在另一個構造函數的構造函數中?
- 26. AST轉型:創建宏給一個基本的構造
- 27. 是構造函數生成的默認構造函數嗎?
- 28. 在WebGL中構造一個金字塔
- 29. 我可以在外部構造函數中爲參數類型構建一個無參數構造函數嗎?
- 30. Racket支持多線程嗎?
很少有Racket中的語法形式不是宏:非宏的完整列表如下:http://docs.racket-lang.org/reference/syntax-model.html#%28part._fully-expanded %29 –