/ / (list lambda lambda) - syntaxe, schéma

(list lambda lambda) - syntaxe, schéma

Quel genre de chose vais-je obtenir si je le fais?

(car (list lambda lambda))

Je pensais que j'aurais lambda retour, ce qui signifie que je pourrais faire

(define my_lambda (car (list lambda lambda)))
(define foo (my_lambda (n) (+ n n)))

Mais ça n'a pas marché! Merci,

Réponses:

5 pour la réponse № 1

lambda est une forme spéciale (c'est-à-dire que les règles d'évaluation standard ne lui sont pas applicables), qui fait partie des principales ne pas un symbole ou un autre type de valeur pouvant être affecté à une variable.

En répondant à votre question, le "genre de chose" que vous obtiendrez après avoir évalué l'expression (list lambda) dépendra de l'interpréteur de Scheme que vous utilisez, mais le plus souvent, vous obtiendrez une erreur. Par exemple, DrRacket se plaint comme ceci:

lambda: bad syntax in: lambda

2 pour la réponse № 2

En quelques sortes, lambda ne existe pas à l'exécution (bien sûr, le les fonctions créées par des instructions lambda existent, mais cela "est différent, elles ne sont pas" lambda lui-même).

La raison en est que l'instruction lambda manipule d'autres choses qui n'existent pas à l'exécution, en particulier, il change la signification des noms de variables (dans votre exemple, n).

Pour répondre à votre question sur quel genre de chose lambda est, la réponse habituelle est "syntaxe". Heureusement, Scheme fournit un mécanisme permettant d'abstraire sur la syntaxe: les macros. Les macros peuvent être abstraites sur des entités uniquement compilables, comme les noms de variables et les lambdas et autres macros. Donc, vous pourriez écrire (dans la REPL de la raquette, dans ce cas):

> (define-syntax-rule (mylambda (x ...) body)
(lambda (x ...) body))
> (define foo (mylambda (n) (+ n n)))
> (foo 71)
142

Il existe plusieurs systèmes pour définir les macros Scheme; la syntax-rules système utilise ...s d'une manière inhabituelle, mais finalement très intuitive. Il est également possible de définir des macros en écrivant du code Scheme qui émet un Scheme, ce qui implique un peu plus de complications.