Scheme自定义关联列表实现
Scheme custom assoc list implementation
我正在尝试解决以下练习:
我必须实现一个 make-empty-as 函数,它应该 return 一个调度程序函数 dispatch ,它为以下结构的列表实现一些方法:((1 a) (2 b) (3 a) (4 c))
调度函数应该有 2 个参数。 (只有 cons 和 find 两者都用)。
方法应该是:
- 空?应该 return #t 如果列表是 () 否则 #f
- car 应该是 return 列表的第一个元素。例如(1个)
- cdr 应该 return 没有第一个元素的列表。
- cons 应该向列表中添加一个元素
- 查找应该 return 与键匹配的值列表。
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 找到。
我试图从缺点的实现开始,但不幸的是我被卡住了。我将传递的参数添加到 (),但我不知道如何保存此列表以供下次调用。
我当前的实现:
(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
你能帮帮我吗?
此致
您的规格有点不寻常,但这通过了您的所有测试:
(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 '()))
请注意,我将问题分为 2 个过程;我本可以用一个参数和一个可选参数来完成它,但这样命名会很奇怪。
此外,无需为调度员命名(但您当然可以...自己尝试一下)。
最后一个测试可以简化为((a8 'cdr) 'find 'a)
,不需要伪参数。
如果您熟悉 case
,您可以 trim 第一个步骤
(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))))))
这是你想要的吗?
我正在尝试解决以下练习:
我必须实现一个 make-empty-as 函数,它应该 return 一个调度程序函数 dispatch ,它为以下结构的列表实现一些方法:((1 a) (2 b) (3 a) (4 c))
调度函数应该有 2 个参数。 (只有 cons 和 find 两者都用)。
方法应该是:
- 空?应该 return #t 如果列表是 () 否则 #f
- car 应该是 return 列表的第一个元素。例如(1个)
- cdr 应该 return 没有第一个元素的列表。
- cons 应该向列表中添加一个元素
- 查找应该 return 与键匹配的值列表。
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 找到。
我试图从缺点的实现开始,但不幸的是我被卡住了。我将传递的参数添加到 (),但我不知道如何保存此列表以供下次调用。
我当前的实现:
(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
你能帮帮我吗?
此致
您的规格有点不寻常,但这通过了您的所有测试:
(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 '()))
请注意,我将问题分为 2 个过程;我本可以用一个参数和一个可选参数来完成它,但这样命名会很奇怪。
此外,无需为调度员命名(但您当然可以...自己尝试一下)。
最后一个测试可以简化为((a8 'cdr) 'find 'a)
,不需要伪参数。
如果您熟悉 case
,您可以 trim 第一个步骤
(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))))))
这是你想要的吗?