PLT Scheme niubbo: booleano e / o non sono procedure?
Domanda
Sto cercando di fare un generatore di verità tavolo per un corso di elettronica digitale, perché è così che mi diverto nel mio tempo libero e non mi giudico.
Anywho, ho pensato che avrei avuto un hash con la stringa equivalente di operatori come chiavi e le procedure schema che corrisponde a tali operatori come valori.
per es.
(define operator-table #hash(("+" . or) ("*" . and)))
Così ho potuto fare qualcosa di simile
(lambda (a b) ((hash-ref operator-table (string-ref input-str i)) a b))
Ora mi rendo conto quanto sopra probabilmente non funzionerà bene, ma come è che non si può nemmeno armeggiare con esso fino a quando ho capito bene, perché a quanto pare and
e or
sono speciali in Scheme. Al REPL, se digito not
esso risponde #<procedure:not>
. Ma se lo do and
o or
, si dice and: bad syntax in: and
. Esiste una versione procedimento di and
posso usare? O devo fare uno con lambda
? O mi sto perdendo qualcosa di completamente diverso?
L'unica ragione per cui non ho solo andare con lambda dal get-go è che io non voglio perdere le capacità variabile Arity del and
incorporato [posso fare (and #t #f)
così come (and #t #f #f #t #f #t)
].
Soluzione
Se si desidera utilizzare un modulo di funzione del and
e or
(con la limitazione di non corto circuito) e non perdere la proprietà arity variabile, allora si può facilmente farlo:
(define (and* . xs) (andmap values xs))
(define (or* . xs) (ormap values xs))
(values
è la funzione identità idiomatica in (PLT) Scheme).
Altri suggerimenti
Sì, non possono essere le procedure perché Scheme (come la maggior parte delle lingue) è un linguaggio "ansioso" - ogni argomento a una procedura viene valutato prima che la procedura prende il controllo (che riceve i valori degli argomenti). and
e or
hanno bisogno di "corto circuito" - interrompere la valutazione argomento non appena il risultato finale è noto - in modo che non possono essere regolari / funzioni in qualsiasi lingua ansiosi (lingue procedure "pigri", come Haskell - dove ogni argomento viene valutata solo se, quando e se necessario - sono una razza molto diversa, e non necessità questa "funzione regolare" contro distinzione "forma speciale" ... ma, ahimè, schema solo non è uno di quelli!).