2009-09-21 5 views
3

Je suis familier avec Common Lisp et j'essaie d'apprendre quelques Scheme, donc j'ai essayé de comprendre comment j'utiliserais Scheme pour les choses que je code habituellement dans Common Lisp.Comment savoir si la valeur d'une variable est un symbole lié à une procédure dans Scheme?

En Common Lisp, il y a fboundp, qui me dit si un symbole (la valeur d'une variable) est lié à une fonction. Donc, je voudrais faire ceci:

(let ((s (read))) 
    (if (fboundp s) 
     (apply (symbol-function s) args) 
     (error ...))) 

Est-ce possible dans le schéma? J'ai essayé de trouver cela dans les spécifications de R6RS mais je n'ai rien trouvé de similaire.

Répondre

5

De cette façon?

  1. vérifier si elle est un symbole
  2. évaluer le symbole à l'aide EVAL pour obtenir sa valeur
  3. vérifier si le résultat est une procédure avec PROCEDURE?
+1

HEY, ça marche! :-) Et après avoir stocké le résultat dans une variable p, je peux simplement l'utiliser comme une procédure, comme dans "(p ag1 arg2)". Merci! – Jay

+0

ne fonctionne pas en CL (SBCL), car _eval_ appelé sur un symbole non lié donne une erreur. En CL on devrait utiliser _boundp_ – dbow

+1

@dbow la question déjà posée que dans Common Lisp vous utilisez boundp et fboundp; la question était de savoir comment le faire dans * Scheme *, et cette réponse lui répond directement – xdavidliu

4

Dans le schéma, les fonctions ne sont pas liées à des symboles comme s'ils étaient en Common Lisp. Si vous avez besoin de savoir, si une valeur est en fait une procédure, vous pouvez utiliser le procedure? prédicat:

(if (procedure? s) (do-something-with s) (do-something-else)) 

Il n'y a aucun moyen direct dans le schéma portable pour atteindre, ce que votre code d'exemple veut faire, comme symboles Les schémas sont simplement des sortes de chaînes unifiées, dépourvues de slots de valeur/fonction/plist de Common Lisp.

Vous pouvez essayer quelque chose comme:

(define function-table (list `(car ,car) `(cdr ,cdr) `(cons ,cons) `(display ,display))) 

(let* ((s (read)) 
     (f (cond ((assq s function-table) => cadr) 
       (else (error "undefined function"))))) 
    (apply f args)) 

à savoir, définir votre propre cartographie des fonctions "bonnes". Cela aurait l'avantage, que vous pouvez limiter l'ensemble de la fonction à seulement "sûr", ou quoi que ce soit.

+0

"Cela aurait l'avantage, que vous pouvez limiter l'ensemble de la fonction à seulement" sûr ", ou quoi que ce soit." - OK, mais l'idée n'était pas en fait de lister toutes les fonctions. Ecrire un nouveau, et il est disponible. Pour la sécurité, je peux m'assurer que toutes les fonctions appelées comme ceci sont dans un paquet spécifique. – Jay

+0

Package (dans le régime)? – Dirk

+0

@Dirk: Je voulais dire en Common Lisp. Je suppose que ce n'est pas possible dans Scheme. – Jay

Questions connexes