首页 > 解决方案 > 将变量视为 Scheme 中的符号

问题描述

我有以下列表

'(hash a (num 1 2) b (num 3 2) c (num 3 2) d (num 7 2))

在方案中。我想把它当作一种表达,放在eval它前面。但是当我这样做时,它会给我一个错误:“无法在定义之前引用标识符”。我的猜测是它将a, b, 和c视为变量。但我想把它们当作符号。这可能吗?

标签: listvariablesschemeracketsymbols

解决方案


好吧,你当然引用他们:

'(hash 'a (num 1 2) 'b (num 3 2) 'c (num 3 2) 'd (num 7 2))

eval应该避免,特别是对于用户输入,我猜如果你知道数据,有很多方法可以在不使用 eval 的情况下进行哈希:

; makes an alist
(define content `(a ,(num 1 2)
                  b ,(num 3 2)
                  c ,(num 3 2)
                  d ,(num 7 2)))

;; makes a hash
(define my-hash (apply hash content))

如果这真的是用户输入,我会配对它:

(define user-input '((a 1 2) (b 3 2) (d 7 2)))
(define content 
  ;; or use flatmap
  (apply append 
        (map (lambda (v) (list (car v) (num (cadr v) (caddr v)))) 
             user-input))) 

;; makes a hash
(define my-hash (apply hash content))

推荐阅读