История изменений
Исправление Ritmik, (текущая версия) :
Ну with-open-file и loop это очень разные вещи
Очевидно.
С тем же успехом можно писать на С++ класс с простой инициализацией в конструкторах и RAII с гарантированным освобождением ресурсов.
Написать аналог можно хоть на чем. Именно аналог. Вопрос в том, что with-* дает новую абстракцию, а как там внутри уже не должно волновать пользователя конструкции. Ты с этим не согласен, насколько я понял и в лиспе не используешь with-open*/with-*?
Я говорил скорее о том, что если макросы есть и естественны в языке, то с ними можно и по воробьям стрелять - типа твоих for_each или with-*
Странно, почему тогда в том же лиспе и clojure это реализовали и этим повсеместно пользуются?
А вообще, ты в курсе, к чему был пример с foreach? Не про возможности макросов, а как пример, что такую именно такую приведенную конструкцию нельзя сделать только с помощью фвп.
В контексте этого разговора впечатлять должны нетривиальные примеры метапрограммирования.
В контексте какого разговора? Темы про мощь макросов не было и этот контекст начал ты.
Например, если говорить про макросы Clojure - в чём преимущество sql-as-s-expression против сырых строк с SQL или функций генерирующих SQL код в рантйме?
В том, что sql-dsl позволяет использовать запросы в других выражениях (т.е. сразу что-то делать с результатом).
Sql dsl позволяет параметризировать запрос коллекциями и типами языка непосредственно в самом запросе, т.е. например, в селекте в качестве набора полей или в условии c in передать соответствующий лист, или сгенерировать запрос как s-expression. Такие действия в самом языке гибче, проще и безопаснее, чем работать с конкатенацией строк. Например (пример высосан из пальца),
(defn get-some-clients [p1 p2 p3]
(map (fn [client]
(retr-info-from-client client))
(with-db db (select table-client
:where [:in client-id (map :id (get-from-oth-src p1 p2 p3))]))))
По части статических проверок такого кода, по части удобства набора в IDE? Есть что-нибудь такое?
Есть. Синтаксис запроса, актуальность наименований полей и таблиц проверятся на этапе компиляции. Как уже говорил, по всему есть автодополнение.
Исходная версия Ritmik, :
Ну with-open-file и loop это очень разные вещи
Очевидно.
С тем же успехом можно писать на С++ класс с простой инициализацией в конструкторах и RAII с гарантированным освобождением ресурсов.
Написать аналог можно хоть на чем. Именно аналог. Вопрос в том, что with-* дает новую абстракцию, а как там внутри уже не должно волновать пользователя конструкции. Ты с этим не согласен, насколько я понял и в лиспе не используешь with-open*/with-*?
Я говорил скорее о том, что если макросы есть и естественны в языке, то с ними можно и по воробьям стрелять - типа твоих for_each или with-*
Странно, почему тогда в том же лиспе и clojure это реализовали и этим повсеместно пользуются?
А вообще, ты в курсе, к чему был пример с foreach? Не про возможности макросов, а как пример, что такую именно такую приведенную конструкцию нельзя сделать только с помощью фвп.
В контексте этого разговора впечатлять должны нетривиальные примеры метапрограммирования.
В контексте какого разговора? Темы про мощь макросов не было и этот контекст начал ты.
Например, если говорить про макросы Clojure - в чём преимущество sql-as-s-expression против сырых строк с SQL или функций генерирующих SQL код в рантйме?
В том, что sql-dsl позволяет использовать запросы в других выражениях (т.е. сразу что-то делать с результатом).
Sql dsl позволяет параметризировать запрос коллекциями и типами языка непосредственно в самом запросе, т.е. например, в селекте в качестве набора полей или в условии c in передать соответствующий лист, или сгенерировать запрос как s-expression. Такие действия в самом языке гибче, проще и безопаснее, чем работать с конкатенацией строк. Например (пример высосан из пальца),
(defn get-some-clients [p1 p2 p3]
(map (fn [client]
(retr-info-from-client client))
(with-db db (select table-client
:where [:in (map :id (get-from-oth-src p1 p2 p3))]))))
По части статических проверок такого кода, по части удобства набора в IDE? Есть что-нибудь такое?
Есть. Синтаксис запроса, актуальность наименований полей и таблиц проверятся на этапе компиляции. Как уже говорил, по всему есть автодополнение.