2014-09-19 2 views
3

Недавно я был в #lisp на freenode, и кто-то упомянул о существовании '1-' and 1+. Зная об этих функциях, мне стало интересно, почему они существуют. Были ли они созданы из-за таких причин, как связанные -- и ++ из C/C++, или была ли какая-то другая причина? Кто-нибудь знает историю того, как эти функции стали стандартными?История 1- и 1+

(Если этот вопрос является более подходящим для другого сайта (например, Программисты), пожалуйста, перенести его там. Спасибо.)

+4

1+ и 1- это просто удобные функции. Они были навсегда в Лиспе. В ранние времена их называли ADD1 и SUB1. –

+1

Это всего лишь предположение, но, возможно, это было связано с производительностью, поэтому я говорю, что это мой опыт рассмотрения реализаций «+» и «1+ в emacs lisp», + и других математических операторов, реализованных в более медленный общий способ, который включает в себя еще несколько проверок и вызовов функций, тогда как «1+» и «1-» реализованы по-разному, и они на самом деле довольно быстро. в emacs lisp (+ 1 1) делает совсем другие вещи, чем (1+ 1). Фактически в моих тестах (1+ 1) работало на 40% быстрее, чем (+ 1 1). Я не знаю, как это делают популярные реализации CL, но, возможно, это похоже. –

ответ

6

Я не думаю, что есть причины эффективности для них в Common Lisp (хотя в C, для пример, n++ может работать быстрее, чем n = n + 1). Существует примечание в нижней части вашей ссылки:

(1+ number) == (+ number 1) 
(1- number) == (- number 1) 

Таким образом, в целом можно использовать + или 1+ с тем же результатом. Я считаю, что реальной причиной существования этих функций является удобство. Лично я обнаружил, что добавляю 1 чаще, чем любой другой номер.

Уроки приращения и декремента можно найти практически на каждом языке программирования (насколько я могу судить), поэтому довольно логично, что в Common Lisp есть некоторые из них.

P.S. Я сомневаюсь, что это действительно по теме, и мой ответ полезен, поэтому это сообщество wiki ;-)

+0

Может быть, нет хорошего ответа на этот вопрос, и в этом случае я могу его удалить. И нет, не все языки программирования имеют операторы increment/decment. В нижней части http://en.wikipedia.org/wiki/Increment_and_decrement_operators есть список. Например, Pyth0n этого не делает. –

+0

Также обратите внимание, что язык C может увеличивать переменную в памяти (или регистрироваться), и он может делать это очень быстро, но Common Lisp просто возвращает новое значение, по определению не так быстро, как изменение «на месте». – Mark

+0

Справа. Кроме того, clojure также не имеет их. –

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