<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                [TOC=2] ## 14.1?簡介 本章中,我將講解向量和結構體。向量是一組通過整數索引的數據。與C語言中的數組不同,一個向量可以儲存不同類型的數據。與表相比,向量更加緊湊且存取時間更短。但從另外一方面來說,向量是通過副作用來操作的,這樣會造成負擔。Scheme中的結構體與C語言中的結構體類似。但Scheme中的結構體比C語言中的更容易使用,這是因為Scheme為結構體自動創建了讀取函數和寫入函數,這受益于Lisp/Scheme程序設計語言中的宏。 ## 14.2?向量 ### 14.2.1?字面值 向量通過閉合的`#(`和`)`表示,例如`#(1 2 3)`。作為字面值時,它們應該被引用,例如: ~~~ '#(1 2 3) ; 整數向量 '#(a 0 #\a) ; 由符號、整數和字符構成的向量 ~~~ ### 14.2.2?向量函數 下面的函數都是R5RS規定的函數: (vector? obj) 如果obj是一個向量則返回#t。 (make-vector k) (make-vector k fill) 放回一個有k個元素的向量。如果指定了第二個參數fill,那么所有的元素都會被初始化為fill。 (vector obj …) 返回由參數列表構成的向量。 (vector-length vector) 返回向量vector的長度。 (vector-ref vector k) 返回向量vector的索引為k的元素。(譯注:和C語言類似,向量從0開始索引。) (vector-set! vector k obj) 將向量vector的索引為k的元素修改為obj。 (vector->list vector) 將vector轉換為表。 (list->vector list) 將list轉換為向量。 (vector-fill! vector fill) 將向量vector的所有元素設置為fill。 例:一個對向量中元素求和的函數。 ~~~ (define (vector-add v1 v2) (let ((lenv1 (vector-length v1)) (lenv2 (vector-length v2))) (if (= lenv1 lenv2) (let ((v (make-vector lenv1))) (let loop ((i 0)) (if (= i lenv1) v (begin (vector-set! v i (+ (vector-ref v1 i) (vector-ref v2 i))) (loop (1+ i)))))) (error "different dimensions.")))) ~~~ > 練習1 > > 編寫一個用于計算兩向量內積的函數。 ## 14.3?結構體 ### 14.3.1?大體功能 雖然R5RS中沒有定義結構體,但是在很多Scheme實現中,都實現了類似于Common Lisp中的結構體。這些結構體本質上來說都是向量。每一個槽都通過使用一個宏來命名,我將會在下一章(十五章)中講解這個問題。結構體通過不同的屬性清楚地表示數據。定義結構體的宏自動為結構體創建**讀取(accessor)函數**和**設置(setter)函數**。你可以通過“程序”來寫程序,這被認為是Lisp/Scheme最好之處之一。 ### 14.3.2?MIT-Scheme中的結構體 在MIT-Scheme中,結構體通過函數`define-structure`來定義。為了使你更加容易理解,我會用一個實例來講解。請考慮書籍。書籍都有下列屬性: * 標題 * 作者 * 出版商 * 出版年份 * ISBN號 因此結構體book就可以像下面這樣定義: ~~~ (define-structure book title authors publisher year isbn) ~~~ 下面演示了如何注冊《大教堂與市集(The Cathedral and Bazaar)》。 ~~~ (define bazaar (make-book "The Cathedral and the Bazaar" "Eric S. Raymond" "O'Reilly" 1999 0596001088)) ~~~ 然而,這樣做多多少少有點不便,因為屬性與值的關聯并不清楚。參量`keyword-constructor`可以用于解決這個問題。下面的代碼就是使用這個參量的重寫版,這個版本中,屬性與值的關聯就非常清楚了。更進一步來說,制定這個參量后,參數的順序就不重要了。 參量`copier`可用于為結構體創建一個拷貝(copier)函數。 ~~~ (define-structure (book keyword-constructor copier) title authors publisher year isbn) (define bazaar (make-book 'title "The Cathedral and the Bazaar" 'authors "Eric S. Raymond" 'publisher "O'Reilly" 'year 1999 'isbn 0596001088)) ~~~ * 一個名字形如`[結構體名稱]?`的函數用于檢查某對象是否為特定結構體。例如,可使用函數`book?`來檢查`bazaar`是否為`book`結構體的一個實例。 ~~~ (book? bazaar) ;Value: #t ~~~ * 一個名字形如`copy-[結構體名稱]`的函數用于拷貝結構體。例如,下面的代碼演示了將`bazaar`拷貝到`cathedral`。 ~~~ (define cathedral (copy-book bazaar)) ~~~ * 一個名字形如`[結構體名稱]-[屬性名稱]`的函數用于讀取結構體某屬性的值。例如,下面的代碼演示了如何讀取`bazaar`的`title`屬性。 ~~~ (book-title bazaar) ;Value 18: "The Cathedral and the Bazaar" ~~~ * 一個名字形如`set-[結構體名稱]-[屬性名稱]!`用于將某屬性設定為特定值。下面的代碼演示了如何將`bazaar`的`year`字段更新到2001(《大教堂與市集》2001年再版)。 ~~~ (set-book-year! bazaar 2001) ;Unspecified return value (book-year bazaar) ;Value: 2001 ~~~ 請參閱[MIT/GNU Scheme Reference: 2.10 Structure Definitions](http://deathking.github.io/yast-cn/www.gnu.org/software/mit-scheme/documentation/scheme_3.html#SEC41)以獲得關于結構體的跟多信息。 ## 14.4?The Mastermind — 一個簡單的密碼破解游戲 作為向量的示例,我會演示一個簡單地密碼破解游戲。這是一個猜對手密碼的游戲。密碼是由0到9中四個不同的數組成的四位數。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看