Компактный if-then-else в шаблонах Hamlet - PullRequest
0 голосов
/ 31 августа 2018

Я пытаюсь понять интерполяцию переменных в «Гамлете Йесода», в частности, реализуя логику, похожую на if-then-else. Допустим, я хочу добавить стили CSS, основываясь на том, какое значение имеет целое число x. x происходит из цикла for в шаблоне, т.е. у меня нет доступа к нему из кода Haskell.

Желаемый результат:

<span class="even positive">2</span>
<span class="odd positive">13</span>
<span class="odd non-positive">-1</span>
<span class="even non-positive">0</span>

Попытка в строке if:

<span class="#{if even x then "even" else "odd"} ...">#{x}</span>

Попытка использования $with:

$with cls <- (if even x then "even" else "odd")
    <span class="#{cls}">#{x}</span>

Ни то, ни другое не работает; оба результата

• Illegal variable name: ‘if’
  When splicing a TH expression

Очевидно, что часть синтаксиса Haskell не реализована в синтаксическом анализаторе #{...}. Есть ли чистый способ сделать это? В настоящее время я вижу только один выход, и это ужасно ужасно:

$if ((even x) && (x > 0))
    <span class="even positive">#{x}</span>
$elseif (even x)
    <span class="even non-positive">#{x}</span>
$elseif (x > 0)
    <span class="odd positive">#{x}</span>
$else
    <span class="odd non-positive">#{x}</span>

1 Ответ

0 голосов
/ 31 августа 2018

Большая часть синтаксиса Haskell не поддерживается внутри этих шаблонных выражений. Я думаю, что это дизайн, так как вы не хотите, чтобы ваш шаблон содержал сложную бизнес-логику.

Я бы написал код в виде функции на конце Haskell и вызвал бы его из шаблона. Что-то вроде:

-- .hs file
altclass, signclass :: Int -> String
altclass x = if even x then "even" else "odd"
signclass x = if x > 0 then "positive" else "non-positive"

-- .hamlet file
<span class="#{altclass x} #{signclass x}">#{x}</span>

Выполнение этого таким образом правильно отделяет бизнес-логику от шаблона, но все же позволяет использовать переменные внутри шаблона.

...