2017-02-22 15 views
7

Я изучаю источник clojure.core.Почему if-not вызывает «не», а не просто инвертирует аргументы?

(defmacro if-not 
    ([test then] `(if-not ~test ~then nil)) 
    ([test then else] 
    `(if (not ~test) ~then ~else))) 

Что касается второго вида, то почему бы не просто

([test then else] `(if ~test ~else ~then)

+3

В качестве альтернативы, редактирование вопроса таким образом, чтобы недействительные существующие ответы, как правило, недооценивается здесь, задавая новый отдельный вопрос (и, если исходный вопрос вряд ли будет полезен кому-либо еще, возможно, вежливо спрашивая человека, владеющего ответом, чтобы удалить его, если этот ответ поддерживается и, таким образом, предотвращает удаление вопроса) в качестве общей правой вещи. –

+0

@CharlesDuffy О, извините. Новое для сообщества, незнакомое с конвенциями. Могу ли я спросить, как мне следует действовать должным образом? – damonh

+0

(см., Например, http://meta.stackoverflow.com/questions/254521/editing-question-for-new-answer для обсуждения метаконференций для редактирования вопросов, влияющих на существующие ответы - это говорит о том, что это не любые средства - вопиющий случай, то, что правила действительно устраняют, - это «вопросы хамелеона», как описано в http://meta.stackexchange.com/questions/43478/exit-strategies-for-chameleon-questions) –

ответ

2

Это выглядит просто стиль кодирования.

(if-not test then else) 

(if (not test) then else) 

(if test else then) 

Приведенный выше код будет работать одинаково. Существует несколько способов писать код, чтобы сделать то же самое.

Возможно, автор макроса if-not мог бы написать код таким образом.

(defmacro if-not 
    ... 
    ([test then else] 
    `(if (not ~test) ~then ~else))) 

Когда мы читаем этот код (выше), мы можем думать в порядке if, then, else, довольно простой.

(defmacro if-not 
    ...  
    ([test then else] 
    `(if ~test ~else ~then) 

Да, это будет работать нормально. Однако, с точки зрения удобочитаемости, порядок then и else меняются местами, и это может вызвать смущение.

Именно поэтому (по моему мнению) автор реализовал if-not таким образом.

+0

Думаю, я должен был поставить вопрос в вопрос, когда я его разместил. Я пытаюсь реализовать все функции в clojure.ядро как способ узнать Clojure. Когда я сравнил свою версию. с Clojure ver., я был немного удивлен (я думал, что производительность идет сначала на этом уровне кодирования). Я думаю, вер. ниже очень очевидно (первое, что появилось в моей голове, когда я думал о 'if-not'), автор, должно быть, подумал об этом и решил не использовать его. Я пытаюсь понять, чего не хватает. – damonh