n'est-il pas possible de traiter des fonctions dans le schéma comme une autre liste?
Fondamentalement, ce que je veux faire est quelque chose comme ceci: p>
(define (foo) "hello") (cdr foo) ; or similar, should return the list ((foo) "hello")
7 Réponses :
'FOO évalue à un symbole, vous ne pouvez pas prendre le CDR d'un symbole. P>
Ce que vous voudrez peut-être faire est (CDR FOO), mais cela ne fonctionne pas. La valeur d'une FOO est une procédure, pas une liste. P>
Oui; Je demande pourquoi i> je ne peux pas cdr une procédure.
Parce que la procédure n'est pas une liste. Vous pouvez uniquement les listes de CDR. La procédure pourrait être un tas d'instructions de la machine.
Ce n'est pas une réponse très satisfaisante - vous pouvez dire la même chose pour les listes, car vous ne savez pas vraiment comment les listes sont représentées en mémoire.
@CSL: CDR est défini pour les consoles et les listes. Rien de plus. Donc, CDR fonctionne pour les listes. Étant donné qu'une procédure n'est pas une liste, cela ne fonctionnera pas. Une procédure est autre chose.
vous peut être en mesure d'accéder à la fonction sous forme de liste à l'aide de pp code> ou
jolie-impression code>. Cela dit, vous devrez peut-être également exécuter votre code dans le mode de débogage. C'est toute la mise en œuvre très dépend toutefois. Je sais que cela peut travailler en gambit-c. P>
Votre comparer ceci à p> Définir le formulaire code> n'est pas une fonction mais une définition de fonction. En fait, c'est un raccourci pour
lambda code> peut être considéré comme une "invocation du compilateur". Dans ce cas, il produit une fonction qui retourne cette chaîne.
Définir code> lie cette fonction au symbole
'FOO code>. p>
(define foo "hello")
Excellente explication! Ne serait-il pas possible de créer ma propre forme de définition qui a compilé le code (via EVAL) et conservé la source? Ce serait utile.
Comme ce que l'autre suggère, vous devriez consulter votre environnement de programmation et voir (Définir (foo) ...) code> produit un objet compilé, et c'est une valeur em> - A procédure em>.
Vous ne pouvez pas itérer sur elle parce que ce n'est pas un s-expression em>. p>
S'il a des installations pour de telles tâches. P>
Le régime MIT a la capacité de le faire. (Si vous voulez vraiment, commenter sur ceci et je vais vous donner le code. Je devais trouver des fonctions sans papiers pour y arriver.) P>
Cependant, ce n'est pas dans la définition de la langue du régime, les implémentations n'ont donc pas à le permettre. La raison en est que, afin de faire des fonctions plus rapides, une bonne mise en œuvre du système modifiera les fonctions. Cela signifie à la fois les réécriter dans une langue différente (code de machine ou quelque chose de assez bas) et en supprimant les bits dont vous n'avez pas besoin - par exemple, la fonction Bien sûr, vous pouvez toujours garder les listes sans trop de problèmes, même avec toutes ces choses. Mais si vous avez essayé de em> modifier em> les listes, comment fonctionnerait-il? P>
(encore une fois, vous pourriez le faire fonctionner. Ce serait simplement plus de travail pour les exécutants, et comme il n'est généralement pas utilisé dans les programmes, la plupart des gens ne veulent probablement pas déranger.) p> + code> doit vérifier généralement si sa Les arguments sont des nombres et, le cas échéant, quel type de chiffres, mais si votre fonction est une boucle qui appelle
+ code>, vous pouvez simplement vérifier une fois au début et rendre la fonction beaucoup plus rapidement. p>
Bien sûr, je serais heureux d'obtenir le code. Peut-être postez-le en ligne (gist / pastebin)?
Je suis désolé - je pensais que je l'avais, mais je viens de regarder et je ne pouvais pas le trouver. Je l'ai fait en téléchargeant essentiellement des sources de MIT-Scheme, trouvant comment ils représentaient des procédures interprétées et en utilisant quelques fonctions dans ce fichier qui devraient être disponibles sur le repli, même si elles n'auraient probablement pas dû être.
J'ai souvent voulu pouvoir faire la même chose CSL. Vous trouverez ci-dessous un exemple rapide de la façon dont vous pourriez faire de cela dans Mzscheme.
drscheme 4.2 p> sorties: p>
Quelqu'un sait-il comment le faire dans d'autres mises en œuvre du régime?
Selon la mise en œuvre, je pense que vous pouvez faire quelque chose de similaire avec Defmacro ou des fermetures syntatiques. J'aimerais avoir l'équivalent macro de (Définir Blah (Lambda ...)) (Définir Blah (Lambda (...) Nouveau code (bla ...))), mais je n'ai pas trouvé de mise en œuvre du système qui permet pour un moyen simple de faire cela.
en Guile, P>
Guile> (Définir (FOO Bar) 'Baz)
Guile> (Procédure-Source Foo)
(Lambda (bar) (citation Baz))
Guile> (CDR (Source de procédure FOO))
((bar) (citation Baz))
Guile> p> blockQuote>
J'ai également trouvé des notes intéressantes: CS.Brown.edu/ Pipetermail / PlT-Scheme / 2006-Mai / 013052.html