(eval '(* ab)) возвращает конечный результат, а не промежуточный (* 2 3) - PullRequest
1 голос
/ 11 января 2020

В 4.1.3 Структуры данных оценщика SICP гласят:

То, что программы пользователя являются данными оценщика, не должно быть источником путаницы. Фактически, иногда удобно игнорировать это различие и дать пользователю возможность явно оценивать объект данных как выражение Lisp, делая eval доступным для использования в программах. Многие диалекты Lisp предоставляют примитивную eval процедуру, которая принимает в качестве аргументов выражение и среду и оценивает выражение относительно среды.

Затем экспериментируйте с

Chez Scheme Version 9.5
Copyright 1984-2017 Cisco Systems, Inc.

> (define a 5)
> (define b 6)
> (eval '(* a b))
30

Я думаю, что результат не имеет смысла, поскольку он не только применим, но и применим.

Как я понял из дальнейшего содержания, я предсказываю, что результат должен быть

> (eval '(* a b))
  '(* (5 6))

Затем примените * к списку значений (5 6).

Eval производит значение аргументов и процедур, которые будут применяться, а не конечный результат.

Я не прав с пониманием eval?

1 Ответ

3 голосов
/ 12 января 2020

В основном то, что происходит с (eval '(* a b)) под колпаком, это как вы описали. Поскольку * не является специальной формой или макросом, он оценивает его для объекта процедуры, затем он оценивает a и b и затем применяет процедуру, полученную в результате оценки * со списком оцененных аргументов. Это не останавливается на полпути, поэтому вы получите полную оценку.

Также знайте, что * - это переменная. Процедуру, стоящую за этим, вы можете увидеть, оценив * сам по себе. Это не показало бы *.

...