Цитата реального использования - PullRequest
3 голосов
/ 23 сентября 2011

Я столкнулся с термином «цитата» и пытаюсь найти некоторые реальные примеры его использования.Возможность иметь AST для каждого выражения кода звучит потрясающе, но как использовать его в реальной жизни?

Кто-нибудь знает такой пример?

Ответы [ 5 ]

5 голосов
/ 25 сентября 2011

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 в базовое выражение для сопоставления с образцом. Все это автоматически является типобезопасным и выдает разумные ошибки компиляции при неправильном использовании. Итак, как вы видите, цитата обеспечивает очень удобный и безопасный для типов способ манипулирования кодом.

4 голосов
/ 23 сентября 2011

Ну, в любое время, когда вы хотите программно манипулировать кодом или выполнять метапрограммирование, цитаты делают его более декларативным , что хорошо .

Я написал два поста о том, как это облегчает жизнь в Nemerle: здесь и здесь .

Для примеров из реальной жизни интересно отметить, что Nemerle сам определяет многие общие операторы как макросы (где используются цитаты). Вот некоторые примеры: if, for, foreach, while, break, continue и using.

2 голосов
/ 23 сентября 2011

Я думаю, что цитаты используются в F # и Nemerle совершенно по-разному.В F # вы не используете кавычки для расширения самого языка F #, но вы используете их для получения AST (представление данных кода) некоторой программы, написанной на стандартном F #.

В F # это сделанолибо обернув кусок кода в <@ ..F# code.. @>, либо добавив специальную атрибутику к функции:

[<ReflectedDefinition>]
let foo () = 
  // body of a function (standard F# code)

Роберт уже упоминал о некоторых применениях этого механизма - вы можете взять код и перевести F # в SQL для запроса к базе данных , но есть несколько других применений.Например, вы можете:

1 голос
/ 23 сентября 2011

Unquote - это реальный пример использования цитаты.

1 голос
/ 23 сентября 2011

Как уже упоминал Джордао, цитаты включают метапрограммирование. Одним из реальных примеров этого является возможность использовать цитаты для перевода F # на другой язык, например, SQL. Таким образом, сервер цитат во многом аналогичен деревьям выражений в C #: они позволяют преобразовывать запросы linq в SQL (или другой язык доступа к данным) и выполнять их в хранилище данных.

...