J'écris des maquillages généraux et des fonctions pour la commodité des utilisateurs, ils doivent donc avoir les interfaces les plus simples possibles. Lorsque vous définissez des fonctions, j'utilise ce paradigme: maintenant, au lieu de leur dire de faire ce p> Je peux leur dire de faire ce p> qui est plus simple. p> Ceci a fonctionné comme un charme jusqu'à ce que quelqu'un ait décidé d'utiliser Maintenant quand vous $ (Eval $ (fonction d'appel) > argument
)) code> p>
$ (fonction d'appel2, code> argument
) p>
.export_all_variables code>, afin que nous ayons le code total (SSCCE) ressemblent à ceci: p>
CARE CODE> Ceci, vous obtenez: P>
Makefile:5: *** prerequisites cannot be defined in recipes. Stop.
3 Réponses :
dans mon système de construction non récursif Prorab I Utilisateur Je passe les paramètres via eval code>, mais sans
appelez code>.
_ code> -Préfixed variables, quelque chose comme ceci: p>
eval code> est toujours là, mais insérer une variable au lieu de
appel code> le rend plus court et que l'utilisateur n'a pas à se rappeler quel argument de l'appel code> Quoi, parce que
ceci _ code> variables ont des noms descriptifs. p> p>
Je ne comprends pas votre réponse ... On dirait que vous n'avez pas lu ma question ... Si je fais ce que vous suggérez, le même problème se produit toujours, j'ai vérifié. Probablement parce que votre réponse semble avoir rien à faire avec ma question, je suis désolé de dire.
@Marmarkgaleck de votre question J'ai compris que le problème avec .export_all_variables code> se pose seulement après avoir masqué
eval code> de l'utilisateur à l'intérieur de
Fonction2 code>, donc j'ai suggéré un autre approche sans cacher le
eval code> mais plus convivial que
$ (eval $ (appel ..., ..., ..., ...)) code>. Mais s'avère que le problème se pose pas à cause de cela.
Mon opinion personnelle est que .export_all_variables code> est une fonctionnalité diabolique et ne doit pas être utilisée. Cependant, je pense que cela vaut la peine d'améliorer la demande de GNU: il ne faut pas exécuter
eval code> lors de l'expansion de variables pour l'exportation. P>
Utilisez Pourtant, je dois accepter @madscientist, que Il effectue de force une expansion de imo, il pourrait être utile d'avoir un moyen d'arrêter La seule consolation est que presque personne n'utilise que Fonction Nexport Fonction2 CODE> pour vous débarrasser de cette erreur. P>
.export_all_variables code> est diabolique. p>
.export_all_variables code> chose. P>
Je suppose que si vous activez .export_all_variables code> Il n'est pas nécessaire d'étendre les variables avant de ne pas entrer dans l'environnement, car toutes les variables référencées par des valeurs variables récursives seront également placées dans l'environnement et ainsi être disponible dans la sous-marque. Je suppose que c'est quelque chose à considérer. Je préférerais vraiment sortir cette fonctionnalité mais ...
@Madscientist, il devrait fonctionner sans douleur avec (sous) faire. Mais pas avec la coquille.
Vrai. Je suppose que cela dépend de la raison pour laquelle vous exportez. Je ne suis pas vraiment sûr de savoir comment (ou si?) Il y a plus que nous puissions faire d'autres que pour désactiver eval code>, ce qui est injustifié. Je pense que
shell code> est également désactivé pour éviter les récursions. Mais qu'en est-il des autres fonctions? Peut-être que faire devrait les considérer à la base de cas-base: des choses comme
erreur code> et
info code> ne peuvent pas être évaluées, mais
notdir code> etc. . serait, etc. soupir i>
@Madscientiste En fait, je pensais à une option de ligne de commande. Sorte de -x code> pour exporter tout;
-x code> pour exporter tout non excenté; et si nécessaire, il peut être changé dans Makefile en modifiant
MakeFlags code>. Laissez l'utilisateur être responsable de toutes les erreurs pouvant survenir.
@Madscientistist Oh, la raison pour laquelle "ils" exporte tout, est bien sûr en raison de la commodité (au détriment de la bonne conception, bien sûr) - ils veulent tout faire "Global", en présence d'une marque récursive. Vous définissez une variable une fois, vous voulez l'avoir visible partout (en aval). Mais je dois accueillir cela - en tant que personne construite, je suis censé gérer tout ce que les développeurs se jettent contre moi et que je veux, pas pour moi de juger s'il peut être stupide ou non.
@Marmarkgaleck, alors vous devez coder de manière défensive et écrire une tonne de Nexport code> S pour masquer tous les internes du monde extérieur. Ça craint, mais c'est assez courant. Mais parlant d'une bonne conception, l'exportation complète serait une bonne décision pour un outil avec un design différent (pensant à
MK code>): Si faire fonctionnerait sur le même ensemble de variables et de la même manière que Shell (même syntaxe, sans récursion, etc.), il n'y aurait donc aucune raison de pré-traiter des recettes. Pas plus stupide
$$ code> et ainsi de suite. Mais le prix est qu'il n'y aurait plus de choses d'évaluation amusante.
Mon opinion personnelle est que
.export_all_variables code> est une fonctionnalité diabolique et ne doit pas être utilisée. Cependant, je pense que cela vaut la peine d'améliorer la demande de GNU: il ne faut pas exécuter
eval code> lors de l'expansion de variables pour l'exportation.
@Madscientiste merci! J'espérais juste que tu fournirais ton opinion. Si vous faites cela comme une réponse, je l'accepterai.
@Madscientist OK, je viens de déposer une demande d'amélioration. Merci encore!
Tout comme Sidenote, avez-vous déjà rencontré GMTT ?
Note mineure: ce n'est pas simplement sur
eval code>, c'est un problème d'expansion. Dis, si vous avez
var = $ (info hello) code>, il imprimera "bonjour" à l'écran avant d'exécuter chaque recette.
@Matt ah oui, merci Matt.