2017-01-05 7 views
0

私は 'dict'関数を使わずに辞書を作りたいというスキームプロジェクトを持っています。 IO例:辞書を作成する - 関数名に括弧を追加する

(define d (make-dictionary)) ;; creates an empty dictionary 
(define d1 (d (cons "a" 1))) ;;d1 is d+("a" 1), d not changing 
(d1 "a") ;; = 1 
(define d2 (d1 (cons "b" 15))) ;;d2 is d1+("b" 15), d1 not changing 
(d2 "b") ;; = 15 
(d2 "a") ;; = 1 

私は単に私が引数として括弧で作る辞書を得ることができる方法を理解していないが、それは常に手続きではなく、種類の答えを返します。

(define (make-dictionary) 
'()) 

(define (((make-dictionary) pairs)) ;;trying to get it with parenthesis 
    append make-dictionary (cons pairs '())) 

私は日の過去のカップルの質問の多くを尋ねてきましたが、私はスキームに新しいですし、私はそれを学ぶために自分のベストをやっている知っているが、私は時間が不足しています。.. HELP ?

+0

。あなたはカッコで何をしようとしていますか? –

+0

値を返すには '(d(cons" a "1))'が必要です。それは私が実装する方法を知らないことです – mooly

+1

ああ、あなたのそれらのかっこ...いくつかの部分であまりにも多く、他の部分であまりにも少ない。 'append'プロシージャを呼び出す部分は、同じ古い間違いを持っ​​ています - それはプロシージャを呼び出す方法ではありません。既視感。 –

答えて

1

あなたは関連リストを実装しようとしているようです。悲しいことに、あなたがカッコで行うことは全く意味がありません。もっと賢明なアプローチは、キー/値のペアを追加して検索するための別の手順持っているだろう。今

(define (make-dictionary) 
    '()) 

(define (add-dictionary dict pair) 
    (cons pair dict)) 

(define (get-dictionary dict key) 
    (let ((pair (assoc key dict))) ; use the built-in `assoc` procedure! 
    (if pair (cdr pair) #f))) 

を、我々はこのようにそれを使用したい:

(define d (make-dictionary)) 
(define d1 (add-dictionary d (cons "a" 1))) 
(get-dictionary d1 "a") ;; = 1 
(define d2 (add-dictionary d1 (cons "b" 15))) 
(get-dictionary d2 "a") ;; = 1 
(get-dictionary d2 "b") ;; = 15 
(get-dictionary d2 "c") ;; = #f 
0

私が理解から、あなたを」値がリストである辞書を作るのが難しい。私はそれにアプローチするより簡単な方法は、関連リストを作成してルックアップ関数を使うことだと思います。

だから、Alが

(define my-al (list (list key (list value1a value1b)) 
        (list key (list value2a value 2b)))) 

検索-ALのようになります。キーAL - 私はあなたの質問を理解していない>値

(define (lookup-al k alst) 
    (cond [(empty? alst) false] 
     [(equal? k (first (first alst))) (second (first alst))] 
     [else (lookup-al k (rest alst))]))