0
votes

Comment améliorer $ (appelez $ (eval $ (appel))) paradigme à l'aide de faire?

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: xxx pré>

maintenant, au lieu de leur dire de faire ce p>

$ (Eval $ (fonction d'appel) > argument )) code> p>

Je peux leur dire de faire ce p>

$ (fonction d'appel2, code> argument ) p>

qui est plus simple. p>

Ceci a fonctionné comme un charme jusqu'à ce que quelqu'un ait décidé d'utiliser .export_all_variables code>, afin que nous ayons le code total (SSCCE) ressemblent à ceci: p> xxx

Maintenant quand vous CARE CODE> Ceci, vous obtenez: P>

Makefile:5: *** prerequisites cannot be defined in recipes.  Stop.


6 commentaires

Mon opinion personnelle est que .export_all_variables 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 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 , c'est un problème d'expansion. Dis, si vous avez var = $ (info hello) , il imprimera "bonjour" à l'écran avant d'exécuter chaque recette.


@Matt ah oui, merci Matt.


3 Réponses :


-1
votes

dans mon système de construction non récursif Prorab I Utilisateur eval , mais sans appelez .

Je passe les paramètres via _ -Préfixed variables, quelque chose comme ceci: xxx donc , eval est toujours là, mais insérer une variable au lieu de appel le rend plus court et que l'utilisateur n'a pas à se rappeler quel argument de l'appel Quoi, parce que ceci _ variables ont des noms descriptifs.


2 commentaires

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 se pose seulement après avoir masqué eval de l'utilisateur à l'intérieur de Fonction2 , donc j'ai suggéré un autre approche sans cacher le eval mais plus convivial que $ (eval $ (appel ..., ..., ..., ...)) . Mais s'avère que le problème se pose pas à cause de cela.



1
votes

Mon opinion personnelle est que .export_all_variables 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 lors de l'expansion de variables pour l'exportation.


0 commentaires

1
votes

Utilisez Fonction Nexport Fonction2 pour vous débarrasser de cette erreur.

Pourtant, je dois accepter @madscientist, que .export_all_variables est diabolique.

Il effectue de force une expansion de toutes les variables récursives avant d'exécuter chaque recette , elle pourrait donc facilement casser tout système de construction compliqué.

imo, il pourrait être utile d'avoir un moyen d'arrêter toute expansion de variables automatiques exportées.

La seule consolation est que presque personne n'utilise que .export_all_variables chose.


6 commentaires

Je suppose que si vous activez .export_all_variables 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 , ce qui est injustifié. Je pense que shell 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 et info ne peuvent pas être évaluées, mais notdir etc. . serait, etc. soupir


@Madscientiste En fait, je pensais à une option de ligne de commande. Sorte de -x pour exporter tout; -x pour exporter tout non excenté; et si nécessaire, il peut être changé dans Makefile en modifiant MakeFlags . 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 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 ): 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 $$ et ainsi de suite. Mais le prix est qu'il n'y aurait plus de choses d'évaluation amusante.