Comment diviser une liste de schémas en args à transmettre à une procédure?
-
14-11-2019 - |
Question
Je veux utiliser le prédéfini (max)
fonction (r5rs) avec un list
de nombres, qui varient en longueur. Malheureusement, (max)
accepte les entrées comme ceci:
(max 2 43 5 6)
=> 43
J'essaie de l'utiliser comme ça:
(define lst '(3 5 53 4 53 54 32))
(max lst)
Cela produit l'erreur suivante.
max: expects argument of type <real number>; given (3 5 53 4 53 54 32)
Comment puis-je briser cette liste dans les arguments individuels dont j'ai besoin, car je les passe (max)
?
La solution
Vous pourriez envisager d'utiliser apply
(Bien qu'il soit averti, que cela peut imposer des limites en ce qui concerne le nombre d'éléments / arguments est acceptable, selon votre mise en œuvre du schéma):
(apply max '(3 4 2 1 78 2 1))
En général, si le nombre d'éléments n'est pas connu pour être petit, il pourrait être plus sûr de le faire manuellement:
(define max* (list)
(if (null? list) (negative-infinity)
(let loop ((list (cdr list)) (best (car list)))
(if (null? list) best (loop (cdr list) (max best (car list)))))))
Autres conseils
Utilisation d'appliquer se traduit essentiellement par la course (max 3 4 2 1 78 2 1)
Mais le nombre d'arguments qu'une procédure peut être adopté n'est pas infini sur certains systèmes. Pour max
, vous pouvez profiter de sa commutativité en utilisant le pli:
(fold-left max -inf.0 '(3 4 2 1 78 2 1))
Vous pouvez écrire une procédure qui compare le premier élément au second,
(define (largestele lst)
(if (null? (cdr lst))
(car lst)
(if (> (car lst) (cadr lst))
(largestele (cons (car lst) (cddr lst)))
(largestele (cdr lst)))))