制作字典 - 将括号添加到函数名称

时间:2017-01-05 13:19:30

标签: list dictionary scheme racket parentheses

我有一个计划项目,我想用它制作一本字典而不使用' 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

我根本不明白如何使用括号作为参数获取make-dictionary,它总是返回一个过程而不是键入答案。

(define (make-dictionary)
'())

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

我知道过去几天我已经提出了很多问题,但我是新手,我正在尽我所能去学习,但我已经没时间了......帮助?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

根据我的理解,您在编写值为列表的字典时遇到困难。我认为更简单的方法是创建关联列表并使用查找函数。

所以Al看起来像

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

lookup-al: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))]))