LINUX.ORG.RU

История изменений

Исправление monk, (текущая версия) :

Ну что это такое? Там всего на три строчки функция, и уже… Или мне приводить пример посложнее?

«Богатая семантика» для тех, у кого аллергия на круглые скобки.

По статистике, порядка 10-30% функций в средней по больнице программе полиморфичны

Это в диалектах CLOS, потому что переделать простую функцию в обобщённую там сложно. В Haskell и Си++ любая полиморфичная функция имеет как минимум две реализации.

Попытался найти в SBCL реализацию макроса «loop» — а ево нету.

https://github.com/sbcl/sbcl/blob/master/src/code/loop.lisp

Правда, это же нерасширяемо и приколочено гвоздями, ведь на макросах такого повторить нельзя — это разве настоящий лисп?

Вот расширяемая версия: https://common-lisp.net/project/iterate/

я сейчас поднял доки по схеме, кложе — а там нет таких циклов

На Racket есть стандартные

(for/list ([i (in-inclusive-range 1 11)]
           [j (in-naturals 100)])
  (list i j))

и есть https://planet.racket-lang.org/display.ss?package=loop.plt&owner=jphelps

Разве функции не являются такими же аргументами?

Нет в макросе можно написать

(lsp-with-current-buffer buffer
  (spinner-start spinner-type))

и сначала будет выбран текущий буфер, а потом в нём будет запущен (spinner-start spinner-type). А если бы это была функция, то сначала бы запустилась (spinner-start spinner-type), а потом её результат попал бы к функции lsp-with-current-buffer.

Как в том же хаскеле.

В хаскеле функции частично заменяют макросы за счёт ленивости. Ещё можно как в Scheme или JS действия в лямбды заворачивать:

(lsp-with-current-buffer buffer
  (lambda () (spinner-start spinner-type)))

В elisp могут быть проблемы, если spinner-type локальная переменная. В Common Lisp проблем нет, но видимо были когда-то давно, поэтому передавать замыкания в параметрах не принято.

Питон спокойно справляется без макросов в таких же сценариях. И даже JS справляется.

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

Исходная версия monk, :

Ну что это такое? Там всего на три строчки функция, и уже… Или мне приводить пример посложнее?

«Богатая семантика» для тех, у кого аллергия на круглые скобки.

По статистике, порядка 10-30% функций в средней по больнице программе полиморфичны

Это в диалектах CLOS, потому что переделать простую функцию в обобщённую там сложно. В Haskell и Си++ любая полиморфичная функция имеет как минимум две реализации.

Попытался найти в SBCL реализацию макроса «loop» — а ево нету.

https://github.com/sbcl/sbcl/blob/master/src/code/loop.lisp

Правда, это же нерасширяемо и приколочено гвоздями, ведь на макросах такого повторить нельзя — это разве настоящий лисп?

Вот расширяемая версия: https://common-lisp.net/project/iterate/

я сейчас поднял доки по схеме, кложе — а там нет таких циклов

На Racket есть стандартные

(for/list ([i (in-inclusive-range 1 11)]
           [j (in-naturals 100)])
  (list i j))

и есть https://planet.racket-lang.org/display.ss?package=loop.plt&owner=jphelps

Разве функции не являются такими же аргументами?

Нет в макросе можно написать

(lsp-with-current-buffer buffer
  (spinner-start spinner-type))

и сначала будет выбран текущий буфер, а потом в нём будет запущен (spinner-start spinner-type). А если бы это была функция, то сначала бы запустилась (spinner-start spinner-type), а потом её результат попал бы к функции lsp-with-current-buffer.

Как в том же хаскеле.

В хаскеле функции частично заменяют макросы за счёт ленивости. Ещё можно как в Scheme или JS действия в лямбды заворачивать:

(lsp-with-current-buffer buffer
  (lambda () (spinner-start spinner-type)))

В elisp могут быть проблемы, если spinner-type локальная переменная. В Common Lisp проблем нет, но видимо были когда-то давно, поэтому передавать замыкания в параметрах не принято.

Питон спокойно справляется без макросов в таких же сценариях. И даже JS справляется.

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