【问题标题】:Scheme custom assoc list implementationScheme自定义关联列表实现
【发布时间】:2015-11-10 18:02:24
【问题描述】:

我正在尝试解决以下练习:

我必须实现一个函数 make-empty-as 它应该返回一个调度函数 dispatch 实现以下结构列表的一些方法: ((1 a) (2 b) (3 a) (4 c) )

dispatch 函数应该有 2 个参数。 (只有 cons 和 find 两者都用)。

方法应该是:

  • 空?如果列表为 () 则应返回 #t 否则 #f
  • car 应该返回列表的第一个元素。例如(1)
  • cdr 应该返回没有第一个元素的列表。
  • cons 应该在列表中添加一个元素
  • find 应该返回与键匹配的值列表。

make-empty-as 应该从一个空列表的调度函数开始。

一个示例调用序列可能是:

(define a1 (make-empty-as))
(define a2 (a1 'cons '(b 2)))
(define a3 (a2 'cons '(d 4)))
(define a4 (a3 'cons '(c 5)))
(define a5 (a4 'cons '(a 6)))
(define a6 (a5 'cons '(c 4)))
(define a7 (a6 'cons '(b 7)))
(define a8 (a7 'cons '(a 1)))
(a8 'find 'b)
=>(7 2)
(a8 'find 'a)
=>(1 6)
(a7 'find 'a)
=>(6)
((a8 'cdr 'dummy) 'find 'a)
=>(6)

如您所见,cons 应该添加一个元素。并且在添加了一些元素之后,这些元素应该可以用 find 找到了。

我试图从 cons 的实现开始,但不幸的是我被卡住了。我将传递的参数添加到 (),但我不知道如何保存此列表以供下次调用。

我目前的实现:

(define (make-empty-as)
    (define (dispatch arg1 arg2)
        (cond ((eq? arg1 'null?))
              ((eq? arg1 'car) '())
              ((eq? arg1 'cdr) '())
              ((eq? arg1 'cons) (cons arg2 ()) dispatch)
              ((eq? arg1 'find))
        )
    )
    dispatch
)

如果您想试用代码,可以在此处进行:https://repl.it/BYpC

你能帮帮我吗?

问候

【问题讨论】:

    标签: list scheme lisp


    【解决方案1】:

    您的规格有点不寻常,但这通过了您的所有测试:

    (define (make-as lst)
      (lambda args ; all arguments will be put in a list
        (let ((arg1 (car args))) ; first argument
          (cond
            ((eq? arg1 'null?) (null? lst))
            ((eq? arg1 'cons)  (make-as (cons (cadr args) lst))) ; create a new as with element prepended
            ((eq? arg1 'car)   (car lst))
            ((eq? arg1 'cdr)   (make-as (cdr lst))) ; create a new as with fir
            ((eq? arg1 'find)  (map cadr (filter (lambda (e) (eq? (car e) (cadr args))) lst)))))))
    
    (define (make-empty-as)
      (make-as '()))
    

    请注意,我将问题分为两个过程;我可以用一个和一个可选参数来完成它,但是命名会很奇怪。

    此外,无需为调度员命名(但您当然可以...自己尝试一下)。

    最后一个测试可以简化为((a8 'cdr) 'find 'a),不需要伪参数。

    如果您熟悉case,您可以将第一个过程缩减为

    (define (make-as lst)
      (lambda args ; all arguments will be put in a list
        (case (car args)
          ((null?) (null? lst))
          ((cons)  (make-as (cons (cadr args) lst))) ; create a new as with element prepended
          ((car)   (car lst))
          ((cdr)   (make-as (cdr lst))) ; create a new as with fir
          ((find)  (map cadr (filter (lambda (e) (eq? (car e) (cadr args))) lst))))))
    

    这是你想要的吗?

    【讨论】:

    • 谢谢。这对我帮助很大。
    • 不客气。如果有不清楚的地方,请随时寻求解释。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-28
    • 1970-01-01
    • 2018-12-31
    • 1970-01-01
    • 1970-01-01
    • 2011-02-03
    • 2016-09-18
    相关资源
    最近更新 更多