A proposito di “Se ..” in Scheme (PLT-schema)
Domanda
Ho avuto un requisito piuttosto semplice nel mio programma Schema di eseguire più di una dichiarazione, nella condizione di true di un 'se'. . Così scrivo il mio codice, qualcosa di simile:
(if (= 1 1)
((expression1) (expression2)) ; these 2 expressions are to be
; executed when the condition is true
(expression3))
Ovviamente, quanto sopra non funziona, dal momento che ho involontariamente creato una procedura # con # argomenti. Quindi, per ottenere la mia il lavoro fatto, ho semplicemente messo le espressioni di cui sopra in una nuova funzione e chiamare da lì, al posto della espressione1, espressione2. esso funziona.
Quindi, il mio punto qui è: C'è qualche altro costrutto condizionale che può supportare la mia esigenza qui?
Soluzione
In MIT-Scheme, che non è molto diverso, è possibile utilizzare begin
:
(if (= 1 1)
(begin expression1 expression2)
expression3)
In alternativa, utilizzare Cond:
(cond ((= 1 1) expression1 expression2)
(else expression3))
Altri suggerimenti
(begin ...)
è il modo per valutare molteplici espressioni e restituire l'ultimo. Molti altri costrutti agiscono come blocchi begin
"implicito" (che permettono molteplici espressioni, proprio come un blocco begin
, ma non c'è bisogno di dire begin
), come il corpo di una clausola cond
, il corpo di un define
per le funzioni, il corpo di un lambda
, il corpo di un let
, ecc .; potrebbe essere stato utilizzato senza rendersene conto. Ma per if
, ciò non è possibile nella sintassi, perché ci sono due espressioni (quella per la vera e quella per falso) accanto all'altro, e così permettendo molteplici espressioni renderebbe ambiguo. Quindi, è necessario utilizzare un costrutto begin
esplicito.
è possibile utilizzare (inizio ...) per ottenere ciò che si desidera nel vero ramo del vostro if. Vedere qui
È possibile utilizzare COND, o mettere le espressioni in qualcosa di simile progn in Lisp. (Io non sono sicuro di come viene chiamato in PLT Scheme modifica:. Si chiama INIZIARE )
COND assomiglia a questo nello Schema:
(cond [(= 1 1)
(expression1)
(expression2)]
[else
(expression3)])
Utilizzando una dichiarazione if
con più di due casi comporta la nidificazione, per esempio:.
(if (test-1) ; "if"
(expression-1)
(if (test-2) ; "else-if"
(expression-2)
(expression-3))) ; "else"
Utilizzando cond
sembra essere il modo migliore per esprimere le istruzioni condizionali, come è più facile da leggere rispetto a un gruppo di if
s nidificate e si può anche eseguire più istruzioni senza dover utilizzare la clausola begin
:
(cond ((test-1)
(expression-1))
((test-2)
(expression-2)
(expression-3))
(else
(default-expression)))