1. Куча / Говнокод #11956

    +123

    1. 1
    2. 2
    (format t "~{~[~:R~; ~S~:;none~] chance~^, ~}" '(0 1 0 2 0 3))
    ;; first chance, second chance, third chance

    Любителям ДСЛ (а так же древесно-стружечных плит, и других керамических изделий):
    Объясните почему так работает? Наверное не говнокод, просто нихрена не понятно.

    Запостил: wvxvw, 18 Октября 2012

    Комментарии (2) RSS

    • > ~{ .. ~}
      Означает итерацию по списку, переданному в качестве аргумента
      > chance~^,
      Означает разделять результаты применения формата к списку разделителем ,
      > ~[~:R~; ~S~:;none~]
      означает условный выбор формата: 0 будет форматированием числа в виде английского текста, 1 - в виде лиспового литерала, который можно будет прочитать функцией READ, любое другое число будет порождать none

      Магия довольно подробно описана здесь: http://www.gigamonkeys.com/book/a-few-format-recipes.html

      P.S. мне не нравится в CL ни "dsl" форматирования, ни dsl, построенный на макросе loop. Слишком много илитарности.
      Ответить
      • Из описания я понял, что какой выбор сделать - следует из количества элементов который следуют за строкой с шаблоном. В данном случае эту строку наполняет функция, которая осуществляет итерацию - почему она считает, что первый элемент который она встречает - это количество елементов которые нужно передать конструкции внутри итерации - для меня загадка.
        По-идее, чтобы аргумент следующий за строкой с шаблоном воспринимался как указатель на то, какой из существующих вариантов нужно выбрать, нужно было бы делать ~#[...~;...~:;...] но так вообще не работает, и ни один из елементов никогда не используется :/
        Ответить

    Добавить комментарий