2016-03-30 7 views
5

W SICStus Prolog istnieje haczyk służący do rozszerzenia celu: goal_expansion/6, który jest nazywany zarówno podczas kompilacji, jak i podczas wykonywania metaallingu. Te połączenia powodują pewien napływ runtime, który spowalnia metaalling. Celem mojego rozszerzenia jest tylko optymalizacja. Tak semantycznie cele i rozszerzone cele są równoważne.Ograniczanie opcji goal_expansion/6 do kompilowania tylko czasu

Jak mogę wyłączyć takie połączenia w czasie wykonywania?

(Wydaje się, że musiałbym znieść goal_expansion/6, co dla mnie trochę mnie przeraża, a także utrudniłoby działanie lightweight recompilation).

+2

Chciałbym nawet poprzeć pogląd, że optymalizacja jest jedynym legalnym zastosowaniem rozszerzenia * celu *. Oznaczałoby to, że jest to zawsze opcjonalne i prawdopodobnie nie powinno być wykonywane automatycznie dla metacalls, a może nawet zapewnia. – jschimpf

+1

@jschimpf: (tylko spekulacja) Być może inne zastosowania wiążą się ze specjalną obsługą meta-argumentów lub rzeczy makro. Nie, żebym wiedział o takim użyciu. Podobnie jak: dodawanie informacji debugowania. – false

Odpowiedz

4

Obejście problemu polegałoby na wywołaniu predykatu prolog_load_context/2. Coś jak:

goal_expansion(...) :- 
    prolog_load_context(source, _), 
    % compile-time; expand the goal 
    ... . 

prolog_load_context/2 orzecznik powiedzie tylko w czasie kompilacji.

5

Sposób idiomatyczny polega na załadowaniu kodu zgodnego tylko z kompilacją przy użyciu load_files/3 z opcją when(compile_time). Niestety, to nie pomoże, jeśli chcesz (ponownie) skompilować w tym samym procesie, w którym uruchomisz swój kod.

Używanie abolish do usuwania definicji również nie jest idealne (ponieważ zniknie, jeśli ponownie skompilujesz). Jednak nie jest tak źle, jak się wydaje: goal_expansion/5 jest na moduł, więc możesz go zlikwidować bez obawy, że zniszczysz niektóre funkcje w innym module.

Powiązane problemy