2016-11-27 17 views
1

私はintersectを使って可変関数を作成しようとしましたが、私は関数に交差を実装した方法をひどく混乱させていると思いますし、関数を修正する最良の方法についてはわかりません。交差変更オブジェクトを修正する

(define (intersect-mutable) 
    (let ((lst '())) 
    (let ((lst2 '())) 
     (define (insert x) 
     (set! lst (cons x lst))) 
     (define (intersect) 
     (define (helper lst lst2) 
      (define contains member) 
      (cond ((null? set) '()) 
       ((contains (car lst) lst2) 
       (cons (car lst) (intersect (cdr lst) lst))) 
       (else 
       (intersect (cdr lst) lst2)))) 
     (helper lst lst2)) 
     (lambda (function) 
     (cond ((eq? function 'intersect) intersect) 
       ((eq? function 'insert) insert) 
       (else 
       'undefined)))))) 

再帰関数のためのテストケースは次のようになります。挿入のための

>(intersection '(2 4 7 10) '(2 9 0 10)) 
(2 10) 
>(intersection '(1 4 10) '(83 1 48 2 4)) 
(1 4) 

テストケース:

(define mut (intersect-mutable)) 
((mut 'insert) 'intersect) 
((mut 'insert) 'mutable) 

明確にするために、私は1つに2つの別々のリストに交差するようにしようとしていますリスト。私は挿入機能を追加しました。

+2

入力と出力の例を示してください。また、「変更可能な機能」が何を意味するのかは不明です。 –

+0

変更可能なデータ構造は、破壊的な関数とも呼ばれます。この関数は、変数を現在の状態に変更します。したがって、vが最初は0であった場合、3を加えると、vの値は3になります。次にvに3を加え、vの値は6になります。基本的に、vの新しい値はメモリに保存されます。ユーザーが後でアクセスすることができます。うまくいけば、これは理にかなっている。私は概念を説明するのに苦労します。 – Vicky

+0

データ構造は関数なのですか? –

答えて

0

不変コンスセルのリストを可変コンス(mconsセル)のリストに変換するために、list->mlistを使用してください。変異は二つのリストをhousekeepするだけですdocs

0

場合:

は、ここでさらに見る

(define (intersect-mutable (lst1 '()) (lst2 '())) 
    (define (method-insert lst1? value) 
    (if lst1? 
     (set! lst1 (cons value lst1)) 
     (set! lst2 (cons value lst2))) 
    message-handler) 

    (define (method-intersect) 
    ;; intersect is a working intersect without mutation 
    (intersect lst1 lst2)) 

    (define (message-handler msg) 
    (case msg 
     ((insert) method-insert) 
     ((insert1) (lambda (v) (method-insert #t v))) 
     ((insert2) (lambda (v) (method-insert #f v))) 
     ((lst1) lst1) 
     ((lst2) lst2) 
     ((intersect) method-intersect) 
     (else (error "No such method" msg)))) 

    message-handler) 

(define obj (intersect-mutable '(10) '(30))) 
((obj 'insert) #t 5) 
((obj 'insert2) 10) 
(obj 'lst1) ; ==> (5 10) 
(obj 'lst2) ; ==> (10 30) 
((obj 'intersect)) ; ==> (10) 

しかし、実際には何も変化させません交差予告。

(define (list-object (lst '())) 
    (define (method-insert . values) 
    (set! lst (foldl cons lst values)) 
    message-handler) 

    (define (method-intersect lst2) 
    ;; intersect is a working intersect without mutation 
    (set! lst (intersect lst lst2)) 
    message-handler) 

    (define (method-member? value) 
    (member value lst)) 

    (define (message-handler msg) 
    (case msg 
     ((insert) method-insert) 
     ((intersect) method-intersect) 
     ((member?) method-member?) 
     ((lst) lst)    
     (else (error "No such method" msg)))) 

    message-handler) 

(define obj (((list-object '(5)) 'insert) 10 20 30)) 
(obj 'lst) ; ==> (30 20 10 5) 
((obj 'intersect) '(10 30 60)) 
(obj 'lst) ; ==> (20 30) 

、あなたは(小さな)CLOSタイプの一般的なメソッドを作ることができ、あなたはこのように多くのオブジェクトを作る想像:私は、おそらくこれで全体のポイントは、私たちはこのようなもののリスト上で動作させることができます想像OOだと思います。

;; generic. Works on any object that has 
;; member? method and lists 
(define (member? value obj) 
    (if (procedure? obj) 
     ((obj 'member?) value) 
     (member value obj))) 


;; Another object type that has member? 
;; only that it means the values binary bits 
;; are set on the object 
(define (number-object value) 
    (define (method-member? value2) 
    (= value2 (bitwise-and value value2))) 

    (define (message-handler msg) 
    (case msg 
     ((member?) method-member?))) 

    message-handler) 

;; test objects 
(define num1 (number-object 24)) 
(define lst1 (list-object '(1 8))) 

;; some test 
(member? 2 num1); ==> #f 
(member? 8 num1); ==> #t 
(member? 8 lst1); ==> (8) (true) 
(member? 9 lst1); ==> #f 
(member? 9 '(1 3 5 9 10)) ; ==> (9 10) 

;; map is the ultimate test 
(map (lambda (o) (member? 8 o)) (list num1 lst1)) 
; ==> (#t (8))