Sou iniciante nesta linguagem: GForth .
Alguém com alguma experiência pode me dizer qual é o problema no código abaixo?
Aqui está uma definição.
: collatzcount
variable count
0 count !
{ ini } ini
begin dup 1 <> while dup . syr repeat .
count ? ;
\ redefined collatzcount ok
Neste ponto, aparentemente, nada está errado. Então vamos tentar:
1 collatzcount
saída
:213: Attempt to use zero-length string as a name
1 collatzcount>>><<<
Backtrace:
$7F21F04AB710 throw
$7F21F04B0008 name-too-short?
$7F21F04B1990 header
$7F21F04B1A00 Create
$7F21F04FD460 Variable
O que é essa misteriosa " Tentativa de usar string de comprimento zero como nome "?
Caso alguém queira saber, esta é a definição de syr :
: syr dup 2 mod 0 = if 2 / else 3 * 1 + endif ;
Mas isso provavelmente é irrelevante para a questão.
variable
é uma palavra definidora e funciona corretamente apenas no nível do intérprete, ou seja, não dentro de uma definição de dois pontos. (Isso é verdade para todos os Forths, mas os sintomas de violação podem variar; em particular, uma implementação 'inteligente' provavelmente causará um erro durante a definição, em vez de esperar até executá-la.)Também
count
é uma palavra preexistente (e padrão) ; usá-lo comovariable
torna a palavra padrão inacessível e pode quebrar coisas.Finalmente, não há nenhum benefício em criar
ini
um local quando o único uso que você faz dele é re-empurrá-lo imediatamente.Líquido:
Isso é executado, mas a contagem é sempre 0 porque você nunca a alterou. Suspeito pelo nome que você queria incrementar
cnt
o loop para que no final ele imprima o número de loops executados (ou seja, etapas) antes de chegar a 1:etc. (Divida em linhas e adicione comentários a seu gosto.)