2015-10-04 4 views
2

Это действует схемаПочему «1 2 3» действительное выражение схемы?

1 2 3 

и возвращает 3. Но это не является действительным

(1 2 3) 

и ни это действует

(1) (2) (3) 

Это имеет смысл, что последние два не являются действительный. Но я не вижу, как первый должен быть действительным? Может кто-нибудь объяснить?

+0

Какая схема? Какой стандарт (R5RS, R6RS, R7RS, ...)? Какая реализация и операционная система? –

+0

Ответ на то же самое в RnRS для n = 0 до n = 7. – soegaard

ответ

1

Первый из них действителен, поскольку считается простым выражением. Схема ничего не делает с этим и просто перекликается с вами. Это верно не только для чисел, но и для всех констант, включая строки, символы и даже списки (если вы цитируете их для создания фактического списка, а не для вызова функции). Напр. если вы наберете '(1 2 3), он будет просто отозван обратно вам без интерпретации.

Схема пути, и как правило, другие лепечет, оценивают выражение может быть описаны два широкими правилами (и это, вероятно, наивная интерпретация):

  1. Если введенное выражением является постоянной (строка, число , символ, список или что-то еще), сама константа является значением. Просто повторите это.
  2. Если выражение имеет вид (procedure arg1 ... arg-n), найдите значение procedure, оцените или найдите значения всех аргументов (arg1 - arg-n) и примените procedure к аргументам.

Более подробную информацию можно найти на странице Evaluating Scheme Expressions глава в книге The Scheme Programming Language 4e.

+0

Но ваши два элемента не представляют собой первое взаимодействие, где есть три выражения один за другим. – coredump

+1

Это похоже на причуду/функцию схемы repl (я угадываю здесь). После оценки каждого из трех чисел в виде отдельных выражений он отбрасывает два предыдущих выхода и просто печатает последний. Некоторая быстрая проверка с другими выражениями в repl приводит к аналогичным результатам (за исключением инструкций, которые выводятся на консоль, конечно). Хотя, clojure repl печатает все три. –

+0

Это чувствует себя мелким, но может ли избиратель объяснить причину? –

3

Возможно, REPL вашей реализации читает непустую последовательности выражений и оценку всех их и давая последовательности результатов. (Я считаю, что это поведение REPL является специфичным для реализации. R7RS не упоминает об этом в его §5.7. Он может отличаться от других реализаций Scheme, и я никогда не использовал его, я согласен с coredump's answer в том, что это может быть причудливая и полезная функция)

Схема может возвращать и обрабатывать несколько значений, например с call-with-values & values; Смотри также this

Так технически 1 2 3 является неодного выражение, но последовательность из трех выражений. Вызов (read) не даст вам такой последовательности. А на guile 2 на Linux (+ 2 (read)) 55 66 дает сразу два результата 57 66, а не три (после ожидания для ввода).

также есть данные о call/cc, continuations и CPS.Там могут быть некоторые косвенные отношения (как делает ваш РЕПЛ сделка внутренне с ними, когда (read) Ing выражения ....)

3

РЕПЛ читает множество форм в последовательности (это также, как Common Lisp работать реализации). Учитывая, что пользователь вошел в несколько форм, что еще может произойти?

  • отображается ошибка будет правильным, но бесполезный
  • отбрасывая предыдущую/следующую форму будет запутанным

ИМХИ поведение читать все данные формы как если бы они были в неявном progn является наиболее полезным для пользователя. Он также согласуется с тем, как файлы считываются и позволяют вам, например, вставлять содержимое файла непосредственно в REPL.

1

Главное наблюдение заключается в том, что в Схеме не допускаются дополнительные скобки. В (+ 1 2) оценивается выражение +, и результат является плюсовой функцией. Эта функция применяется к 1 2, и вы получаете результат 3.

В вашем примере (1) означает оценку 1, а результат равен 1. Затем примените 1 к никаким аргументам. А поскольку 1 не является функцией, вы получите сообщение об ошибке.

В примере (1 2 3) ваша система пытается применить 1 к аргументам 2 и 3 и получить сообщение об ошибке.

Вкратце: скобки в арифметике используются для группировки операции - в схеме это означает применение функции.

И наконец: 1 2 3 - это не одно выражение, а три выражения. Последняя из которых оценивается до 3.

Смежные вопросы