2009-01-21 5 views
2

J'essaie d'apprendre Scheme à partir du livre "The Little Schemer" en utilisant DrScheme sur un Macintosh. Cela commence par des choses comme "Quelle est la voiture de l où est l'argument (a b c)?"Affectation d'une liste d'atomes dans le schéma

Je comprends que la réponse à cette question est un, mais je ne suis pas en mesure de comprendre quoi écrire dans Dr Scheme pour "suivre". Une idée simple sur comment affecter à l comme> (def l ('a' b 'c))

me donne l'erreur: "appel de fonction: attendu un nom défini ou un nom d'opération primitif après une ouverture entre parenthèses, mais a trouvé quelque chose d'autre »

Répondre

4

Pour définir quelque chose:

(define <name> <value>) 

donc de définir l:

(define l '(a b c)) 

Ceci définit l comme la liste (a b c). Le guillemet simple cite ce qu'il y a après, qu'il s'agisse d'un symbole ou d'une liste, ce qui signifie qu'il n'est pas évalué mais lu tel quel. Vous ne pas, cependant, citez le nom que vous définissez à. Heureusement, c'est l'un des très petits nombres d'opérations dans Scheme où vous avez cette incohérence.

+0

Ceci fonctionne après que je change la langue choisie de "débutant l'étudiant" à "commençant l'étudiant avec des abréviations de liste". Merci. – Leonard

+1

J'utilise DrScheme un peu, mais les limites des étudiants sont tout simplement stupides. Au lieu de vous dire que vous utilisez une fonctionnalité plus avancée, cela génère une erreur. Ma suggestion serait d'éviter les trucs d'étudiant et d'utiliser simplement le schéma non abrégé. Utilisez Module et préface tous vos fichiers aveC#lang schéma –

+0

Euh, ça sonne bien mais je ne peux pas faire fonctionner ça. Je reçois le message d'erreur: standard-module-name-resolver: collection non trouvée: "scheme" dans l'un de: (# # ) – Leonard

1

Essayez ceci:

(define l '(a b c)) 

ici, la citation s'applique à l'ensemble de la liste (a b c).

+0

Message d'erreur:Def: nom n'est pas défini, pas un paramètre, et pas un nom primitif – Leonard

+0

Il est censé être "définir" pas "def", voir ma réponse pour plus d'infos: http://stackoverflow.com/questions/464057/ assigner une liste d'atomes dans le schéma # 464072 –

+0

euh, je suivais juste votre exemple. Changé pour 'définir'. –

1

Ou, il suffit d'utiliser

(car '(a b c)) 

Qu'est-ce que l'erreur vous dit est la suivante: lorsque le lecteur voit une liste, il veut traiter le premier élément de la liste en fonction. C'est ainsi que fonctionne (+ 1 2 3): il appelle la fonction +. (Strictement, il regarde le symbole '+ et trouve qu'il ya une fonction liée à celle, invoque alors cette fonction.)

Ainsi, lorsque vous tapez

(define l ('a 'b 'c)) 

il regarde la liste intérieure puis veut trouver une fonction. Au lieu de cela, il trouve le symbole nommé a. Comme il n'y a pas de fonction, vous obtenez l'erreur. Si, au contraire, vous tapez

(define l '(a b c)) 

que vous avez dit au lecteur via la citation qu'il est de traiter cela comme une liste sans essayer de l'interpréter.

Voici un exemple du schéma MIT sur un Mac:

1 ]=> (define li '(a b c)) 

;Value: li 

1 ]=> (car li) 

;Value: a 

1 ]=> (car '(a b c)) 

;Value: a 
+0

> alors veut trouver une fonction nommée un [...] Strictement parlant, ce n'est pas vrai. Même si vous aviez une fonction nommée a ce serait toujours une erreur car elle ne cherche pas la valeur a, mais tente d'utiliser le symbole a. C'est toujours une erreur d'essayer d'utiliser un symbole en tant qu'opérateur. –

+0

Assez vrai. il était tard. –

0

forme non abbraveted de

(define l '(a b c)) 

est

(define l (quote (a b c))) 

ou dans ce cas même ceci:

(define l (list 'a 'b 'c)) 

sans une partie de la "liste", il tente d'exécuter « un , évidemment

Questions connexes