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?

È stato utile?

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 ifs 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)))
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top