Esquema PLT Noob: Boolean e / ou não são procedimentos?
Pergunta
Eu estou tentando fazer um gerador de tabela de verdade para uma eletrônica digital claro porque é assim que eu me divirto no meu tempo livre e não me julgue.
Anywho, eu descobri que teria um hash com o equivalente série de operadores como chaves, e os procedimentos esquema que correspondem aos operadores como valores.
por exemplo.
(define operator-table #hash(("+" . or) ("*" . and)))
Então, eu poderia fazer algo assim
(lambda (a b) ((hash-ref operator-table (string-ref input-str i)) a b))
Agora eu percebo o anterior provavelmente não irá funcionar bem, mas como é que eu posso nem mexer com ele até que eu acertei, porque aparentemente and
e or
são especiais no esquema. No REPL, se eu digitar not
ele responde #<procedure:not>
. Mas se eu dar-lhe and
ou or
, diz and: bad syntax in: and
. Existe uma versão procedimento de and
eu posso usar? Ou eu tenho que fazer um com lambda
? Ou estou faltando algo completamente?
A única razão que eu não basta ir com lambda a partir do get-go é que eu não quero perder as habilidades variável-aridade da and
builtin [que posso fazer (and #t #f)
, bem como (and #t #f #f #t #f #t)
].
Solução
Se você quiser usar um formulário função de and
e or
(com a limitação de que eles não vão curto-circuito) e não perder a propriedade variável arity, então você pode facilmente fazê-lo:
(define (and* . xs) (andmap values xs))
(define (or* . xs) (ormap values xs))
(values
é a função de identidade idiomática em (PLT) Esquema.)
Outras dicas
Sim, eles podem não ser os procedimentos porque Scheme (como a maioria dos idiomas) é uma linguagem "ansioso" - todos os argumentos para um procedimento começa avaliadas antes do procedimento assume o controle (recebendo os valores dos argumentos). and
e necessidade or
para "curto-circuito" - avaliação argumento parada assim que o resultado final é conhecido - de modo que não pode ser regular procedimentos / funções em qualquer idioma ansioso (línguas "preguiçoso", como Haskell - onde cada argumento é avaliado somente se, quando e como necessário - são uma raça muito diferente, e não necessidade esta "função normal" versus "forma especial" distinção ... mas, infelizmente, esquema não é apenas um daqueles!).