web-dev-qa-db-fra.com

Qu'est-ce que '(apostrophe) dans LISP / Scheme?

Je suis le jour 1 heure 1 d'enseigner moi-même Scheme. Inutile de dire que je ne comprends rien. Je lis donc The Little Schemer et j'utilise cette chose:

http://sisc-scheme.org/sisc-online.php

en tant qu'interprète.

Je dois utiliser ' in par exemple

(atom? 'turkey)

pour éviter une erreur "variable non définie". Le ', selon le livre, est une chose LISP commune.

J'ai deux questions:

  1. L'interprète que j'ai mentionné ci-dessus est-il bon? Pouvez-vous en recommander un autre? J'en ai besoin d'un qui ira bien avec The Little Schemer .

  2. Quel est '?

57
jjerms

La forme 'foo est simplement un moyen plus rapide de taper le formulaire spécial

(quote foo)

c'est-à-dire "n'évaluez pas le nom foo et remplacez-le par sa valeur; je veux vraiment dire le nom foo".

Je pense que SISC est parfaitement adapté pour explorer les exercices dans TLS.

55

Vous devez comprendre les règles d'évaluation de base de Scheme.

Premier:

(atom? 'turkey)

La liste est une application de fonction, donc atom? est évalué en fonction. 'turkey est une notation abrégée pour (quote turkey). Évaluer (quote turkey) donne le symbole turkey.

La fonction est ensuite appliquée au symbole turkey et une valeur de retour est calculée.

Deuxième

(atom? turkey)

Encore une fois, nous avons une application de fonction et atom? est évalué en fonction. Cette fois, turkey est une variable. L'évaluation de turkey donne la valeur qui lui est liée - quelle qu'elle soit.

La fonction est donc appliquée à la valeur de la variable turkey.

Résumé

turkey est une variable qui est évaluée à sa valeur. 'turkey est (quote turkey), qui est évalué au symbole turkey.

Scheme réutilise les s-expressions et construit ses programmes à partir des s-expressions. Cela conduit au problème que parfois turkey devrait être une variable et parfois ce devrait être le symbole. C'est un peu déroutant pour le débutant. Après un certain temps, vous verrez le pouvoir derrière.

26
Rainer Joswig

SISC est bon, mais un exécuteur de schéma en ligne encore plus léger est http://codepad.org . Ce n'est en fait pas un REPL en ce qu'il n'est pas interactif, mais il est assez proche. Le code que vous soumettez est exécuté sur le serveur au lieu d'utiliser une applet de navigateur. Et vous pouvez partager le code que vous exécutez par URL courte.

La page à propos du codepad indique qu'elle utilise "MzScheme v372 [cgc]".

J'utilise codepad pour toutes sortes de tests rapides d'extraits de code (y compris pour tester des échantillons de code pour SO réponses!).

Pour la syntaxe des guillemets, la différence peut être vue en utilisant un code comme celui-ci:

(let ((x 5))
  (display x) (newline)
  (display 'x) (newline))

Cela affiche:

 5 
 X 

Dans le premier cas, x est évalué et passé à display, qui imprime 5. Dans le second cas, le symbole x (ce qui n'est pas la même chose qu'une chaîne de caractères) est passé à display, qui affiche le nom du symbole.

14
Greg Hewgill

Raccourci pour (quote ...), ' Transforme le code en données.

stuff est un symbole, cela signifie qu'il peut s'agir du nom d'une variable ou du nom d'une fonction, etc.
'stuff Vous donne le symbole "stuff" lui-même.

(dostuff "on" those 4 :parameters) Une fois évalué, exécuterait la fonction dostuff avec quatre paramètres: chaîne, contenu de la variable ceux-ci, nombre et mot-clé.
'(dostuff "on" those 4 :parameters) lors de l'évaluation retournerait le code ci-dessus, qui, une fois évalué, exécuterait à son tour la fonction dostuff avec ces quatre paramètres.

Par exemple: Exécutez '''somecode, Il renvoie ''somecode. Exécutez ''somecode, Il renvoie 'somecode. Exécutez 'somecode, Il renvoie somecode. Exécutez somecode, et ... eh bien ... somecode s'exécutera.

Vous pouvez dire que ' Est un peu comme l'opposé de (eval..).

(eval (eval (eval '''(print "hello")))) Afficherait "Bonjour".
(eval (eval (eval ''''(print "hello"))) - remarquez un de plus ' Puis eval - n'imprimerait rien, mais il renverrait le code (print "hello") Lui-même !!

Sauf que les lispers ont tendance à appeler ce code retourné (et parfois même du code manuscrit) "liste" au lieu de "code", pour des raisons qui saignent de façon évidente lorsque vous creusez un peu plus profondément. Bonne chance :)

7
enrey
  1. Je vous suggère de passer à un meilleur environnement comme Schéma PLT , qui a un IDE, un débogueur et de nombreuses bibliothèques. Au fur et à mesure que vous avancez et commencez à écrire des programmes plus importants, vous en aurez besoin.

  2. Le caractère guillemet simple est du sucre syntaxique pour l'expression "quote", donc 'turkey est le même que (quote turkey). Fondamentalement, ce que "devis" fait est de désactiver l'évaluateur Scheme. En d'autres termes, "quote" renvoie l'expression, textuellement. S'il n'y avait pas de "devis", alors Scheme essaierait d'évaluer "la dinde" dans l'environnement actuel. Ce n'est pas une chose LISP commune, mais une chose LISP. LISP et Scheme communs sont deux dialectes de LISP. Les utilisations de "devis" sont expliquées dans tous les tutoriels/livres LISP. Voir également les réponses à cette question .

4
Vijay Mathew

Le caractère guillemet simple est une façon abrégée de dire (quote foo) où quote est le formulaire pour retourner juste foo sans l'évaluer.

Une chose à retenir dans Scheme ou dans n'importe quel LISP est que tout est évalué par défaut. Donc, dans les cas où vous ne voulez pas évaluer, vous avez besoin d'un moyen de vous asseoir.

Citer quelque chose fait exactement cela et le guillemet simple nécessite simplement moins de frappe et conduit à un code moins détaillé.

4
Brad Lucas

Si vous cherchez le meilleur IDE pour scheme alors optez pour Dr Racket. Mais au début Dr Racket la première ligne doit être #lang scheme puisque Dr Racket contient de nombreuses langues, nous avons explicitement mentionné la langue que nous allons utiliser.

Lorsque nous voulons passer un argument lui-même au lieu de passer la valeur de l'argument, nous utilisons alors quote. Il est principalement lié à la procédure qui se déroule lors de l'utilisation de listes, de paires et d'atomes qui ne sont pas disponibles dans le langage de programmation C (la plupart des gens commencent à programmer en utilisant la programmation C, donc nous sommes confus) et je suppose que vous pouvez comprendre ce code.

(define atom?              ; defining a procedure atom?
(lambda (x)              ; which as one argument x
(and (not (null? x)) (not(pair? x) )))) ; checks if the argument is atom or not
(atom? '(a b c)) ; since it is a list it is false #f

La dernière ligne (atom? 'Abc) passe abc comme à la procédure pour vérifier si abc est un atom ou pas, mais quand vous passez (atom? Abc) alors il vérifie la valeur de abc et lui transmet la valeur. Depuis, nous ne lui avons fourni aucune valeur

2
vardin