In TeX è possibile definire macro con un "pattern di argomenti" che in pratica significa che il protocollo di chiamata è libero. Per il tuo esempio specifico, puoi usare
\def\getTopCustomers#1OfTheYear#2;{%
The #1 top customers of the year #2.
}
\getTopCustomers 50 OfTheYear 2010;
Nota che è anche possibile sbarazzarsi di ;
se si accetta di giocare con i registri:
\newcount\customers
\newcount\year
\def\getTopCustomers#1OfTheYear{%
\customers#1\relax
\afterassignment\reallyGetTopCustomersOfTheYear
\year
}
\def\reallyGetTopCustomersOfTheYear{%
The {\the\customers} top customers of the year {\the\year}.
}
\getTopCustomers 50 OfTheYear 2010
TeX ti permette di riconfigurare il suo lexer, e grazie alla macro \afterassignment
che ho usato sopra, puoi usare le procedure built-in per i numeri lex. È molto utile definire i protocolli di chiamata molto concisi . Ad esempio, è molto plausibile scrivere macro TeX che comprendano la notazione Markdown per le tabelle.
Ora chiedi "come posso accedere al mio database in cui i clienti sono archiviati da TeX?", ma questa è un'altra domanda. :)
In Common lisp, è sicuramente possibile definire una macro query
che ti permetta di scrivere
(query getTopCustomers 50 OfTheYear 2010)
dove getCustomers e OfTheYear sono interpretati come simboli. È quindi compito della macro dargli un senso. Common lisp è eccellente nel dominio della leggibilità del codice (sì, intendo!) Perché il sistema macro consente di creare facilmente pseudo-lingue ottimizzate per la vostra applicazione. (Penso che siano chiamate lingue dell'applicazione.)
P.S .: Sembra che nessuno abbia citato C ++. Il più vicino che puoi ottenere (senza il preprocessore) è
query.getTopCustomers(50).OfTheYear(2010):
il trucco è lasciare che getTopCustomers
restituisca un riferimento su query
(o qualsiasi altra cosa) che implementa anche OfTheYear
. È possibile creare questo esempio fino a un linguaggio di query di piccole dimensioni, ma è necessario identificare le proprietà finali (restituendo un valore) o aggiungere un metodo finalise
(eseguendo la ricerca e restituendo il valore). Se ne hai voglia, puoi anche imitare i controller di streaming di STL e poter scrivere cose come
query << getTopCustomers(50) << OfTheYear(2010) << flush;
ma questo va di nuovo nella direzione dei linguaggi delle applicazioni.
Modifica: ho trascurato le risposte @han, che citano anche Common Lisp e C ++ (ma non TeX!).