Scheme 使用散列计算赋值函数
这是我翻译任务的一部分 调用以下命令时:Scheme 使用散列计算赋值函数,scheme,racket,Scheme,Racket,这是我翻译任务的一部分 调用以下命令时: (evaluate (sp-assign "y" (sp-val 18)) (hash "x" 42)) 我试图得到这个结果: '(18 . #hash(("y" . 18) ("x" . 42))) 这是我的相关代码: (define empty-env (hash)) (struct sp-var (varname)) (struct sp-assign (var exp)) (define (evaluate prog env)
(evaluate (sp-assign "y" (sp-val 18)) (hash "x" 42))
我试图得到这个结果:
'(18 . #hash(("y" . 18) ("x" . 42)))
这是我的相关代码:
(define empty-env (hash))
(struct sp-var (varname))
(struct sp-assign (var exp))
(define (evaluate prog env)
(match prog
[(struct sp-val (v)) (cons v env)]
[(struct sp-assign (var exp)) (eval-assign var exp env)]
[(struct sp-var (varname)) (cons (hash-ref env varname) env)]
[_ (error "Unrecognized expression")]))
(define (eval-assign var exp env)
evaluate (sp-var var) (hash var (evaluate exp env))) ;'((18 . #hash(("x" . 42))) . #hash(("y" . (18 . #hash(("x" . 42))))))
;var (hash var (evaluate exp env)) ;var (hash var (evaluate exp env))
)
我得到的结果分别位于我在函数中的两次尝试之后(我做了更多的尝试,但这是我得到的最接近实际结果的尝试)。谁能帮我一下,让我知道我的逻辑哪里出了问题
编辑:通过以下eval assign的实现,我能够更接近我的目标:
(list (car(evaluate exp env))(hash var (car(evaluate exp env))) env)
产生:
'(18 #hash(("y" . 18)) #hash(("x" . 42)))
但是我仍然被一个额外的散列卡住了…我对
评估和评估分配做了一些更改
(define empty-env (make-hash '()))
(struct sp-var (varname))
(struct sp-assign (var exp))
(struct sp-val (v))
(define (evaluate prog env)
(match prog
[(struct sp-val (v)) (cons v env)] ; Self evaluating
[(struct sp-assign (var exp)) (eval-assign var exp env)]
[(struct sp-var (varname)) (cons (hash-ref env varname) env)]
[_ (error "Unrecognized expression")]))
(define (eval-assign var exp env)
(let ((val (evaluate exp env)))
(hash-set! env var (car val))
(cons (car val) env)))
它应该像预期的那样工作。当您测试它时,请确保将可变哈希作为空环境传递,从而使用makehash
创建
> (evaluate (sp-assign "y" (sp-val 18)) (make-hash (list (cons "x" 42))))
'(18 . #hash(("x" . 42) ("y" . 18)))
我对evaluate
和eval assign
做了一些更改
(define empty-env (make-hash '()))
(struct sp-var (varname))
(struct sp-assign (var exp))
(struct sp-val (v))
(define (evaluate prog env)
(match prog
[(struct sp-val (v)) (cons v env)] ; Self evaluating
[(struct sp-assign (var exp)) (eval-assign var exp env)]
[(struct sp-var (varname)) (cons (hash-ref env varname) env)]
[_ (error "Unrecognized expression")]))
(define (eval-assign var exp env)
(let ((val (evaluate exp env)))
(hash-set! env var (car val))
(cons (car val) env)))
它应该像预期的那样工作。当您测试它时,请确保将可变哈希作为空环境传递,从而使用makehash
创建
> (evaluate (sp-assign "y" (sp-val 18)) (make-hash (list (cons "x" 42))))
'(18 . #hash(("x" . 42) ("y" . 18)))
用法:通过将键
映射到v
,覆盖键
的任何现有映射,并返回扩展哈希表,从功能上扩展哈希
用法:通过将键
映射到v
,覆盖键
的任何现有映射,并返回扩展哈希表,从功能上扩展哈希
谢谢你的回复!不过,我对你的解决方案有点小问题。我们不允许使用集合的任何变体!在课程中。有我能做的替代品吗?另外,我不能修改对函数的调用(这就是我的程序的计算方式),因此我不能使用make hash方法。感谢您的回复!不过,我对你的解决方案有点小问题。我们不允许使用集合的任何变体!在课程中。有我能做的替代品吗?另外,我不能修改对函数的调用(这就是我的程序的计算方式),所以我不能使用make hash方法。不幸的是,这就是问题所在。我希望我能做到。但是为了这个类的目的,我们的教授告诉我们,我们应该考虑哈希表不变。所以我们不允许使用set。但是散列集
函数不会变异。它适用于不可变的哈希表。嗯,我刚才看了我的笔记,我确实有一个哈希集的例子。另外,它没有感叹号。我得到了与你相同的解决方案,只是因为我没有使用let而更加丑陋。我会问我的教授我们是否可以使用散列集。如果是的话,我会考虑解决这个问题。现在,请投票表决。谢谢你的帮助!Racket中有两种类型的哈希表。如果使用哈希集,则使用的是不可变哈希表。据我所知,不可变哈希表目前是使用splay树实现的。我以前从未听说过splay树,但在这个任务中使用哈希集似乎是可以的。不幸的是,这就是问题所在。我希望我能做到。但是为了这个类的目的,我们的教授告诉我们,我们应该考虑哈希表不变。所以我们不允许使用set。但是散列集
函数不会变异。它适用于不可变的哈希表。嗯,我刚才看了我的笔记,我确实有一个哈希集的例子。另外,它没有感叹号。我得到了与你相同的解决方案,只是因为我没有使用let而更加丑陋。我会问我的教授我们是否可以使用散列集。如果是的话,我会考虑解决这个问题。现在,请投票表决。谢谢你的帮助!Racket中有两种类型的哈希表。如果使用哈希集,则使用的是不可变哈希表。据我所知,不可变哈希表目前是使用splay树实现的。我以前从未听说过splay树,但看起来我可以在这个任务中使用哈希集。