Автор Тема: Парадокс Блаба.  (Прочитано 32660 раз)

Peter Almazov

  • Sr. Member
  • ****
  • Сообщений: 482
    • Просмотр профиля
Re:Парадокс Блаба.
« Ответ #15 : Февраль 21, 2011, 12:15:01 pm »
Ну, не видите проблем, бог вам судия.
А все-таки, реальный пример-то можете дать?

valexey

  • Administrator
  • Hero Member
  • *****
  • Сообщений: 1990
    • Просмотр профиля
Re:Парадокс Блаба.
« Ответ #16 : Февраль 21, 2011, 12:28:32 pm »
Ну, не видите проблем, бог вам судия.
А все-таки, реальный пример-то можете дать?
А что подразумевается под реальным примером? Прям таки код?
А где именно использовать это можно и нужно и где без подобных высокоуровневых средств не обойтись, я указал. Хотя быть может я и не прав конечно и на Обероне эти задачи таки можно решить приемлемым способом...
"но сейчас, чтобы компенсировать растущую мощность компьютеров, программисты используют фреймворки"

Peter Almazov

  • Sr. Member
  • ****
  • Сообщений: 482
    • Просмотр профиля
Re:Парадокс Блаба.
« Ответ #17 : Февраль 21, 2011, 12:39:23 pm »
Именно код. Хорошо бы на Лиспе. С комментариями для бестолковых (себя имею в виду  :)).

Geniepro

  • Hero Member
  • *****
  • Сообщений: 1955
  • Знайте- истина в том, что повторено трижды подряд!
    • Просмотр профиля
Re:Парадокс Блаба.
« Ответ #18 : Февраль 21, 2011, 12:51:48 pm »
Во-вторых, можете привести пример гениального использования макросов? Типа, а вот здесь языки без макросов сосут.
В C# есть оператор using, который, в частности, позволяет автоматически закрывать файл после того, как с ним будет проведена какая-то работа:// точно на память работу с файлами в .NET не помню,
// просто пример как это может выглядеть

using (File file = File.Open("filename.txt"))
{
    // что-то делаем с файлом file

} // тут он автоматически закрывается
Когда в С# не было этого оператора (вроде когда-то его не было, может ошибаюсь), приходилось (да и теперь в том же С или Обероне приходится) закрывать файл вручную. Естественно, можно было по запарке забыть это дело сделать.

Макросы позволяют самостоятельно модифицировать язык, добавить этот самый "using":; условный синтаксис:

(defmacro with-open-file (file filename body)
    (let (,file (open-file filename)
      ,@body
      (close-file ,file))))

; пример использования:

(with-open-file file "filename.txt"
    ( ; что-то делаем с файлом file
    )) ; тут он автоматически закрывается
Ну, в некоторых языках некоторые возможности макросов можно реализовать и без макросов. Например, в Хаскелле:with_open_file :: FilePath -> IOMode -> (Handle -> IO a) -> IO a
with_open_file filename mode action = do
    fhnd   <- openFile filename mode
    result <- action fhnd
    hClose fhnd
    return result

-- Пример использования

do  ...
    with_open_file "filename.txt" ReadMode $ \\file -> do
        ... -- что-то делаем с файлом file
    -- тут он автоматически закрывается
Но Хаскелл -- ленивый язык, в нём такие фокусы проходят.
В сях тоже можно соорудить макрос, но именно -- какой-никакой, а макрос.
А в оберонах?
to iterate is human, to recurse, divine

Салат «рекурсия»: помидоры, огурцы, салат…

valexey

  • Administrator
  • Hero Member
  • *****
  • Сообщений: 1990
    • Просмотр профиля
Re:Парадокс Блаба.
« Ответ #19 : Февраль 21, 2011, 12:56:47 pm »
Цитировать
If you have a scarce resource that you need to manage the lifecycle of explicitly instead of tying it into a GC finalization, then the approximate equivalent of the try/finally code on FinalizeInsteadOfProperDestructor is
  (let ((r (allocator-for-my-scarce-resource)))
    (unwind-protect
    (progn
       (foo)
     (bar)
     (etc))
    (deallocate-my-scarce-resource r)))
