2016-06-17 1 views

Répondre

3

Voici quelques listes:

L'indice de toutes les fonctions dans la documentation Racket:

http://docs.racket-lang.org/reference/doc-index.html

Une antisèche:

https://docs.racket-lang.org/racket-cheat/index.html?q=cheatsheet

Maintenant "primitive" dans le contexte de Racket signifie toutes les fonctions implémentées dans la machine virtuelle (ie les implémentations implémentées dans Racket sont exclues), donc une troisième liste pourrait aussi être pertinente.

Ce petit programme génère une liste de toutes les primitives:

#lang racket 

(define primitive-table 
    (let ([ns (make-base-empty-namespace)]) ; make namespace with racket/base attached 
    (parameterize ([current-namespace ns]) 
     (namespace-require ''#%kernel)  ; import all primitives 
     (namespace-require ''#%unsafe) 
     (namespace-require ''#%flfxnum) 
     (namespace-require ''#%extfl) 
     (namespace-require ''#%futures) 
     (namespace-require ''#%foreign) 

     (namespace-mapped-symbols)))) 

primitive-table 

Sur ma version de Racket il y a 1487 primitives.

+0

Merci, c'est exactement ce que je cherchais. Mais juste par curiosité, pourquoi la raquette a-t-elle besoin de tant de primitives? Certaines d'entre elles ne pourraient-elles pas être implémentées par une raquette utilisant d'autres primitives? – Vityou

+0

La dernière liste comportera des procédures de niveau et des formulaires spéciaux qui ne sont pas utilisés par les utilisateurs finaux car leur niveau est inférieur à celui des primitives de schéma types. Typiquement, les "primitives" sont des procédures enveloppées et une syntaxe qui les utilise. Vous pouvez le voir dans l'EDI en faisant un clic droit sur les symboles et en sélectionnant "Ouvrir le fichier de définition". par exemple. 'map' n'utilise généralement pas la primitive dans les cas les plus courants. La même chose peut être dite pour clojure et probablement aussi python. – Sylwester

+0

@Vityou Racket n'en a pas * besoin * autant. Que le nombre est si grand est dû à de multiples raisons. Tout d'abord, certaines fonctions * doivent * être des primitives (c'est-à-dire des fonctions C). D'autres fonctions pourraient être implémentées en rack par dessus d'autres primitives mais ne le sont pas. Il y a quelques années, lorsque Racket n'avait pas de compilateur JIT, une primitive implémentée en C était souvent plus rapide qu'une implémentation de raquette. Par conséquent, de nombreuses fonctions ont été implémentées en C. Au cours des dernières années, il y a eu un mouvement des implémentations de C-primitives aux implémentations de Racket. Des développements récents tels que Typed Racket et un nouveau compilateur JIT implémenté dans Racket – soegaard