def isTeenager: [x]
if x then: 1 else: 0
def isAdult: [x]
if x then: 1 else: 0
def getCategory: [x]
if (isTeenager x)
then: "boring teenager"
else:
if (isAdult x)
then: "cool adult"
else: "respect the elder"
def main:
(getCategory 10)
A main passa um argumento de número, no getCategory o número precisa ser usado 2x, uma para verificar se isTeenager e outra em isAdult. Haverá um erro dizendo que o número não pode ser usado 2x, o que fazer? Usar uma caixa e copiar o número com o dup.
def isTeenager: [x]
if x then: 1 else: 0
def isAdult: [x]
if x then: 1 else: 0
def getCategory: [x]
dup age = x
if (isTeenager x)
then: "boring teenager"
else:
if (isAdult x)
then: "cool adult"
else: "respect the elder"
def main:
(getCategory #10)
Certo, agora para abrir um caixa o valor dela deve continuar dentro de uma caixa. Onde a caixa será colocada?
if (isTeenager #x)
then: "boring teenager"
if #(isTeenager x)
then: "boring teenager"
Usando algum desses casos e verificando com o fmc -e main
é possível verificar que o output é diferente do esperado:
(if (if #10 &(1,0)) &("boring teenager",(if (if #10 &(1,0)) &("cool adult","respect the elder"))))
Percebe que o if do isTeenager não recebe um número (1 ou 0) mas sim um número com uma caixa. É preciso saber onde colocar a caixa no getCategory para que ela não seja passada adiante para os outros casos. Assim, têm-se a solução:
def isTeenager: [x]
if x then: 1 else: 0
def isAdult: [x]
if x then: 1 else: 0
def getCategory: [x]
dup age = x
# if (isTeenager age)
then: "boring teenager"
else:
if (isAdult age)
then: "cool adult"
else: "respect the elder"
def main:
(getCategory #10)
Ao rodar o fmc -e main
e fmc -s main
o output é o mesmo, mostrando que agora o código está certo.
Por enquanto o código não faz nada, vamos ajustar a condição de teenager para que seja idades menor ou igual a 18.
def isTeenager: [x]
{{x < 18} | {x == 18}}
Qual é o problema com esse código? Estou usando o argumento 2 vezes.
- Como vou copiar o valor e usa-lo duas vezes?
- Pode usar o dup? Não, pois ele pega um número e coloca em uma caixa, assim, muda-se a layer do elemento, o que não é permitido.
- Pode usar o let? Não, pois ele só copia o código, então a variável continua sendo usada duas vezes.
Há duas soluções:
- Continuar passando 1 argumento tal que ele seja um Pair
- isTeenager terá 2 argumentos
--
def isTeenager: [x]
get &(aux1, aux2) = x
{{aux1 < 18} | {aux2 == 18}}
def getCategory: [x]
...
# if (isTeenager &(age, age))
then: "boring teenager"
...
def isTeenager: [x][y]
{{x < 18} | {y == 18}}
def getCategory: [x]
...
# if (isTeenager age age)
then: "boring teenager"
...
—