Skip to content

Instantly share code, notes, and snippets.

@MaisaMilena
Last active May 21, 2019 12:19
Show Gist options
  • Save MaisaMilena/49356a065eb48da31cb9581ea2a8f0cb to your computer and use it in GitHub Desktop.
Save MaisaMilena/49356a065eb48da31cb9581ea2a8f0cb to your computer and use it in GitHub Desktop.
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"
...

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment