Per prima cosa, è necessario richiedere se avere una clausola else, se è più semplice per te. In secondo luogo, Scheme supporta la restituzione di più valori da una funzione, quindi se si implementassero i valori restituiti come un elenco, si potrebbe avere una lista vuota che indica che non è stato fornito alcun valore di ritorno.
(if (has-alternative if-expr)
(eval (alternative if-expr)) ; make sure eval returns a list
'())
Una distinzione importante qui: io non sto tornando un elenco vuoto se non ci fosse la clausola altro. La lista vuota significa che non c'era alcun valore di ritorno. Se ci fosse un valore di ritorno da un'espressione (diciamo che fosse 3) avresti (3) come il ritorno dall'eval dietro le quinte. Allo stesso modo, la restituzione di più valori da un'espressione causerebbe la presenza di più elementi nell'elenco di ritorno di eval.
Infine, in tutta praticità, si potrebbe davvero tornare nulla se la condizione non riesce e non c'è nessun altro, perché sarebbe un errore in un programma per tentare di catturare il valore di una funzione che non restituisce nulla . In quanto tale, sarebbe compito del programmatore, non della lingua, prendere questo errore.
fonte
2009-03-19 23:04:53
Lo stesso vale anche per R5RS. –
Preferisco #f poiché (se '() ...) forniremo il ramo #t (devi testare con null?). – Jyaan