thedeemon: (office)
[personal profile] thedeemon
Есть в D штука, представляющая из себя существующий исключительно на фазе компиляции гетерогенный список, внутри которого могут быть типы и простые значения (всякие числа, строки, булевые..). Изначально возник для манипуляций параметрами шаблонов. Для него доступен набор привычных операций: map, filter, итерация, взятие слайса, обращение по индексу и т.п. И поскольку элементы такого списка могут быть разных типов, сделано так, что итерация по нему обычным foreach всегда раскрывается. Это, в частности, дает простой способ гарантированно анроллить циклы без копипасты. А в сочетании со вставкой кода через mixin() позволяет делать такое:
alias funNames = TypeTuple!("sin", "cos", "tan", "asin", "acos", "atan", "exp");
...
  switch(fn) {
    foreach(s; funNames) 
      mixin("case \"" ~s~ "\" : return new Real(" ~s~ "(x.asReal));\n");
    ...
  }


Что компилятор раскрывает в
  switch(fn) {
    case "sin" : return new Real(sin(x.asReal));
    case "cos" : return new Real(cos(x.asReal));
    case "tan" : return new Real(tan(x.asReal));
    case "asin" : return new Real(asin(x.asReal));
    ...


Мелочь, а приятно.

Date: 2013-12-06 11:53 am (UTC)
From: [identity profile] swizard.livejournal.com
Лисперы только ухмыльнулись в усы :)

Date: 2013-12-06 12:05 pm (UTC)
From: [personal profile] alll
особенно приятно такой код читается видимо

Date: 2013-12-06 06:00 pm (UTC)

Date: 2013-12-06 01:37 pm (UTC)
From: [identity profile] theiced.livejournal.com
какая эпичная анальщина. лисп-из-говна-и-палок.

Date: 2013-12-06 02:51 pm (UTC)
From: [identity profile] thedeemon.livejournal.com
Ну хоть палки есть, в отличие от настоящих лиспов.

Date: 2013-12-06 04:33 pm (UTC)
From: [identity profile] juan-gandhi.livejournal.com
Как раз чего мне не хватает в нашем интерпретаторе.
Приходится писать trait Function[A,B] {
def name: String; def apply(A):B
}

Date: 2014-12-30 01:18 am (UTC)
From: [identity profile] thornik.livejournal.com
Когда занимался Ди, понравилась его CTFE, но смутило то, что в коде мы никак не контролируем, что должно быть во время компиляции, а что в рантайме. Это до сих пор так? Могу я полностью доверять комилятору решать за меня?

PS
Вот этот ужас mixin("case \"" ~s~ "\" : return new Real(" стараюсь писать через back ticks:
mixin(`case "`~ s ~`": return....`

Date: 2014-12-30 05:39 am (UTC)
From: [identity profile] thedeemon.livejournal.com
Как не контролируем? Наоборот же, контроль полный и тотальный.

Profile

thedeemon: (Default)
Dmitry Popov

April 2026

S M T W T F S
   1 234
567891011
12131415161718
19202122232425
2627282930  

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Apr. 26th, 2026 04:41 pm
Powered by Dreamwidth Studios