Alguém pode me explicar por que esse código lisp não funciona?

shrekkino bobo

deve contar os elementos de uma lista, mas diz "*** - +: NIL não é um número"

(setq A '(2 3 4 3 2 6 7 8 4 3 5 6))

(defun big (A) 
   (if (not (null (car A)))   (+ 1 (big (cdr A)))  )   ;if the first element is not null, add 1 to the count of the elements to the rest of the list
)     
 
(print (big A))
coredump

Erro de digitação

Uma IFexpressão tem 2 ou 3 argumentos:

(if test something)

(if test something something-else)

Quando tem apenas 2 argumentos, é como se o terceiro argumento something-else,, fosse NIL. Isso significa que a IFexpressão é avaliada como NIL quando a testexpressão é falsa. No seu caso, você tem 2 argumentos:

(defun big (A) 
  (if (not (null (car A)))
      ;; "then" branch (when condition is true)
      (+ 1 (big (cdr A)))
      ;; no "else" branch (when condition is false)
      ))

Então você sabe que às vezes uma ligação para bigpode retornar NIL.

Mas, você também escreve:

(+ 1 (big (cdr A)))

Esta expressão parece com (+ 1 x)com xsendo uma chamada para big, o que significa que xpode avaliar a zero em alguns casos. Esse é o caso que você bate com o depurador.

Se você garantir que a ifexpressão sempre retorne um número, retornando, por exemplo, zero no ramo else, você não terá o mesmo erro ao tentar adicionar um número a NIL.

Contando elementos

Mas então, você ainda teria outros bugs, já que diz que a função big "deve contar os elementos de uma lista" . Se você quiser contar o elemento de uma lista, você nunca precisa olhar para os elementos armazenados na lista, você só precisa saber que eles existem.

Ao escrever (car a), você está acessando o primeiro elemento da lista. Você então verifica se esse valor não é nulo, mas é perfeitamente válido ter uma lista preenchida com valores NIL:

'(NIL NIL NIL)

Essa lista tem 3 elementos, e em nenhum momento o fato de serem NIL deve importar ao contá-los.

Uma função recursiva trabalhando em uma lista normalmente precisa cobrir dois casos, a saber, se a lista está vazia ou não. Você verifica se a lista atual está vazia chamando (null list)ou (endp list)(fazer isso (if list ... ...)também funciona, pois NIL é o único valor falso).

Este artigo é coletado da Internet.

Se houver alguma infração, entre em [email protected] Delete.

editar em
0

deixe-me dizer algumas palavras

0comentários
loginDepois de participar da revisão

Artigos relacionados

Alguém pode me explicar por que esse código não funciona?

Alguém pode explicar por que esse código if/else do brainfuck não funciona?

Alguém pode explicar por que esse código não funciona da maneira que eu quero?

Alguém pode me explicar como esse código funciona?

Alguém pode me explicar por que esse segundo método não atualiza totalmente a string?

Por favor, alguém pode me explicar esse código de recursão?

Alguém pode explicar por que isso não funciona?

Usando observável. Alguém pode me explicar como esse código funciona

Alguém pode explicar como funciona esse código bitMask?

Alguém pode explicar como funciona esse código bitMask?

Alguém pode me dizer por que esse simples loop PHP não funciona?

Alguém pode me explicar esse código C ++ que faz parte do programa LinkedList?

Alguém pode me explicar esse código do ReactJS?

Alguém pode me explicar por que o sub () / gsub () do awk funciona assim?

Alguém vem me explicar porque esse código não funciona para mim?

Alguém pode me explicar por que o método de ligação não funciona nesses exemplos

Alguém pode me dizer por que esse código não funciona e continua imprimindo 0,00 km como a distância mais curta?

Alguém pode me explicar por que "this" não é igual a win ou window no seguinte código javascript IIFE?

Alguém pode me explicar esse pedaço de código em vibração?

Alguém pode explicar por que esse Ruby next se funciona em um loop until?

Alguém pode explicar por que esse Ruby next se funciona em um loop until?

Alguém pode explicar por que um trecho de código funciona da mesma forma que o meu?

Bitshifting: Alguém pode explicar o que esse código faz?

Alguém pode explicar o que esse código javascript está fazendo?

Alguém pode explicar o que esse código python faz?

Alguém pode explicar por que esse salto condicional não é realizado?

Alguém pode explicar por que esse salto condicional não é realizado?

Alguém pode me explicar como funciona esse tipo de recursão?

Alguém pode explicar como seria um código como este e por que funciona?