[英]What is define-struct in Racket and why are there no variables?
在我大學的一門 CS 課程中,我們必須使用 Racket。 我在大學之前的大部分編程時間都是在 PHP 和 Java 以及 JavaScript 上度過的。我知道 Racket 是一種函數式編程語言,就像 JavaScript 一樣(編輯:當然不是。但我覺得我在做“函數式”編程有了它,在看到答案后,這是一種錯誤的看法。)但我仍然不了解球拍(方案)的一些基本特征。
為什么沒有“真正的”變量? 為什么球拍/方案中的所有內容都是 function? 為什么語言設計者不包括它們?
什么是define-struct
? 是 function 嗎? 是 class 嗎? 不知何故,由於我的 PHP 背景,我總是認為它是 class,但這不可能是真的。
我的問題是我想了解語言的概念。 我個人仍然認為它真的很奇怪,不像我以前用過的任何東西,所以我的大腦試圖將它與 JavaScript 進行比較,但它對我來說似乎太不同了。 與 JavaScript 的相似之處/不同之處會有很大幫助!
Racket 中有“真實”變量。 例如,如果您編寫此代碼
(define x 3)
“全局”變量x
將被設置為值 3。如果你現在寫
(set! x 4)
變量x
會將其值更改為 4。因此,如果需要,在 Racket 中,您可以像在任何“普通”語言中一樣擁有“普通”變量。 事實上,在 Racket 中,首選的編程風格是功能性的,而不是過程性的。 在函數式編程風格中,不鼓勵變量突變。
define-struct
是一個 Racket 宏,用於定義“結構模板”以及其他一些東西。 例如,如果你寫:
(define-struct coord (xy))
您剛剛定義了一個“結構模板”(即名為coord
的用戶類型,它有兩個“插槽”: x
和y)
。 之后,您現在可以:
創建結構coord
的新“實例”,例如: (make-coord 2 3)
從結構 object 中提取槽值:
(coord-x (make-coord 2 3));will return 2
要么
(coord-y (make-coord 2 3));will return 3
你可以問一些給定的 object 是否就是那個結構。 例如, (coord? 3)
將返回#f
,因為 3 不是coord
結構類型,而是
(coord? (make-coord 2 3));will return #t
也許最流行或最流行的編程方式(使用 C++、Javascript 和 Java 等語言)具有一些特征。 你可能認為它們是不言而喻的,是唯一可行的方法。 他們包括:
你專注於說“做這一步,然后下一步”等等。
您聲明一個變量,並不斷為其分配不同的值(“改變它”)。
您將代碼和數據捆綁到類中,並將它們的實例聲明為對象。 然后你改變對象。
Learning Scheme 或 Racket 將幫助您了解這些並不是 go 的唯一途徑。
一開始它可能會讓你的大腦受傷,就像哲學 class 可能會讓你質疑你認為理所當然的事情一樣。 然而,與哲學 class 不同的是,讓大腦受傷會有一些實際的回報。 :)
替代:
Scheme 和 Racket 使探索這些想法變得容易。 但它們不像 Haskell 那樣是“純函數式”,所以如果你真的想做命令式的、可變的、面向對象的事情,你也可以這樣做。 然而,學習 Racket 以與 Javascript 相同的方式做事並沒有多大意義。
Scheme 非常具有“真實”變量。
函數式語言(如 Racket)和命令式語言(如 JavaScript 或 PHP)之間的區別在於,在函數式語言中,您通常不使用可變的 state。變量最好被視為值的名稱,而不是容器保持價值觀。 不是使用循環構造之類的東西來更改變量中的值,而是使用遞歸來進行流控制。
define-struct
是一種特殊的句法形式,有點像其他語言中的關鍵字。 (與其他語言不同,在 Scheme 中您可以創建自己的語法 forms。)它定義了一個結構類型,類似於 class 但沒有方法。 它還定義了一些函數來幫助您使用新的結構類型。
Scheme中有變量。
> (define a 1) #<unspecified> > a 1 > (set! a 2) #<unspecified> > a 2
這種語言甚至有可變的數據結構。
> (begin > (define v (make-vector 4)) > (vector-set! v 0 'foo) > (vector-set! v 1 'bar) > (vector-set! v 2 'baz) > (vector-set! v 3 'quux)) #<unspecified> > v #(foo bar baz quux)
Scheme 不是純粹的 FP 語言; 它確實允許命令式編程,盡管它主要面向函數式編程。 這是 Scheme 的發明者做出的設計選擇。
define-struct
是一種特殊形式; 它的語法,如function
或 JavaScript 中的return
關鍵字。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.