【问题标题】:Evaluate assign function using hash使用哈希评估分配函数
【发布时间】:2015-09-20 01:12:26
【问题描述】:

这是我的翻译任务的一部分。

当调用以下内容时:

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

但我仍然被一个额外的哈希卡住了......

【问题讨论】:

    标签: scheme racket


    【解决方案1】:

    使用hash-set通过将key 映射到v,在功能上扩展hash,覆盖key 的任何现有映射,并返回扩展的哈希表。

    (define (eval-assign var exp env)
      (let ((val (evaluate exp env)))
        (cons (car val) (hash-set env var (car val)))))
    

    【讨论】:

    • 不幸的是,这就是问题所在。我希望我能做到。但是出于课堂的目的,我们的教授告诉我们应该考虑哈希表是不可变的。所以我们不允许使用set。
    • 但是hash-set 函数不会发生变异。它适用于不可变哈希表。
    • 嗯,我刚刚看了我的笔记,里面确实有一个 hash-set 的例子。另外,它没有感叹号。我得到了与您相同的解决方案,只是更丑陋,因为我没有使用 let。我会问我的教授我们是否可以使用哈希集。如果是,我会认为这个问题已经解决。现在,请投赞成票。感谢您的帮助!
    • Racket 中有两种类型的哈希表。如果您使用哈希集,那么您正在使用不可变哈希表。据我所知,不可变哈希表目前是使用展开树实现的。
    • 我以前从未听说过展开树,但在这个作业中使用哈希集似乎对我来说没问题。
    【解决方案2】:

    我对@9​​87654321@ 和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)))
    

    【讨论】:

    • 感谢您的回复!不过,我对您的解决方案有一个小问题。我们不允许使用任何 set 的变体!在课堂中。有没有我可以做的替代品?另外,我不能修改对函数的调用(这就是我的程序将被评估的方式)所以我不能使用你的 make-hash 方法。
    猜你喜欢
    • 2016-10-25
    • 2010-10-26
    • 1970-01-01
    • 2020-08-19
    • 2012-05-09
    • 1970-01-01
    • 1970-01-01
    • 2015-10-14
    • 1970-01-01
    相关资源
    最近更新 更多