Как да отпечатам списък, разделен със запетая, с hamlet?

С езика за шаблони на hamlet, който идва с yesod, кой е най-добрият начин за отпечатване на списък, разделен със запетая?

напр. приемем този код, който просто отпечатва един запис след друг, как да вмъкна запетаи между елементите? Или може би дори добавете „и“ преди последния запис:

The values in the list are
$ forall entry <- list
    #{entry}
and that is it.

Някои езици за шаблони, като Template Toolkit предоставят директиви за откриване на първия или последния повторение.


person Joachim Breitner    schedule 23.09.2011    source източник


Отговори (1)


Не мисля, че има нещо такова вградено. За щастие е лесно да използвате помощните функции в Hamlet. Например, ако вашите елементи са обикновени низове, можете просто да използвате Data.List.intercalate, за да добавите запетаи между тях.

The values in the list are 
#{intercalate ", " list} 
and that is it.

Ако искате да правите по-фантастични неща, можете да напишете функции, които да работят със стойности на Хамлет. Например, ето функция, която добавя запетаи и "и" между стойностите на Хамлет в списък.

commaify [x] = x
commaify [x, y] = [hamlet|^{x} and ^{y}|]
commaify (x:xs) = [hamlet|^{x}, ^{commaify xs}|]

Това използва синтаксис ^{...} за вмъкване на една стойност на Hamlet в друга. Сега можем да използваме това, за да напишем разделен със запетаи списък с подчертани думи.

The values in the list are 
^{commaify (map underline list)} 
and that is it.

Тук underline е само малка помощна функция за създаване на нещо по-интересно от обикновен текст.

underline word = [hamlet|<u>#{word}|]

При изобразяване това дава следния резултат.

The values in the list are <u>foo</u>, <u>bar</u> and <u>baz</u> and that is it.
person hammar    schedule 23.09.2011
comment
Благодаря, предполагам, че това е добра колекция от решения, макар че нито едно не е толкова задоволително, колкото това, което Template Haskell предоставя. Може би трябва да изпратя корекция за специална променлива loop на hamlet. - person Joachim Breitner; 25.09.2011