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

Foi útil?

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top