<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>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                第九章 結構 ============= 自然分組的數據被稱為結構。我們可以使用Scheme提供的復合數據結構如向量和列表來表示一種“結構”。例如:我們正在處理與樹木相關的一組數據。數據(或者叫字段`field`)中的單個元素包括:高度,周長,年齡,樹葉形狀和樹葉顏色共5個字段。這樣的數據可以表示為5元向量。這些字段可以利用`vector-ref`訪問,或使用`vector-set!`修改。盡管如此,我們仍然不希望記憶向量索引編號與字段的對于關系,這將是一個費力不討好而且容易出錯的事情,尤其是隨著時間的流逝,一些字段被加進來,而另一些字段會被刪掉。 因此我們使用Scheme的宏`defstruct`去定義一個`結構`,基本上你可以把它當作一種向量,不過它提供了很多方法諸如創建`結構`實例、訪問或修改它的字段等等。因此,我們的樹結構應這樣定義: ```scheme (defstruct tree height girth age leaf-shape leaf-color) ``` 這樣它自動生成了一個名為`make-tree`的構造過程,以及每個字段的訪問方法,命名為`tree.height`,`tree.girth`等等。構造方法的使用方法如下: ```scheme (define coconut (make-tree 'height 30 'leaf-shape 'frond 'age 5)) ``` 這個構造函數的參數以成對的形式出現,字段名后面緊跟著其初始值。這些字段能以任意順序出現,或者不出現——如果字段的值沒有定義的話。 訪問過程的調用如下所示: ```scheme (tree.height coconut) => 30 (tree.leaf-shape coconut) => frond (tree.girth coconut) => <undefined> ``` `tree.girth`存取程序返回一個未定義的值,因為我們沒有為`coconut`這個`tree`結構指定`girth`的值。 修改過程的調用如下所示: ```scheme (set!tree.height coconut 40) (set!tree.girth coconut 10) ``` 如果我們現在重新調用訪問過程去訪問這些字段,我們會得到新的值: ```scheme (tree.height coconut) => 40 (tree.girth coconut) => 10 ``` ## 9.1 默認初始化 我們可以在定義結構時進行一些初始化的設置,而不是在每個實例中都進行初始化。因此,我們假定`leaf-shape`和`leaf-color`在默認情況下分別為`frond`和`green`。我們可以在調用make-tree時通過顯式的初始化來覆蓋掉這些默認值,或者在創建一個結構實例后使用上面提到的字段修改過程: ```scheme (defstruct tree height girth age (leaf-shape 'frond) (leaf-color 'green)) (define palm (make-tree 'height 60)) (tree.height palm) => 60 (tree.leaf-shape palm) => frond (define plantain (make-tree 'height 7 'leaf-shape 'sheet)) (tree.height plantain) => 7 (tree.leaf-shape plantain) => sheet (tree.leaf-color plantain) => green ``` ## 9.2 defstruct定義 宏`defstruct`的定義如下: ```scheme (define-macro defstruct (lambda (s . ff) (let ((s-s (symbol->string s)) (n (length ff))) (let* ((n+1 (+ n 1)) (vv (make-vector n+1))) (let loop ((i 1) (ff ff)) (if (<= i n) (let ((f (car ff))) (vector-set! vv i (if (pair? f) (cadr f) '(if #f #f))) (loop (+ i 1) (cdr ff))))) (let ((ff (map (lambda (f) (if (pair? f) (car f) f)) ff))) `(begin (define ,(string->symbol (string-append "make-" s-s)) (lambda fvfv (let ((st (make-vector ,n+1)) (ff ',ff)) (vector-set! st 0 ',s) ,@(let loop ((i 1) (r '())) (if (>= i n+1) r (loop (+ i 1) (cons `(vector-set! st ,i ,(vector-ref vv i)) r)))) (let loop ((fvfv fvfv)) (if (not (null? fvfv)) (begin (vector-set! st (+ (list-position (car fvfv) ff) 1) (cadr fvfv)) (loop (cddr fvfv))))) st))) ,@(let loop ((i 1) (procs '())) (if (>= i n+1) procs (loop (+ i 1) (let ((f (symbol->string (list-ref ff (- i 1))))) (cons `(define ,(string->symbol (string-append s-s "." f)) (lambda (x) (vector-ref x ,i))) (cons `(define ,(string->symbol (string-append "set!" s-s "." f)) (lambda (x v) (vector-set! x ,i v))) procs)))))) (define ,(string->symbol (string-append s-s "?")) (lambda (x) (and (vector? x) (eqv? (vector-ref x 0) ',s)))))))))) ```
                  <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>

                              哎呀哎呀视频在线观看