2017-01-05 2 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

Из того, что я понимаю, вы» с трудностью создания словаря, где значение представляет собой список. Я думаю, что более простой способ приблизиться к ней - создать список ассоциаций и использовать функцию поиска.

Так алюминиевую будет выглядеть

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

поиска ал: Key AL -> Значение

(define (lookup-al k alst) 
    (cond [(empty? alst) false] 
     [(equal? k (first (first alst))) (second (first alst))] 
     [else (lookup-al k (rest alst))])) 
Смежные вопросы