LINUX.ORG.RU

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

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

Именно аналог.

А аналог и нужен. То есть невозможность воспроизвести with* и foreach _в точности_ как в clojure не существенна, так как они воспроизводятся _с точностью до_ незначительных отличий.

В clojure они работают за счёт примитивных конструкций языка и макросов (compile-time/stage функций над кодом как данными и прочими данными). В других языках они будут работать за счёт примитивных конструкций языка и (runtime над обычными данными) функций (конструкторов, etc).

Например, при переписывании кода с такого рода простыми макросами ты не упрёшься в какие-то принципиальные ограничения. А вот если взять какой-нибудь навороченный макрос define-some-configuration на CL который генерирует класс и методы CLOS и потом ещё набор макросов которые будут генерировать другие методы этому классу и всё это будет загружаться по load в образ во время выполнения - вот тут уже наличие и свойства макросистемы окажутся существенны - на CL это просто и естественно, на «более других» языках могут быть варианты.

with-* дает новую абстракцию, а как там внутри уже не должно волновать пользователя конструкции.

С RAII классами точно так же - они дают абстракцию и скрывают детали получения и освобождения ресурсов.

Ты с этим не согласен, насколько я понял и в лиспе не используешь with-open*/with-*?

Почему? Согласен. В лиспе ты пишешь with* и foreach, где-то ещё ты пишешь RAII/try-finally и, хм, for_each/foreach. В чём разница?

Странно, почему тогда в том же лиспе и clojure это реализовали и этим повсеместно пользуются?

Эм, потому что макросы есть - потому и используют :) То есть через макросы.

А вообще, ты в курсе, к чему был пример с foreach?

К тому что это compile-time функция с типом [A, Seq <: Traversable[A]](name: Name[A] /* хотя Scala не умеет в зависимые типы */, Exp[Seq], Exp[Unit] /* и тут нужно как-то указать анафоричность по name */), ну или как-то так. Естественно, «с помощью фвп не сделать», но при этом лаг между макросом foreach и тем что можно написать функцией/методом map/foreach так мал, что их даже неохота различать.

В контексте какого разговора?

Такого - «функции стадии компиляции над кодом и данными и функции стадии выполнения над простыми данными - разные вещи, так что вторые нельзя использовать для того что умеют первые (и наоборот)». И что? Зачем нам эти функции над кодом стадии компиляции? Явно же не для foreach - так мы приходим к вопросу о нужности и выразительности макросов.

Синтаксис запроса, актуальность наименований полей и таблиц проверятся на этапе компиляции.

То есть во время раскрытия макроса? В макросе with-db реализована какая-то проверка SQL и она общается с другими частями использующими with-db с помощью каких-то глобальных контекстов?

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

Именно аналог.

А аналог и нужен. То есть невозможность воспроизвести with* и foreach _в точности_ как в clojure не существенна, так как они воспроизводятся _с точностью до_ незначительных отличий.

В clojure они работают за счёт примитивных конструкций языка и макросов (compile-time/stage функций над кодом как данными и прочими данными). В других языках они будут работать за счёт примитивных конструкций языка и (runtime над обычными данными) функций (конструкторов, etc).

Например, при переписывании кода с такого рода простыми макросами ты не упрёшься в какие-то принципиальные ограничения. А вот если взять какой-нибудь навороченный макрос define-some-configuration на CL который генерирует класс и методы CLOS и потом ещё набор макросов которые будут генерировать другие методы этому классу и всё это будет загружаться по load в образ во время выполнения - вот тут уже наличие и свойства макросистемы окажутся существенны - на CL это просто и естественно, на «более других» языках могут быть варианты.

with-* дает новую абстракцию, а как там внутри уже не должно волновать пользователя конструкции.

С RAII классами точно так же - они дают абстракцию и скрывают детали получения и освобождения ресурсов.

Ты с этим не согласен, насколько я понял и в лиспе не используешь with-open*/with-*?

Почему? Согласен. В лиспе ты пишешь with* и foreach, где-то ещё ты пишешь RAII/try-finally и, хм, for_each/foreach. В чём разница?

Странно, почему тогда в том же лиспе и clojure это реализовали и этим повсеместно пользуются?

Эм, потому что макросы есть - потому и используют :) То есть через макросы.

А вообще, ты в курсе, к чему был пример с foreach?

К тому что это compile-time функция с типом [A, Seq <: Traversable[A]](name: Name[A] /* хотя Scala не умеет в зависимые типы */, Exp[Seq], Exp[Unit] /* и тут нужно как-то указать анафоричность по name */), ну или как-то так. Естественно, «с помощью фвп не сделать», но при этом лаг между тем что пишет макрос foreach и тем что можно написать функцией/методом map/foreach так мал, что их даже неохота различать.

В контексте какого разговора?

Такого - «функции стадии компиляции над кодом и данными и функции стадии выполнения над простыми данными - разные вещи, так что вторые нельзя использовать для того что умеют первые (и наоборот)». И что? Зачем нам эти функции над кодом стадии компиляции? Явно же не для foreach - так мы приходим к вопросу о нужности и выразительности макросов.

Синтаксис запроса, актуальность наименований полей и таблиц проверятся на этапе компиляции.

То есть во время раскрытия макроса? В макросе with-db реализована какая-то проверка SQL и она общается с другими частями использующими with-db с помощью каких-то глобальных контекстов?