Sto provando a racchiudere le funzioni con i raffinamenti in un modo generico in modo che possano essere chiamati senza il raffinamento. Per esempio, invece di ARRAY-INITIAL size value
ARRAY/INITIAL size value
Come concludere una funzione con un raffinamento in modo che il raffinamento non sia richiesto?
wrap: function [refined [path!] args [block!]] [
function args compose [
(refined) (args)
]
]
array-initial wrap 'array/initial [size value]
Non troppo di fantasia. Sembra funzionare in generale, ma questo ha qualcosa di strano se lo si chiama usando una funzione:
>> n: 0 array/initial 4 does [++ n]
== [10 11 12 13]
>> n: 10 array-initial 4 does [++ n]
== [10 10 10 10]
Quando ho source
che ottengo questo:
>> source array-initial
array-initial: make function! [[size value][array/initial size value]]
Okay, quindi quello che sta succedendo è che la funzione è chiamato nel wrapper e il risultato della chiamata passata ... non la funzione. Una soluzione sarebbe quella di utilizzare un get-word per evitare la valutazione:
>> array-initial-2: function [size value] [array/initial size :value]
>> array-initial-2: 10 array-initial-2 4 does [++ n]
[10 11 12 13]
ma ero alla ricerca di un approccio generale. Qual è il modo migliore per eseguire il proxy dei parametri senza che ciò accada?
@ endo64 È [aggiunto una copia] (http://stackoverflow.com/revisions/22892499/3) ... questa è la funzione Rebol2. In Rebol3 è stata presa la decisione di eliminare quella forma di FUNZIONE ... ora è quello che un tempo era conosciuto come FUNCT. Più user-friendly in questo modo (e compatibile con Red). Il mio suggerimento è che, in pratica, proviamo solo ad asciare tutti gli usi FUNCTION in campioni di codice Rebol2 e poi a passare da FUNCT a FUNCTION in Rebol3. – HostileFork
Oh, giusto, l'ho dimenticato. – endo64