Предотвращение выхода из функции закрытия - PullRequest
0 голосов
/ 16 апреля 2020

Когда я использую, например, небольшую функцию, такую ​​как (defn ll [] (load-file "D:\\Work.clj")), она всегда будет возвращать значение. В этом случае nil.

Иногда функция ценится только за ее побочный эффект, здесь загружается файл clojure. Таким образом, возвращаемое значение не требуется. В загружаемом файле указывается последняя строка. (println "\n-- K:\\Work.clj loaded --") Это то, что я хочу увидеть, и ноль в репле после этого кажется мне уродливым.

(У меня есть идея из AutoCAD / AutoLisp. Когда вы пишете такую ​​функцию, (defun abcd () . . . some action here . . . (princ)) оно не будет возвращать никакого значения. Кстати: AutoLISP не реализован функционально.)

Избегание вывода не соответствует функциональному мышлению. Я понимаю это, но иногда вам не нужны функции, вы хотите что-то делать. Также см. Использование Clojure в Repl без открывающих и закрывающих скобок

Ответы [ 2 ]

2 голосов
/ 17 апреля 2020

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

Я предполагаю, что autolisp также не может возвращать 'void'.

и действительно, статья в Википедии об autolisp говорит следующее здесь :

Обратите внимание на последнюю строку в определении функции: при оценке без аргументов функция prin c возвращает нулевой символ, который не отображается интерфейсом командной строки AutoCAD.

Итак, ваш вопрос касается, главным образом, спецификации функции print + поведение repl, а не семантики языка.

с точки зрения clojure, все ответы, которые я знаю , распечатать любое возвращенное значение, включая нулевые символы и пустые строки. И это выглядит последовательным.

Строго говоря, есть один способ сделать выражение невозвратимым в зазоре: сделать его бесконечно рекурсивным .. но хорошо ..

неуместное добавление

просто для иллюстрации логики c и симметрии: в общем lisp вы можете написать функцию, возвращающую «ничто»:

CL-USER> (defun f ()
           (values))

CL-USER> (f)
; No values

, но опять же, если вы действительно «используете» результат f , это nil:

CL-USER> (list (f))
;;=> (NIL)

эта форма возврата существует для разработчиков, которые хотят подчеркнуть, что возвращаемое значение функции не имеет значения.

1 голос
/ 17 апреля 2020

Каждое выражение в Clojure (не только функции!) Возвращает значение. Это не может быть изменено. Функции, предназначенные для побочных эффектов, обычно возвращают nil в качестве заполнителя или «фиктивного» возвращаемого значения. Примеры включают как doseq, так и print. Таким образом, что-то вроде (println "hello") имеет побочный эффект отправки символов на устройство вывода (т.е. стандартный вывод), а затем возвращает фиктивное значение nil.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...