2010-05-30 10 views
2

Je souhaite voir si je peux mapper des champs de structure de raquette à des colonnes d'un DB.Raquette: extraction des identifiants de champ des structures

J'ai compris comment extraire les fonctions accesseurs de structures dans le schéma de PLT en utilisant la quatrième valeur de retour:

(struct-type-info) 

Cependant, les indices de la procédure de retour dans le struct en utilisant un entier. Y a-t-il un moyen de savoir quels étaient les noms de champs au moment de la définition? En regardant la documentation, il semble que cette information soit "oubliée" après la définition de la structure et n'existe que via les fonctions d'accesseur: (<id>-<field-id> s).

donc je peux penser à deux solutions possibles:

  1. Rechercher les symboles d'espace de noms pour ceux qui commencent par mon nom struct (beurk);
  2. Définissez une macro define-struct personnalisée qui capture la séquence ordonnée de noms de champs dans un hachage défini par struct name (eek).

Répondre

2

La réponse dépend de ce que vous voulez faire avec cette information. Le fait est qu'il n'est pas conservé dans le runtime - c'est comme les bindings dans les fonctions qui n'existent pas à l'exécution. Mais ils existent au niveau de la syntaxe (= compile-time). Par exemple, cet exemple stupide va vous montrer la valeur qui est maintenue au niveau de la syntaxe qui contient la forme de la structure:

> (define-struct foo (x y)) 
> (define-syntax x (begin (syntax-local-value #'foo) 1)) 
> (define-syntax x (begin (printf ">>> ~s\n" (syntax-local-value #'foo)) 1)) 
>>> #<checked-struct-info> 

Ce n'est pas montrer beaucoup, bien sûr, mais cela devrait être un bon point de départ (vous pouvez regarder pour struct-info dans les docs et dans le code). Mais ce n'est peut-être pas ce que vous cherchez, puisque cette information existe seulement au niveau de la syntaxe. Si vous voulez quelque chose qui est là au moment de l'exécution, alors peut-être mieux d'utiliser des alists ou des tables de hachage?

MISE À JOUR (je l'ai effleuré trop rapidement sur votre question avant):

Pour mapper une struct dans une ligne de table de DB, vous aurez besoin de plus de choses définies: au moins maintenir la DB et les champs reposer pour, éventuellement une connexion DB ouverte pour stocker des valeurs dans ou lire des valeurs à partir de. Donc, il me semble que la meilleure façon de le faire est via une macro de toute façon - cette macro s'étendrait à une utilisation de define-struct avec tout ce que vous auriez besoin de garder.

+0

C'est logique, merci beaucoup. –

3

Je pense que quelque chose dans le sens de 2. est la bonne approche (define-struct a BEAUCOUP de potentiomètres et beaucoup n'ont pas de sens pour cela) mais au lieu de faire un hash, il suffit de faire fonctionner votre macro qui manipulent la base de données directement. Et la bibliothèque syntax/struct peut vous aider à faire l'analyse de la forme define-struct.