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树,但看起来我可以在这个任务中使用哈希集。