使用哈希评估赋值函数

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)))

但我仍然卡在里面有一个额外的哈希...

我对 evaluateeval-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)))))