(UNWIND-PROTECT means "evaluate the first argument. When you stop with the first argument, for whatever reason, also run the subsequent args" - if you like, "try" the first arg, and "finally" do the other args)
You can't depend on some client programmer always remembering to do this, so you make it easy for them. Write a macro, which would probably be called WITH-SCARCE-RESOURCE in this case, that wraps the unwind-protect so the user never has to remember
(defmacro with-scarce-resource ((name) &body body)
    `(let ((,name (allocator-for-my-scarce-resource)))
    (unwind-protect
     (progn
     ,@body)
   (deallocate-my-scarce-resource r))))
so now we just have to do
(with-scarce-resource (r)
  (foo)
 (bar)
 (etc))
Источник: http://www.c2.com/cgi/wiki?LispMacro
"но сейчас, чтобы компенсировать растущую мощность компьютеров, программисты используют фреймворки"

valexey

  • Administrator
  • Hero Member
  • *****
  • Сообщений: 1990
    • Просмотр профиля
Re:Парадокс Блаба.
« Ответ #20 : Февраль 21, 2011, 01:07:21 pm »
Но Хаскелл -- ленивый язык, в нём такие фокусы проходят.
А кстати, как тут помогает ленивость? Я не вижу проблем сделать то же самое на энергичном языке с замыканиями.
"но сейчас, чтобы компенсировать растущую мощность компьютеров, программисты используют фреймворки"

Peter Almazov

  • Sr. Member
  • ****
  • Сообщений: 482
    • Просмотр профиля
Re:Парадокс Блаба.
« Ответ #21 : Февраль 21, 2011, 01:17:26 pm »
Пока не разобрался с кодом - вопрос: а что мешает невнимательным НЕ использовать макрос и нарушать дисциплину работы с ресурсом?

valexey

  • Administrator
  • Hero Member
  • *****
  • Сообщений: 1990
    • Просмотр профиля
Re:Парадокс Блаба.
« Ответ #22 : Февраль 21, 2011, 01:23:47 pm »
Пока не разобрался с кодом - вопрос: а что мешает невнимательным НЕ использовать макрос и нарушать дисциплину работы с ресурсом?
В хаскеле помешает система типов. Оно просто не скомпилируется.
"но сейчас, чтобы компенсировать растущую мощность компьютеров, программисты используют фреймворки"

Peter Almazov

  • Sr. Member
  • ****
  • Сообщений: 482
    • Просмотр профиля
Re:Парадокс Блаба.
« Ответ #23 : Февраль 21, 2011, 01:25:57 pm »
Ну так там, к счастью, и не макрос.

valexey

  • Administrator
  • Hero Member
  • *****
  • Сообщений: 1990
    • Просмотр профиля
Re:Парадокс Блаба.
« Ответ #24 : Февраль 21, 2011, 01:34:47 pm »
Ну так там, к счастью, и не макрос.
А это без разницы на самом деле.
"но сейчас, чтобы компенсировать растущую мощность компьютеров, программисты используют фреймворки"

Peter Almazov

  • Sr. Member
  • ****
  • Сообщений: 482
    • Просмотр профиля
Re:Парадокс Блаба.
« Ответ #25 : Февраль 21, 2011, 02:18:04 pm »
Тогда не понял - об чем базар?

valexey

  • Administrator
  • Hero Member
  • *****
  • Сообщений: 1990
    • Просмотр профиля
Re:Парадокс Блаба.
« Ответ #26 : Февраль 21, 2011, 02:28:16 pm »
Тогда не понял - об чем базар?
Базар о парадоксе Блаба :-)

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

Peter Almazov

  • Sr. Member
  • ****
  • Сообщений: 482
    • Просмотр профиля
Re:Парадокс Блаба.
« Ответ #27 : Февраль 21, 2011, 02:36:45 pm »
Пардон, в статье про Хаскел ни слова. Более того, Грейхем считает, что он хуже Лиспа.
Поэтому я предлагаю обсудить (и попытаться опровергнуть) тезис:
"Любой макрос демонстрирует дефект в языке или в голове программиста".

Я его привожу по памяти, если кто-нибудь найдет первоисточник, буду очень благодарен.

valexey

  • Administrator
  • Hero Member
  • *****
  • Сообщений: 1990
    • Просмотр профиля
Re:Парадокс Блаба.
« Ответ #28 : Февраль 21, 2011, 03:11:01 pm »
А Грейхем про него вообще что-то знает? :-)

Я не буду опровергать тезис, что "Любой макрос демонстрирует дефект в языке или в голове программиста", я его просто дополню тезисом, что "во всех языках есть дефекты". Можно сделать язык который будет достаточен для 80-90 процентов кода любого проекта. Однако оставшиеся 10-20 процентов кода... Они у каждого проекта свои. И чтобы удовлетворить на 100 процентов потребности всех проектов придется столько в язык понапихать... Посмотри на C#. Аду и другие языки идущие тем путем. В язык добавляют и добавляют редкоиспользуемые фичи, язык пухнет, пухнут голову у использующих его, пухнут головы у писателей компилятора и либ.

Много лучше когда в языке есть просто возможности (те же макросы например) которые позволяют реализовать необходимое в данном проекте, но отсутствующее в языке, просто в виде либы. Либа пишется быстро. На другие проекты не влияет, на сложность языка не влияет. Влияет только на тот код, где она явно импортирована. Очень удобно и правильно. В основном с помощью этого строится архитектурообразующие конструкции для данного проекта.
"но сейчас, чтобы компенсировать растущую мощность компьютеров, программисты используют фреймворки"

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
Re:Парадокс Блаба.
« Ответ #29 : Февраль 21, 2011, 03:11:43 pm »
Пардон, в статье про Хаскел ни слова. Более того, Грейхем считает, что он хуже Лиспа.
Поэтому я предлагаю обсудить (и попытаться опровергнуть) тезис:
"Любой макрос демонстрирует дефект в языке или в голове программиста".

Я его привожу по памяти, если кто-нибудь найдет первоисточник, буду очень благодарен.

Да чего тут обсуждать :) Тут простой диагноз: человек измучился с сишными макросами :)