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