2016-03-30 11 views
5

In SICStus Prolog, esiste un hook per l'espansione di un obiettivo: goal_expansion/6 che viene chiamato sia in fase di compilazione che in fase di esecuzione durante il metacalling. Queste chiamate comportano un certo sovraccarico di runtime che rallenta il metacalling. Lo scopo della mia espansione è solo l'ottimizzazione. Quindi semanticamente gli obiettivi e gli obiettivi espansi sono equivalenti.Restringere goal_expansion/6 per compilare solo il tempo

Come disabilitare tali chiamate in fase di esecuzione?

(Sembra che dovrei abolire goal_expansion/6 che sembra un po 'grossolano per me. Sarebbe anche ostacolare lightweight recompilation).

+2

Mi piacerebbe anche sostenere che l'ottimizzazione è l'unico uso legale dell'espansione * obiettivo *. Ciò implicherebbe che è sempre facoltativo e probabilmente non dovrebbe essere fatto automaticamente per metacalls e forse anche per affermazioni. – jschimpf

+1

@jschimpf: (solo speculazione) Forse altri usi implicano un trattamento speciale di meta-argomenti o cose di tipo macro. Non che io sia a conoscenza di tale uso. Tipo: aggiunta di informazioni di debug. – false

risposta

4

Una soluzione alternativa sarebbe chiamare il predicato prolog_load_context/2. Qualcosa di simile:

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

Il prolog_load_context/2 predicato ha successo solo in fase di compilazione.

5

Il modo idiomatico consiste nel caricare il codice di sola compilazione utilizzando load_files/3 con l'opzione when(compile_time). Sfortunatamente, questo non aiuta se vuoi (ri) compilare nello stesso processo in cui esegui il tuo codice.

L'utilizzo di abolish per rimuovere la definizione di goal_expansion/5 non è l'ideale (dato che scomparirà se quindi ricompilate). Non è così brutto/grossolano come sembra, però: goal_expansion/5 è per modulo, quindi puoi abolirlo senza preoccuparti di distruggere alcune funzionalità in qualche altro modulo.

Problemi correlati