F # и цитаты Nemerle используются для метапрограммирования, но подходы разные: Nemerle использует метапрограммирование во время компиляции для расширения языка, в то время как F # использует их во время выполнения.
Nemerle
В Nemerle цитаты используются в макросах для разделения частей кода и генерации новых. Большая часть самого языка реализована таким образом. Например, вот пример из официальной библиотеки - макрос, реализующий условную конструкцию when
. У Nemerle нет операторов, поэтому if
должен иметь части else
: макросы when
и unless
обеспечивают сокращение для if
с пустыми частями then
и else
соответственно. Макрос when
также имеет расширенные функции сопоставления с образцом.
macro whenmacro (cond, body)
syntax ("when", "(", cond, ")", body)
{
match (cond)
{
| <[ $subCond is $pattern ]> with guard = null
| <[ $subCond is $pattern when $guard ]> =>
match (pattern)
{
| PT.PExpr.Call when guard != null =>
// generate expression to replace 'when (expr is call when guard) body'
<[ match ($subCond) { | $pattern when $guard => $body : void | _ => () } ]>
| PT.PExpr.Call =>
// generate expression to replace 'when (expr is call) body'
<[ match ($subCond) { | $pattern => $body : void | _ => () } ]>
| _ =>
// generate expression to replace 'when (expr is pattern) body'
<[ match ($cond) { | true => $body : void | _ => () } ]>
}
| _ =>
// generate expression to replace 'when (cond) body'
<[ match ($cond : bool) { | true => $body : void | _ => () } ]>
}
}
Код использует кавычки для обработки шаблонов, которые выглядят как некоторые предопределенные шаблоны, и заменяет их соответствующими match
выражениями. Например, сопоставив выражение cond
, данное макросу, с:
<[ $subCond is $pattern when $guard ]>
проверяет, следует ли он шаблону x is y when z
и дает нам выражения, составляющие его. Если совпадение выполнено успешно, мы можем сгенерировать новое выражение из частей, которые мы использовали:
<[
match ($subCond)
{
| $pattern when $guard => $body : void
| _ => ()
}
]>
Преобразует when (x is y when z) body
в базовое выражение для сопоставления с образцом. Все это автоматически является типобезопасным и выдает разумные ошибки компиляции при неправильном использовании. Итак, как вы видите, цитата обеспечивает очень удобный и безопасный для типов способ манипулирования кодом.