Utilizzare un singolo RESUME per tutti gli stili INTERCAL-72 se conscuct
Se è necessario scrivere l'equivalente di un'istruzione "if", il metodo normale utilizzando il codice INTERCAL-72 è NEXTdue volte e quindi eseguire un calcolo RESUME. (Nel codice moderno, spesso un calcolo COME FROMsarà migliore, ma questo suggerimento presuppone che il tuo codice preferisca NEXT.) Quasi certamente devi pagare i byte per il primo NEXT, poiché salta da un ramo del "if" all'altro. Anche condividere il secondo non NEXTè banale, a meno che tu non abbia molte affermazioni "if" che vanno nello stesso posto quando vedi un #1. Tuttavia, RESUMEpuò essere ovunque nel programma (perché il controllo lo lascerà immediatamente ovunque).
Esistono due modi per gestirlo. Se hai molte dichiarazioni "if", RESUMEprobabilmente garantisce un numero di riga a una cifra, in modo che la tua seconda NEXTistruzione possa essere il più breve possibile. Se possibile, prova a renderlo un calcolo RESUMEche si verificherebbe naturalmente nel tuo codice (è vero, questo è difficile, poiché è raro che quelli compaiano nel "flusso normale" del codice piuttosto che essere NEXTeditati); quindi, l'unico costo è il numero di riga. Dovrai usare una singola variabile booleana per tutti questi NEXTs; il consenso universale qui è da usare .5, principalmente perché è la variabile che la libreria standard usa per valori di ritorno booleani.
In alternativa, è possibile utilizzare una funzionalità non documentata (tecnicamente non documentata, perché ho notato un suggerimento nella documentazione INTERCAL quando ho notato) della libreria standard. Poiché una posizione centrale per a RESUMEè così utile, la libreria standard ne utilizza una internamente. I numeri di riga in INTERCAL sono globali (con convenzioni di spaziatura dei nomi, ma che possono essere interrotti se sai cosa stai facendo), quindi puoi andare NEXTdirettamente negli interni della libreria standard se vuoi, e in particolare, puoi NEXTnella sua posizione centrale RESUME . Questo è abbastanza popolare nel codice INTERCAL esistente che le sostituzioni di librerie standard tendono a doverle implementare per evitare la rottura dei programmi esistenti.
La linea in questione è (letteralmente o efficacemente, a seconda dell'implementazione):
(1001) DO RESUME .5
Il motivo principale per non utilizzare questo è il suo numero di linea lunga; se devi costruire molto INTERCAL-72 se costruisci, sarà meglio usare il tuo per assegnargli un numero più breve.
Certo, puoi combinare le tecniche, scrivendo qualcosa di simile
(9)DO(1001)NEXT
che è solo leggermente più lungo di
(9)DORESUME.5
e ha il vantaggio che i booleani diventano #2e #3(che è più difficile da leggere, ma normalmente più facile da generare). In realtà, potrebbe anche valere la pena inserire il codice aggiuntivo da gestire #0e #1se hai intenzione di iffing molto (ma calcolato COME FROMprobabilmente funzionerà meglio in questo caso a meno che i tuoi requisiti non siano molto strani).