Je suis assez nouveau à lisp mais j'ai joué avec ça. J'ai plusieurs problèmes dont j'ai besoin de clarifier. Voici ma petite macro que j'ai définie. Je me demande simplement comment je peux spécifier la fonction à utiliser dans le corps dynamiquement? Dites si je veux utiliser la fonction "+" ou "-" au lieu de "eq", ou même une autre fonction que j'ai définie? Comme je pensais qu'il serait possible de passer le nom de la fonction en paramètre mais cela ne marche évidemment pas. Je reçois également des erreurs variables non liées lorsque je modifie la liste (requête) qui est passée.Comment appeler une fonction particulière en fonction de la variable transmise?
Répondre
funcall est la réponse! Décidé de simplement le transmettre et utiliser funcall pour évaluer la fonction.
Dans le corps de la macro, vous pouvez utiliser toute la bibliothèque d'exécution de Lisp pour générer l'extension réelle. Ainsi, par exemple:
(defmacro transform (query &key (test 'eq))
(let ((row-var (gensym)))
`(lambda (,row-var)
(,test (nth 1 ,query) (nth 0 (nth 0 ,row-var))))))
Cette version utilise la « backtick » au lieu d'une simple apostrophe, qui permet de « unquoting » des formes dans le corps, permettant ainsi l'inclusion des formes générées dans le résultat.
Vous pouvez utiliser cette macro comme votre version originale:
(transform (...))
ou (passer d'une fonction de test explicite):
(transform (...) :test equal)
Notez que vous ne devriez pas utiliser des symboles simples comme noms de variables extensions de macro (comme votre ligne argument à l'expression lambda généré) car cela pourrait accidentellement interférer avec l'utilisation de ce symbole sur le site de l'utilisation de votre macr o. Vous ne savez tout simplement pas quand vous écrivez votre macro, il y aura une variable appelée ligne quelque part lorsque votre macro est utilisée, et si elle n'est pas déjà utilisée dans la requête formulaire/expression. Votre définition originale "capture" la variable, en modifiant éventuellement la signification de ce que fait requête.
- 1. Comment appeler une fonction dynamiquement en fonction d'un type d'objet
- 2. comment appeler une autre fonction en javascript?
- 3. Comment appeler une fonction Javascript en utilisant la valeur d'une variable chaîne?
- 4. Comment appeler la fonction vb de javascript
- 5. Comment appeler une fonction juste avant de revenir en C?
- 6. Comment puis-je appeler une fonction JQuery?
- 7. Comment appeler une fonction javascript sur onrowcommand?
- 8. Comment appeler une fonction dans jquery?
- 9. Comment appeler la fonction d'origine de la fonction surchargée dans une catégorie?
- 10. jquery - étendue de la fonction transmise à $(). Grep
- 11. Comment appeler la fonction jquery personnalisée onClick
- 12. Comment puis-je appeler une fonction masquée en C++?
- 13. Comment appeler une fonction varargs avec un tableau en ActionScript?
- 14. Comment puis-je appeler Jquery Fonction De Autre fonction JavaScript
- 15. Problème appeler une fonction js de php
- 16. variable non transmise?
- 17. autre condition de ne pas appeler une fonction en PHP
- 18. Problème de variable "this" remplacé ou comment appeler une fonction membre?
- 19. Appeler une fonction avec une liste d'arguments en python
- 20. appeler une fonction VB.net depuis javascript
- 21. Comment appeler la fonction python2.5 de x86asm/x64asm?
- 22. Comment appeler une fonction à partir de données binaires
- 23. Comment appeler la fonction de changement de jquery datepicker surelect
- 24. C# Description de la variable fonction
- 25. Comment appeler la fonction surchargée correcte lors de l'exécution?
- 26. appeler fancybox en utilisant la fonction jquery .click
- 27. En utilisant une variable pour représenter une fonction dans C
- 28. Fonction PHP et héritage variable
- 29. Affectation à l'intérieur de la fonction transmise en tant que pointeur?
- 30. PHP call_user_func vs simplement appeler la fonction
Avez-vous une idée pourquoi cela devrait être une macro et non une fonction? –
Je l'ai changé en fonction et il semble fonctionner correctement. –