Это потому, что Clojure ограничен JVM, поэтому этот код не может быть оценен?

clojure

106 просмотра

1 ответ

Код, включающий что-то вроде '(1+2)Clojure, будет вызывать a java.lang.RuntimeException, что оставляет сообщение об ошибке «Unmatched delimiter:)».

Но на любом другом диалекте lisp, который я когда-либо использовал, например, Emacs Lisp или Racket, '(1+2)он просто возвращает список, который должен действовать следующим образом, потому что в кавычках специальной формы все в списке не должно оцениваться.

Поэтому мне просто интересно, что из-за ограничений JVM эти коды не могут вести себя так, как они действуют на других диалектах? Или это ошибка Clojure? Или может быть есть что-то другое между определением цитаты в Clojure и другими диалектами Лиспа?

Автор: Eleven Источник Размещён: 08.11.2019 10:55

Ответы (1)


1 плюс

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

Попробуйте ввести '(1 + 2)вместо этого ( +обратите внимание на пространство вокруг ), вы увидите именно то, что вы ожидаете.

Автор: Yuri Steinschreiber Размещён: 20.08.2016 06:09
Вопросы из категории :
32x32