Избыточность в Лиспе - PullRequest
       13

Избыточность в Лиспе

4 голосов
/ 09 ноября 2011

Я начал изучать Лисп и задавался вопросом, полезны ли все избыточности выполнения определенной задачи несколькими различными способами? Уверен, что опытные программисты на Лиспе могут ответить на этот вопрос.

Чтобы просто привести пример. Мы можем создавать функции следующими двумя способами.

(defun add2 (x) (+ x 2))

или

(setf (symbol-function 'add2)
  #'(lambda (x) (+ x 2))

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

Ответы [ 3 ]

15 голосов
/ 09 ноября 2011

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

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

Если бы не было defun, мы все равно могли бы определять функции с вашей второй формой, но никто не программировал бы на Лиспе, потому что простая задача была бы чрезвычайно трудной. Каждый программист будет разрабатывать свой собственный макрос defun, несовместимый со всеми остальными.

2 голосов
/ 10 ноября 2011

Если вы посмотрите на DEFUN в существующих реализациях, он делает гораздо больше, чем просто определяет функцию.Он, например, записывает местоположение определения для IDE (среды разработки), устанавливает документацию, записывает информацию о типе, ...

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

Иногда в CLOS даже имеется функционально-ориентированная реализация под функциональным интерфейсом.

Изображение выглядит следующим образом

macros <- used by the programmer, convenient to use
   ^
   |
functions <- user interface to the implementation
   ^
   |
CLOS (classes, instances, generic functions) <- low-level extensible machine
1 голос
/ 15 ноября 2011

То, что вы описываете, в основном является побочным эффектом того факта, что большая часть Lisp написана сама по себе. Таким образом, как высокоуровневые определения должны использоваться обычно, так и низкоуровневые вещи, стоящие за ним, доступны программисту.

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

...