2012-07-03 12 views
5

I zostały badania kilka zagnieżdżonych wywołań makr, a oni pracowali zgodnie z oczekiwaniami Na przykład, zakładając ficticious dodać makro i następujące wyrażenie (... zgodnie z oczekiwaniami przeze mnie!):Czy można bezpiecznie wykonywać inokacje makro?

add(1, add(2, 3)) 

Po pierwsze dodawanie wewnętrzne jest rozszerzane (2 + 3), a po drugie strona zewnętrzna wykonuje swoją część (1 + (2 + 3)). Widziałem, że makro zewnętrzne nie otrzymuje żadnego szumu z wewnętrznego wywołania - w wyrażeniu wejściowym - więc wewnętrzna ekspansja wydaje się dla niego całkowicie przezroczysta. Czy ten fakt zawsze trwa (nawet w przypadku bardziej złożonych makr i typów)? Czy to bezpieczne?

+1

Nie byłem w stanie zebrać wystarczającej ilości informacji od skimmingów, aby odpowiednio odpowiedzieć na twoje pytanie, ale możesz być zainteresowany tym artykułem opisującym system makr Rakieta: [Makra, które działają razem: Wiązania kompilacji, Kontury częściowe i Konteksty definicji] (http://www.cs.utah.edu/plt/publications/jfp12-draft-fcdf.pdf) –

+0

Nie znam dobrze tego konkretnego artykułu, przeczytałem tylko wersję konferencyjną, ale system makr Scali jest nie do końca porównywalne - powiedzmy, typechecking dzieje się przed ekspansją makr - chociaż wymaga to rozpoznawania nazw i umożliwienia * dodania * higieny przy użyciu reify. Nie bój się: makra Scala nie są domyślnie higieniczne, ale poszczególne makra są, jeśli budujesz tylko AST, by powrócić przez reify (co jest nieco podobne do quasi-cytowania, wciąż nie dostaję tej różnicy szczerze). – Blaisorblade

Odpowiedz

8

Najbliższe makra są zawsze rozwijane jako pierwsze (nawet jeśli są dostarczane jako argumenty z nazwy).

+0

Myślę, że drugą częścią odpowiedzi jest (miejmy nadzieję), że po rozwinięciu wewnętrznego makra wynik jest sprawdzany przed wywołaniem makra zewnętrznego (w przeciwnym razie wynik może nie zostać w pełni wpisany/rozwiązany). – Blaisorblade

+1

Rzeczywiście, rozszerzenie wewnętrznych makr jest sprawdzane przed przeniesieniem do zewnętrznego makra. Ekspansje makr są zawsze sprawdzane typowo zaraz po ich zwróceniu z implementacji makr. –

Powiązane problemy