2017-10-12 10 views
-1

Je veux définir une fonctionnalité Common Lisp qui utilise certains mots/symboles ne sont pas connus à Lisp, par exemple ayant une telle fonction/macro:Présentation de nouveaux symboles dans la fonction Common Lisp/Macro

(my-func-or-macro lst key-word idx) 

qui retourne les articles dans la lstidx la JUSQU'A si le key-word est à et de la idx à la fin si la key-word est de.

donc en pratique, il devrait fonctionner comme:

(my-func-or-macro '(1 2 3 4 5 6) from 3) => '(4 5 6) 

et

(my-func-or-macro '(1 2 3 4 5 6) to 3) => '(1 2 3) 

Depuis macros n'évaluent pas leurs arguments, je pense que je devrais utiliser une macro qui ne se soucie pas from au sujet et to (notez que je ne veux pas passer des arguments entre guillemets comme 'from'to).

+3

Habituellement, vous utiliseriez des fonctions avec des arguments de mot-clé pour cela:: à partir d'un nd: à. –

+0

Ne pas oublier d'ajouter la question réelle. «Je veux ...» n'est pas une question. –

+0

Que vous demandez-vous exactement? Comment comparer des symboles dans différents paquets? – Sylwester

Répondre

2

Étant donné que chaque argument d'une fonction est évalué avant l'exécution de la fonction, vous avez besoin d'un symbole qui s'évalue lui-même.

De tels symboles font déjà partie du langage: tous les symboles du package spécial KEYWORD s'évaluent à eux-mêmes. Les symboles écrits avec un deux-points, e. g. :foo sont internés dans ce package.

également partie de la langue sont des arguments de mots clés qui utilisent ces mots-clés pour identifier les paramètres:

(defun my-func (list &key from) 
    (subseq list from)) 

(my-func '(0 1 2 3 4 5) :from 3) 
=> (3 4 5) 

Vous pouvez donner des valeurs par défaut à ces paramètres:

(defun my-func (list &key (from 0) (to (length list))) 
    (subseq list from to)) 

(my-func '(0 1 2 3 4 5) :from 3) 
=> (3 4 5) 

(my-func '(0 1 2 3 4 5) :to 3) 
=> (0 1 2) 

(my-func '(0 1 2 3 4 5) :from 1 :to 4) 
=> (1 2 3) 

arguments mots-clés peuvent être indiquées dans les ordre:

(my-func '(0 1 2 3 4 5) :to 4 :from 1) 
=> (1 2 3)