簡體   English   中英

Racket 中的 define-struct 是什么,為什么沒有變量?

[英]What is define-struct in Racket and why are there no variables?

在我大學的一門 CS 課程中,我們必須使用 Racket。 我在大學之前的大部分編程時間都是在 PHP 和 Java 以及 JavaScript 上度過的。我知道 Racket 是一種函數式編程語言,就像 JavaScript 一樣(編輯:當然不是。但我覺得我在做“函數式”編程有了它,在看到答案后,這是一種錯誤的看法。)但我仍然不了解球拍(方案)的一些基本特征。

  1. 為什么沒有“真正的”變量? 為什么球拍/方案中的所有內容都是 function? 為什么語言設計者不包括它們?

  2. 什么是define-struct 是 function 嗎? 是 class 嗎? 不知何故,由於我的 PHP 背景,我總是認為它是 class,但這不可能是真的。

我的問題是我想了解語言的概念。 個人仍然認為它真的很奇怪,不像我以前用過的任何東西,所以我的大腦試圖將它與 JavaScript 進行比較,但它對我來說似乎太不同了。 與 JavaScript 的相似之處/不同之處會有很大幫助!

  1. Racket 中有“真實”變量。 例如,如果您編寫此代碼

    (define x 3)

    “全局”變量x將被設置為值 3。如果你現在寫

    (set! x 4)

    變量x會將其值更改為 4。因此,如果需要,在 Racket 中,您可以像在任何“普通”語言中一樣擁有“普通”變量。 事實上,在 Racket 中,首選的編程風格是功能性的,而不是過程性的。 在函數式編程風格中,不鼓勵變量突變。

  2. define-struct是一個 Racket 宏,用於定義“結構模板”以及其他一些東西。 例如,如果你寫:

     (define-struct coord (xy))

    您剛剛定義了一個“結構模板”(即名為coord的用戶類型,它有兩個“插槽”: xy) 之后,您現在可以:

    • 創建結構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 不同的是,讓大腦受傷會有一些實際的回報。 :)

替代:

  • 功能性的(而不是命令式的)。 專注於返回值的表達式,而不是制作步驟的待辦事項列表。
  • 不可變的。 同上。
  • 不是object導向的。 使用類的對象可能是解決某些問題的好方法,但不是全部。 如果你想把代碼和數據捆綁在一起,有一些更通用的方法 go 關於它,比如用“let over lambda”的閉包等等。 有時你不需要所有課程的“行李”,尤其是 inheritance。

Scheme 和 Racket 使探索這些想法變得容易。 但它們不像 Haskell 那樣是“純函數式”,所以如果你真的想做命令式的、可變的、面向對象的事情,你也可以這樣做。 然而,學習 Racket 以與 Javascript 相同的方式做事並沒有多大意義。

Scheme 非常具有“真實”變量。

函數式語言(如 Racket)和命令式語言(如 JavaScript 或 PHP)之間的區別在於,在函數式語言中,您通常不使用可變的 state。變量最好被視為值的名稱,而不是容器保持價值觀。 不是使用循環構造之類的東西來更改變量中的值,而是使用遞歸來進行流控制。

define-struct是一種特殊的句法形式,有點像其他語言中的關鍵字。 (與其他語言不同,在 Scheme 中您可以創建自己的語法 forms。)它定義了一個結構類型,類似於 class 但沒有方法。 它還定義了一些函數來幫助您使用新的結構類型。

  1. 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 的發明者做出的設計選擇。

  2. define-struct是一種特殊形式 它的語法,如function或 JavaScript 中的return關鍵字。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM