; .EnTete "Le-Lisp (c) version 15.2" " " "Le fichier initial" ; .EnPied "startup.ll" "A-%" " " ; .Annexe A "Le Fichier Initial" ; ; .Centre "*****************************************************************" ; .Centre " Ce fichier est en lecture seule hors du projet ALE de l'INRIA. " ; .Centre " Il est maintenu par ILOG SA, 2 Avenue Gallie'ni, 94250 Gentilly " ; .Centre " (c) Le-Lisp est une marque de'pose'e de l'INRIA " ; .Centre "*****************************************************************" ; ; .Centre "$Header: startup.ll,v 4.26 89/01/11 20:37:01 nuyens Exp $" ; Il est ne'cessaire de charger ce fichier avant toute utilisation ; du syste`me Le-Lisp version 15.2 a` cause de la rede'finition de ; la boucle principale (toplevel). (if (>= (version) 15.2) (list "Version: " (version)) (error 'load 'erricf 'startup)) ;; Ces 2 fcts sont a modifier a` chaque distribution ce maintenance. (de subversion () ;; donne la version de maintenance de 15.2 de l'anne'e en cours. 1) (de herald () ;; Change le herald du lelispbin pour tenir compte de la nouvelle date ;; dans les distributions de maintenance. ;; On le redefinis me↑me quand la date est la meme que dans llm3, parce que ;; ttymsg n'est pas la me↑me que print. Comme c,a les distributions ;; de maintenance se comportent exactement de la me↑me fac,on. (with ((outchan ())) (print "; Le-Lisp (by INRIA) version 15.22 " " (6/Jan/89) [" (system) "]")) nil) ; .Section "Les variables globales internes du syste`me" (progn (defvar #:system:loaded-from-file 'startup) ; et maintenant refaisons le pour mettre 'startup ; dans #:system:loaded-from-file ..... (defvar #:system:loaded-from-file 'startup) (defvar #:system:in-read-flag #:system:in-read-flag) (defvar #:system:print-for-read #:system:print-for-read) (defvar #:system:print-package-flag #:system:print-package-flag) (defvar #:system:print-case-flag #:system:print-case-flag) (defvar #:system:real-terminal-flag #:system:real-terminal-flag) (defvar #:system:line-mode-flag #:system:line-mode-flag) (defvar #:system:gensym-counter #:system:gensym-counter) (defvar #:system:read-case-flag #:system:read-case-flag) (defvar #:system:foreign-language ()) ; pour les messages. (defvar #:system:unixp ()) ; =T c'est un syste`me UNIX. (defvar #:system:print-with-abbrev-flag t) 'DEFVAR ) ; .Section "Les variables de'pendantes du syste`me" ; Toutes ces variables re'sident dans le package "SYSTEM:" ; et contiennent les noms absolus des pre'fixes et suffixes ; des bibliothe`ques Le-Lisp. ; Pour les syste`mes UNIX la variable #:SYSTEM:DIRECTORY ; permet de calculer tous les autres directory. ; Le fichier "root-of-lelisp" mis a` jour au moment de l'installation ; du systeme lelisp permet d'initialiser cette variable. (progn ; pour rester silencieux pendant le chargement #.(defvar unix ; liste des syste`mes UN*X '(vaxunix vme pe32unix bell sps9 sm90 unigraph micromega metheus apollo cadmus sun hp9300 metaviseur ibmrt pyramid sequent gouldpn |tektronix 43xx| |C| dpx1000 sun4 convex)) (if (memq (system) '#.unix) (progn (defvar #:system:directory "/tmp←mnt/net/chroma/rojo/franchi/CENTAUR/lelisp/v15.22/") (defvar #:system:unixp t) #- #:system:foreign-language "syste`me unix" #+ #:system:foreign-language "unix system" ) (progn (defvar #:system:unixp ()) #- #:system:foreign-language "Pas un syste`me unix" #+ #:system:foreign-language "Not a unix system" ) )) (progn ; pour rester silencieux pendant le chargement (defvar #:system:cloadp (and #:system:unixp (memq (system) '(vaxunix sun sun4 sequent)))) ; Catalogue (pre'fixe) contenant la bibliothe`que syste`me Le-Lisp (unless (boundp '#:system:llib-directory) (defvar #:system:llib-directory #.(selectq (system) (#.unix (catenate #:system:directory "llib/")) (vaxvms "lelisp$disk:[lelisp.LLIB]") (multics ">lib>Le←Lisp>lelispv15.2>llib>") (pcdos "\lelisp\llib\") (t ""))) ) ; Catalogue (pre'fixe) contenant la bibliothe`que utilisateur Le-Lisp (unless (boundp '#:system:llub-directory) (defvar #:system:llub-directory #.(selectq (system) (#.unix (catenate #:system:directory "llub/")) (vaxvms "lelisp$disk:[lelisp.LLUB]") (multics ">lib>Le←Lisp>lelispv15.2>llub>") (pcdos "\lelisp\llub\") (t ""))) ) ; Catalogue (pre'fixe) contenant la bibliothe`que des tests du syste`me (unless (boundp '#:system:lltest-directory) (defvar #:system:lltest-directory #.(selectq (system) (#.unix (catenate #:system:directory "lltest/")) (vaxvms "lelisp$disk:[lelisp.LLTEST]") (multics ">lib>Le←Lisp>lelispv15.2>lltest>") (pcdos "\lelisp\lltest\") (t ""))) ) ; Catalogue (pre'fixe) contenant les modules syste`me Le-Lisp. (unless (boundp '#:system:llmod-directory) (defvar #:system:llmod-directory #.(selectq (system) (#.unix (catenate #:system:directory "llmod/")) (vaxvms "lelisp$disk:[lelisp.LLMOD]") (multics ">lib>Le←Lisp>lelispv15.2>llmod>") (pcdos "\lelisp\llmod\") (t ""))) ) ; Catalogue (pre'fixe) contenant les fichiers syste`me format objet Le-Lisp. (unless (boundp '#:system:llobj-directory) (defvar #:system:llobj-directory #.(selectq (system) (#.unix (catenate #:system:directory "llobj/")) (vaxvms "lelisp$disk:[lelisp.LLOBJ]") (multics ">lib>Le←Lisp>lelispv15.2>llobj>") (pcdos "\lelisp\llobj\") (t ""))) ) ; Catalogue (pre'fixe) contenant les de'finitions des terminaux virtuels (unless (boundp '#:system:virtty-directory) (defvar #:system:virtty-directory #.(selectq (system) (#.unix (catenate #:system:directory "virtty/")) (vaxvms "lelisp$disk:[lelisp.VIRTTY]") (multics ">lib>Le←Lisp>lelispv15.2>virtty>") (pcdos "\lelisp\virtty\") (t ""))) ) ; Catalogue (pre'fixe) contenant les de'finitions des bitmaps virtuels (unless (boundp '#:system:virbitmap-directory) (defvar #:system:virbitmap-directory #.(selectq (system) (#.unix (catenate #:system:directory "virbitmap/")) (vaxvms "lelisp$disk:[lelisp.VIRBITMAP]") (multics ">lib>Le←Lisp>lelispv15.2>virbitmap>") (pcdos "\lelisp\virbit\") (t ""))) ) ; Catalogue (pre'fixe) syste`me de Le-Lisp spe'cifique a` une machine (unless (boundp '#:system:system-directory) (defvar #:system:system-directory #.(selectq (system) (#.unix (catenate #:system:directory (let ((name (car (memq (system) '#.unix)))) (selectq name (vaxunix "vax") (|tektronix 43xx| "tektro") (t name))) "/")) (vaxvms "lelisp$disk:[lelisp.VAX]") (multics ">lib>Le←Lisp>lelispv15.2>multics>") (pcdos "\lelisp\pcdos\") (t ""))) ) ; Catalogue (pre'fixe) contenant les images-me'moire standard (unless (boundp '#:system:core-directory) (defvar #:system:core-directory #.(selectq (system) (#.unix (catenate #:system:directory (let ((name (car (memq (system) '#.unix)))) (selectq name (vaxunix "vax") (|tektronix 43xx| "tektro") (t name))) "/llcore/")) (vaxvms "lelisp$disk:[lelisp.LLCORE]") (multics ">lib>Le←Lisp>lelispv15.2>multics>core>") (pcdos "\lelisp\pcdos\core\") (t ""))) ) ; Liste des Catalogue (pre'fixe) contenant des fichiers Le-Lisp. (defvar #:system:path (list "" #:system:llib-directory #:system:llub-directory #:system:llmod-directory #:system:llobj-directory #:system:lltest-directory #:system:virtty-directory #:system:virbitmap-directory #:system:system-directory )) ; Extension (suffixe) des fichiers source Le-Lisp (defvar #:system:lelisp-extension #.(selectq (system) (#.unix ".ll") (vaxvms ".ll") (multics ".ll") (pcdos ".ll") (t ""))) ; Extension (suffixe) des fichiers de description de module Le-Lisp, (defvar #:system:mod-extension #.(selectq (system) (#.unix ".lm") (vaxvms ".lm") (multics ".lm") (pcdos ".lm") (t ""))) ; Extension (suffixe) des fichiers format objet Le-Lisp (defvar #:system:obj-extension #.(selectq (system) (#.unix ".lo") (vaxvms ".lo") (multics ".lo") (pcdos ".lo") (t ""))) ; Extension (suffixe) des fichiers images-me'moire (defvar #:system:core-extension #.(selectq (system) (#.unix ".core") (vaxvms ".cor") (multics ".core") (pcdos ".cor") (t ""))) ; Fichier contenant la base de donne'es "termcap" (defvar #:system:termcap-file #.(selectq (system) (#.unix "/etc/termcap") (vaxvms "lelisp$disk:[lelisp.VIRTTY]termcap.db") (multics ">lib>Le←Lisp>lelispv15.2>virtty>termcap.data") (pcdos "\lelisp\termcap") (t ""))) ; Catalogue (pre'fixe) contenant la base de donne'es "terminfo" (defvar #:system:terminfo-directory #.(selectq (system) (#.unix "/usr/lib/terminfo/") (vaxvms "lelisp$disk[lelisp.terminfo]") (multics ">lib>Le←Lisp>lelispv15.2>virtty>terminfo>") (pcdos "\lelisp\terminfo\") (t ""))) ; Nom de l'e'diteur a` appeler par ↑F (defvar #:system:editor #.(selectq (system) (pe32unix "emin") (bell "vi") (sps9 "redit") ((sm90 micromega metheus apollo pe32unix) "emin") (#.unix "emacs") (vaxvms "edit") (multics "emacs -task") (t ""))) ; .Section "Les codes ASCII symboliques pour la macro #\" (mapc (lambda (x y) (putprop x y '#:sharp:value)) '(null bell bs tab lf return cr esc sp del rubout) '(#↑@ #↑G #↑H #↑I #↑J #↑M #↑M #↑[ #/ 127 127)) ; .Section "Quelques autres fonctions" ; Toutes ces fonctions doivent e↑tre re-e'crites en LLM3. (de explodech (s) (mapcar 'ascii (explode s))) (de implodech (l) (implode (mapcar 'cascii l))) (de lhoblist (s) ; retourne tous les symboles qui de'butent par la chai↑ne s (maploblist (lambda (x) (index s x 0)))) ; .Section "Les macros-caracte`res standard" (dmc ↑L () ; ↑L : pour charger un fichier d'extension #:system:lelisp-extension (list 'libloadfile (readstring) t)) (dmc ↑A () ; Pour charger un module. (list 'loadmodule (readstring))) (dmc ↑E () (cond ((eq (peekcn) 13) ; juste ↑E suivi de 'return' '(pepefile ())) ((memq (peekcn) '(#/( #↑P)) ; expression : de'bute par ( ou ↑P)) (list 'pepefile (kwote (read)))) (t ; un nom de fichier (symbole) (list 'pepefile (kwote (concat (readstring))))))) (dmc ↑F () (let ((lu (readline))) (ifn lu (list 'comline #:system:editor) (lets ((fct (implode lu)) (file (getprop fct '#:system:loaded-from-file)) ;; pour prendre resetfn en compte. (type (or (car (getprop fct 'resetfn)) (typefn fct)))) (ifn (memq type '(expr fexpr macro dmacro)) (list 'pretty fct) (if file (list 'progn (list 'comline (catenate #:system:editor " " file)) (list 'load file t)) (setq file (catenate (gensym) #:system:lelisp-extension)) (list 'progn (list 'prettyf file fct) (list 'comline (catenate #:system:editor " " file)) (list 'load file t) (list 'remprop (kwote fct) ''#:system:loaded-from-file) (kwote fct)))))))) (dmc ↑P () (cons 'pretty (implode (pname (catenate "(" (readstring) ")"))))) (dmc |!| () ; pour appeler le shell (let ((l (readstring))) (comline (if (equal l "") "$SHELL" l)))) ;;; Definitions to allow path syntax before path is loaded. (defsharp u () (list (read))) (defsharp p () (list (read))) ; .Section "Load primitif" (defvar #:system:redef-flag ()) ; Pour ne pas avertir des redefinitions. ; (de eof (n) ; ; traitement standard de la fin de fichier. ; (close n) ; (inchan ()) ; (if #:system:in-read-flag ; (error 'read 'errsxt 11) ; (exit eof n))) (de loadfile (file redef?) (let ((#:system:loaded-from-file file) (#:system:redef-flag redef?) (#:sys-package:colon #:sys-package:colon) (#:system:in-read-flag ()) (inchan (inchan)) ) (inchan (openi file)) (protect (untilexit eof (eval (read))) (let ((in (inchan))) (when in (close in))) (inchan inchan) ) file )) ; .Section "La liste des fichiers de l'environnement standard" (de all-the-files () '( ; ; 1 - Syste`me minimum ; (virtty virbitmap display llpatch) ; ; 2 - Emacs ou PEPE ; (pepe) ; ; 3 - Environnement standard ; (setf defstruct sort array callext trace path pretty debug ttywindow abbrev microceyx) ; ; 4 - Le chargeur ; (loader) ; ; 5 - Compilateur ; (cpmac llcp peephole))) ; .Section "Construction de l'environnement standard" ; Si cet indicateur = T, un INITTY est re'alise' apre`s ; chaque restore-core d'images fabrique'es par SAVE-STD. (defvar #:system:initty-after-restore-flag t) ; Si cet indicateur = T, un INIBITMAP est re'alise' apre`s ; chaque restore-core d'images fabrique'es par SAVE-STD. (defvar #:system:inibitmap-after-restore-flag t) (de core-init-std (msg) ; rea'lise la se'quence d'initialisation apre`s un restore-core. ; msg est le message de bienvenue. (when #:system:initty-after-restore-flag (initty)) (when #:system:inibitmap-after-restore-flag (inibitmap)) (herald) #.(selectq (system) (#.unix '(let ((f (catenate (getenv "HOME") "/.lelisp"))) (when (probefile f) (loadfile f t)))) (vaxvms '(let ((f "sys$login:startup.ll")) (when (probefile f) (loadfile f t)))) (multics '(let ((f (catenate (getenv "HOME") ">start←up.ll"))) (when (probefile f) (loadfile f t)))) (t ())) (print "; " msg " : " #:system:save-std-date) (sortl (list-features))) ; Cette variable contient les diffe'rents GCINFO au moment ; des "save-std". (defvar #:system:save-std-gcinfo-list (list (cons 'initial (gcinfo t)))) (defvar #:system:save-std-date ()) (de save-std (nom msg . user-functions) ;; Sauve une image standard de type "save-core" de nom NOM. ;; MSG sera la bannie`re de rappel de l'image. ;; USER-FUNCTIONS sont des fonctions a` lancer optionellement ;; apre`s save-core et apre`s restore-core. Si seulement une ;; fonction est fournie, elle est utilise' au save-core et restore-core. ;; Si aucune n'est fournie, les valeurs par de'faut sont "core-init-std". (print "Attendez, je sauve : " msg) (unless (featurep 'date) (libload "date")) (setq #:system:save-std-date (date)) (gc) (newl #:system:save-std-gcinfo-list (cons nom (gcinfo))) (setq #:system:real-terminal-flag t ; On force a` un terminal #:system:line-mode-flag ()) ; normal avant save-core (prompt |? |) ; y compris le prompt standard (let* ((save-fn (or (car user-functions) 'core-init-std)) (restore-fn (or (cadr user-functions) save-fn 'core-init-std))) (if (save-core (catenate #:system:core-directory nom #:system:core-extension)) (funcall save-fn msg) (funcall restore-fn msg)))) (de load-std (nom . load-std) ; charge l'image standard ; 'nom' indique s'il faut faire une image me'moire (et c,a devient le nom) ; 'load-std' est la liste des indicateurs ; (min editeur environ loader compilateur) (when (nth 3 load-std) (libload module t) (print "Je charge loader") (loadmodule 'loader) (rplaca (nthcdr 3 (all-the-files)) ()) ) (mapc (lambda (lf i) (when i (mapc (lambda (x) (setq x (catenate #:system:llib-directory x #:system:lelisp-extension)) (print "Je charge " x) (loadfile x t)) (or (consp i) lf)))) (all-the-files) load-std) (print " (llcp-std '<nom>) pour compiler l'environnement standard") (when nom (save-std nom "Systeme standard interprete"))) (de llcp-std (nom . flags) ; compilation de l'environnement standard ; et fabrication du core "nom" (when (featurep 'compiler) ; essaie de de'gager un peu le compile-all-in-core (and (eq (typefn 'pprint) 'expr) (print "Je compile pprint.") (let ((#:ld:special-case-loader t)) (compiler 'pprint t (car flags) (cadr flags)))) (and (eq (typefn '#:compiler:peephole) 'expr) (print "Je compile #:compiler:peephole.") (let ((#:ld:special-case-loader t)) (compiler '#:compiler:peephole t (car flags) (cadr flags)))) (and (eq (typefn '#:compiler:macroexpand) 'expr) (print "Je compile #:compiler:macroexpand.") (let ((#:ld:special-case-loader t)) (compiler '#:compiler:macroexpand t (car flags) (cadr flags)))) (and (eq (typefn 'loader) 'expr) (print "Je compile loader.") (let ((#:ld:special-case-loader t)) (compiler 'loader t (car flags) (cadr flags)))) (and (eq (typefn 'compiler) 'expr) (print "Je compile compiler.") (let ((#:ld:special-case-loader t)) (compiler 'compiler t (car flags) (cadr flags)))) (and (eq (typefn 'pepefile) 'expr) (print "Je compile pepefile.") (compiler 'pepefile t (car flags) (cadr flags))) (mapc 'remob '(all-the-files load-std llcp-std load-stm load-cpl)) (print "Je compile tout le reste.") (compile-all-in-core (car flags) (cadr flags)) (when nom (save-std nom "Systeme standard compile")))) (de load-stm (nom . load-stm) ; charge l'image standard avec les modules complice's ; 'nom' indique s'il faut faire une image me'moire (et c,a devient le nom) ; 'load-stm' est la liste des indicateurs ; (min editeur environ loader compilateur) ; Il faut au minimum le code du chargeur et celui des modules. (libload module t) ; llib/module.ll (loadmodule 'loader) ; <system>/loader.lm --> llib/lapxxx.ll ; On charge les fichiers compile's indispensables. (print "Je charge " (probepathm 'loader)) (let ((#:ld:special-case-loader t)) (loadmodule 'loader t)) (mapc (lambda (m) (print "Je charge " (probepathm m)) (unless (memq m #:module:compiled-list) (loadmodule m)) ) '(toplevel files module defs) ) ; On charge le compilateur en premier s'il doit etre charge' (setq load-stm (cons (car (cddddr load-stm)) load-stm)) ; Et maintenant le reste. (mapc (lambda (lf i) (when i (mapc (lambda (m) (print "Je charge " (probepathm m)) (unless (or (memq m #:module:compiled-list) (memq m #:module:interpreted-list) ) (loadmodule m) )) (or (consp i) lf)))) '((llcp) (virtty virbitmap llpatch) (pepe) (setf defstruct sort array callext trace path pretty debug ttywindow abbrev microceyx) ()) load-stm) ; On vire ce qu'il y a en trop. (mapc 'remob '(all-the-files load-std llcp-std load-stm load-cpl)) (when (featurep 'compiler) (compile-all-in-core)) (when nom (save-std nom "Systeme standard modulaire"))) (de load-cpl (nom . load-cpl) ; charge l'image complice ; 'nom' indique s'il faut faire une image me'moire (et c,a devient le nom) ; 'load-cpl' est la liste des indicateurs ; (min editeur environ loader compilateur) ; Il faut au minimum le code du chargeur et celui des modules. (libload module t) ; llib/module.ll (loadmodule 'loader) ; <system>/loader.lm --> llib/lapxxx.ll ; On charge les fichiers compile's indispensables. (print "Je charge " (probepathm 'loader)) (let ((#:ld:special-case-loader t)) (loadmodule 'loader t)) (mapc (lambda (m) (print "Je charge " (probepathm m)) (unless (memq m #:module:compiled-list) (loadmodule m)) ) '(toplevel files module defs) ) ; On charge le compilateur en premier s'il doit etre charge' (setq load-cpl (cons (car (cddddr load-cpl)) load-cpl)) ; Et maintenant le reste. (mapc (lambda (lf i) (when i (mapc (lambda (m) (print "Je charge " (probepathm m)) (unless (or (memq m #:module:compiled-list) (memq m #:module:interpreted-list) ) (loadmodule m) )) (or (consp i) lf)))) '((complice) (virtty virbitmap llpatch) (meme) (setf defstruct sort array callext trace path pretty debug ttywindow abbrev microceyx) ()) load-cpl) ; On vire ce qu'il y a en trop. (mapc 'remob '(all-the-files load-std llcp-std load-stm load-cpl)) ; Patch les appels de Complice pour imprimer des fichiers ; objet sans abre'viations. (when (featurep 'compiler) (let ((#:system:redef-flag t)) (synonymq #:complice:patch:compilemodule compilemodule) (de compilemodule l (let ((#:system:print-with-abbrev-flag ())) (apply '#:complice:patch:compilemodule l))) (synonymq #:complice:patch:compilefiles compilefiles) (de compilefiles l (let ((#:system:print-with-abbrev-flag ())) (apply '#:complice:patch:compilefiles l))))) (when (featurep 'compiler) (compile-all-in-core)) (when nom (save-std nom "Systeme Complice modulaire"))) ; .Section "Fin de chargement de l'environnement minimum" (loadfile (catenate #:system:llib-directory 'toplevel #:system:lelisp-extension) () ) (loadfile (catenate #:system:llib-directory 'files #:system:lelisp-extension) () ) (loadfile (catenate #:system:llib-directory 'defs #:system:lelisp-extension) () ) (loadfile (catenate #:system:llib-directory 'genarith #:system:lelisp-extension) () ) (libautoload debug debug) (libautoload module loadmodule readdefmodule) ; .Section "Les fonctions Autoloads" ; 0 - les fonctions standard (libautoload virtty initty) (libautoload virbitmap inibitmap) (libautoload topwin topwindow) ; 1 - les utilitaires (libautoload defstruct defstruct) (libautoload array makearray aref aset) (libautoload sort sort sortl sortn sortp) (libautoload callext defextern cload defextern-cache #:system:cached-getglobal) (libautoload trace trace untrace step) (libautoload schedule parallel parallelvalues tryinparallel) (libautoload pretty pretty pprint prettyf) (libautoload format format prinf) ; 2 - les e'diteurs (libautoload minimore more morend) (libautoload edlin edlin edlinend) (libautoload emacs emacs) (libautoload pepe pepe pepefile) ; 3 - les jeux (libautoload hanoi hanoi) (libautoload whanoi whanoi) (libautoload vdt vdt) ; .Section "Final de l'initialisation" (defvar #:system:loaded-from-file ()) (remob 'unix) (rmargin 78) (print #- #:system:foreign-language " (load-std sav min pepe env ld llcp) pour charger l'environnement std," #+ #:system:foreign-language " (load-std sav min pepe env ld llcp) to load standard environment," ) (print #- #:system:foreign-language " (load-stm sav min pepe env ld llcp) pour l'environnement std modulaire," #+ #:system:foreign-language " (load-stm sav min pepe env ld llcp) to load modular environment," ) (print #- #:system:foreign-language " (load-cpl sav min meme env ld cmpl) pour l'environnement complice." #+ #:system:foreign-language " (load-cpl sav min meme env ld cmpl) to load complice environment." ) (input ()) #- #:system:foreign-language "Fin du startup." #+ #:system:foreign-language "End of startup." ) ; fin du progn silencieux