使用哈希评估赋值函数
Evaluate assign function using hash
这是我的翻译作业的一部分。
调用以下内容时:
(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)))
但我仍然卡在里面有一个额外的哈希...
我对 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)))
它应该按预期工作。确保在测试它时将可变散列作为空环境传递,因此使用 make-hash
.
创建
> (evaluate (sp-assign "y" (sp-val 18)) (make-hash (list (cons "x" 42))))
'(18 . #hash(("x" . 42) ("y" . 18)))
使用 hash-set
:通过将 key
映射到 v
在功能上扩展 hash
,覆盖 key
的任何现有映射,以及返回扩展哈希 table.
(define (eval-assign var exp env)
(let ((val (evaluate exp env)))
(cons (car val) (hash-set env var (car val)))))
这是我的翻译作业的一部分。
调用以下内容时:
(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)))
但我仍然卡在里面有一个额外的哈希...
我对 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)))
它应该按预期工作。确保在测试它时将可变散列作为空环境传递,因此使用 make-hash
.
> (evaluate (sp-assign "y" (sp-val 18)) (make-hash (list (cons "x" 42))))
'(18 . #hash(("x" . 42) ("y" . 18)))
使用 hash-set
:通过将 key
映射到 v
在功能上扩展 hash
,覆盖 key
的任何现有映射,以及返回扩展哈希 table.
(define (eval-assign var exp env)
(let ((val (evaluate exp env)))
(cons (car val) (hash-set env var (car val)))))