Схема оценки простого обхода

Nov 09 2020

В настоящее время я изучаю схему в рамках курса, который я беру. Меня этому научили с широким использованием выражения eval, и большинство предоставленных примеров, которые я тестирую, не работают так, как описано. Чем больше я читаю, тем очевиднее становится, что я не должен использовать eval так свободно. Я видел некоторые методы обхода в javaScript, но я ищу что-то особенное для Scheme.

Эта ссылка предоставляет некоторую информацию о том, когда может потребоваться eval. На самом деле это не помогает мне придумать хороший метод обхода цензуры.

Эта ссылка содержит больше полезной информации, но не дает возможности избежать eval в моей ситуации.

Эта ссылка была ближе всего к ответу на мой вопрос и помогла мне понять, почему eval не обязательно работает так, как ожидалось, но я все еще не понимаю, какой будет хорошая замена выражению eval.

Я ищу стандартный способ сделать это:

(define (add a_list)
    (cond
        ((null? a_list) 0)
        (eval(cons '+ a_list)))
)

(add '(3 4 8 12 30))

без eval, так что он вернет 57 . В настоящее время возвращается (+ 3 4 8 12 30) . Эта ссылка, кажется, предполагает, что, скажем, (+ 3 4) автоматически будет оцениваться как 7, но я получаю только список, напечатанный мне в виде выражения без оценки.

Это будет нормально работать, написанное следующими способами:

(define (add a_list)
    (cond
        ((null? a_list) 0)
        (eval(eval(cons '+ a_list))))
)

(add '(3 4 8 12 30))

возвращает 57, но одно из вычислений, похоже, ничего не дает . А также :

(define (add a_list)
  (eval(cons '+ a_list))
)

(add '(3 4 8 12 30))

возвращает 57, но не проверяет наличие пустого списка.

Любая помощь в его полном удалении (или использовании только в случае крайней необходимости) будет принята с благодарностью.

Заранее спасибо!

Ответы

1 ÓscarLópez Nov 09 2020 at 01:28

Для упомянутых примеров вам не нужно eval, простой applyбудет работать. И ваши подозрения верны, мы должны избегать использования в evalбольшинстве случаев - это считается «злом».

(define (add a_list)
  (apply + a_list))