8
votes

Traversing Scheme fonction comme une liste

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")


1 commentaires

J'ai également trouvé des notes intéressantes: CS.Brown.edu/ Pipetermail / PlT-Scheme / 2006-Mai / 013052.html


7 Réponses :


1
votes

'FOO évalue à un symbole, vous ne pouvez pas prendre le CDR d'un symbole.

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.


4 commentaires

Oui; Je demande pourquoi 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.



1
votes

vous peut être en mesure d'accéder à la fonction sous forme de liste à l'aide de pp ou jolie-impression . 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.


0 commentaires

2
votes

Votre Définir le formulaire code> n'est pas une fonction mais une définition de fonction. En fait, c'est un raccourci pour xxx pré>

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>

comparer ceci à p>

(define foo "hello")


1 commentaires

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.



1
votes

(Définir (foo) ...) produit un objet compilé, et c'est une valeur - A procédure .
Vous ne pouvez pas itérer sur elle parce que ce n'est pas un s-expression .

Comme ce que l'autre suggère, vous devriez consulter votre environnement de programmation et voir
S'il a des installations pour de telles tâches.


0 commentaires

2
votes

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.)

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 + 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 + , vous pouvez simplement vérifier une fois au début et rendre la fonction beaucoup plus rapidement.

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 modifier les listes, comment fonctionnerait-il?

(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.)


2 commentaires

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.



3
votes

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 xxx

sorties: xxx


2 commentaires

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.



2
votes

en Guile,

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>


0 commentaires