Sfondo rapido: sto progettando un linguaggio pitone che voglio essere potente come Lisp pur rimanendo facile da usare. E per "potente", intendo "flessibile ed espressivo".
Sono appena stato presentato ai decoratori di funzioni di Python e mi piacciono. Ho trovato questa domanda che suggerisce che i decoratori sono non potente come le macro Lisp. La terza risposta a questa domanda dice che la ragione per cui non lo sono è perché possono operare solo sulle funzioni.
E se potessi usare i decoratori su espressioni arbitrarie? (Nella mia lingua, le espressioni sono di prima classe, proprio come le funzioni e tutto il resto, quindi farlo sarebbe abbastanza naturale.) Ciò renderebbe i decoratori potenti quanto le macro Lisp? O dovrei usare le regole di sintassi, come Racket e Honu o qualche altra tecnica?
EDIT
Mi è stato chiesto di fornire un esempio del costrutto sintattico. Per un "decoratore di espressioni", sarebbe semplicemente un decoratore su un'espressione (dove "$ (...)" crea un oggetto espressione):
@Decorator("Params")
$(if (true):
printf("Was true")
else:
printf("Wasn't true"))
Inoltre, se I do deve utilizzare le regole di sintassi, come accennato in precedenza, userebbe una sintassi di corrispondenza del modello:
# Match a bool expression, a comma, and a string.
macro assert(expr:bool lit string) { e , s }:
if (!e):
error s
else:
printf("All good")
Quanto sopra corrisponderebbe a questo:
assert i == 0, "i should have been 0"
Questo è uno schizzo approssimativo, ma dovrebbe darti un'idea.