Fondamentalmente, voglio sapere come simulare while
e if
se sto gestendo il flusso di controllo attraverso una serie di istruzioni.
Il ciclo while
può essere simulato da if
, come visto con il branching di assieme con je
e così via. Ma la domanda è: una dichiarazione if
può essere simulata in qualche modo, forse simulando un contatore di programma o un puntatore di istruzioni in un ciclo?
Per simulato intendo replicato senza utilizzare direttamente le primitive del flusso di controllo, diverso dal while (true) { ... }
loop per scorrere le istruzioni.
Ad esempio:
var pointer = 0
var instructions = [
doa,
dob,
dob2,
dob3,
doc,
dod
]
var a = 1
var b = 2
var c = 3
while (true) {
var instruction = instructions[pointer]
instruction()
}
function doa() {
a = 10
pointer = 1
}
function dob() {
doif(a == 10, dob2)
doif(a != 10, dob3)
}
function dob2() {
b = 20
pointer = 4
}
function dob3() {
b = 2
pointer = 4
}
function doc() {
c = 30
pointer = 5
}
function dod() {
console.log(a, b, c)
}
function doif(a, b) {
// How to remove this:
if (a) b()
}
In fondo c'è un doif
. Ti chiedi se esiste un modo per modificare la sua implementazione in modo che non utilizzi la percentuale di% co_de incorporata, come in if
. In qualche modo forse aggiunge dinamicamente un'istruzione allo stack, e forse imposta il puntatore delle istruzioni, quindi lo apre in qualche modo. Ma non vedo come farlo senza ricorrere a if (a) b()
da qualche parte.
Come già detto, voglio farlo senza usare le primitive del flusso di controllo direttamente. Quindi so che c'è un modo per simulare un'istruzione if
, come if
, ma voglio evitarlo perché è solo una scorciatoia sintattica. Anche usare un ciclo a && b()
come while
è la stessa cosa, e così sta usando l'operatore ternario while (a) { b(); break }
Ogni pensiero sarebbe apprezzato. Grazie.