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)].

È stato utile?

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!).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top