2017-06-18 3 views
1

S'il vous plaît gardez avec moi comme je suis encore assez nouveau à lisp. Le but de ma fonction (appelée dans ce cas test) est de placer toutes les valeurs dans une liste et de renvoyer une nouvelle liste.Lisp: Quadrature toutes les valeurs dans une liste

Par exemple, la liste d'origine (1 2 3). La nouvelle liste devrait être (1 4 9)

Ceci est actuellement ce que j'ai jusqu'à présent,

(defun test (n) 
    (cond ((null n) nil) 
     (t (cons * (car n) (car n)) 
      (test (cdr n))))) 

Cependant, je continue à obtenir une erreur et je suis tout à fait incertain quant à la façon de procéder. Toute aide serait grandement appréciée!

+0

Cela se fait avec '(mapcar (lambda (x) (* xx)) votre liste), ou' (mapcar # '* yourlist yourlist) '. La chose la plus importante dans la programmation Lisp est de tirer parti du langage existant et de sa bibliothèque, et des idiomes comme utiliser des fonctions d'ordre supérieur avec des applicateurs tels que 'mapcar'. – Kaz

Répondre

3

Dans votre code, il y a deux problèmes: la syntaxe de cond (l'équivalent de else d'autres langues est T), et le fait que l'opérateur de multiplication est manquante.

Ceci est une version de travail:

(defun test (n) 
    (cond ((null n) nil) 
     (t (cons (* (car n) (car n)) 
       (test (cdr n)))))) 

De plus, notez que cond est le plus souvent utilisé lorsque plusieurs conditions, alors que if est utilisé pour une seule condition:

(defun test (n) 
    (if (null n) 
     nil 
     (cons (* (car n) (car n)) 
      (test (cdr n))))) 
+0

ahhh j'ai oublié t! Et merci beaucoup j'ai oublié d'inclure l'opérateur de multiplication, je vais le modifier. Merci pour l'aide! –

+0

Désolé de vous déranger à nouveau, mais j'ai du mal à appeler une fonction distincte de celui appelé test. Je continue à obtenir une erreur non définie de fonction quand je l'appelle –

+0

Je pense que vous devriez poster une nouvelle question montrant votre code et l'erreur exacte que vous obtenez. – Renzo