The pymdl book
Appendix D. Knobs and initial settings
Source: every os.environ read in src/pymdl and tools/; the manual's
Appendix 5.
D.1 Environment variables
pymdl reads no configuration file. What can be set is set in the environment, and each variable is read at one place in the code, named here. A variable not set means its default.
Running MDL
| variable | default | what it does |
|---|---|---|
PYMDL_OS |
its |
the personality: its is release 55, tenex or tops20 release 105; ,MUDDLE answers accordingly (chapter 3) |
PYMDL_DSKDATE |
unset | pins the clock: the ITS disk-date word DSKDATE, IDSKDATE and TDSKDATE answer, so a session that consults the date is reproducible; tests/conftest.py sets it |
PYMDL_ACCUM_LIMIT |
2,000,000 | how large a structure a runaway accumulation may grow before the era's storage error is signalled instead of exhausting the host; the number matters less than having one (subrs/control.py) |
PYMDL_IPC_DIR |
$TMPDIR/pymdl-ipc |
where the ch23.4 IPC sockets live, one per MDL job |
PYMDL_FILE_ROOT |
the current directory | the file root for MUDINQ, the IPC device program run on its own (chapter 32); the listener's root is always the current directory |
PYMDL_LOAD_DEBUG |
unset | print what the package loader skipped and why while loading a package or a MUDBUG tool |
PYMDL_BINARY_LOG |
unset | a file to which every era object file a session opens (.nbin, .fbin, .gbin ...) is appended: the punch list of what a run actually reaches |
The emulator and compiled code
| variable | default | what it does |
|---|---|---|
PYMDL_NO_PDP10 |
unset | switch the PDP-10 emulator off: every door into it refuses, and what still fails is what needs the machine (chapter 36). Implies PYMDL_PREFER_SOURCE and, for the compiler build, EC_SOURCE=all |
PYMDL_PREFER_SOURCE |
unset | make the library look for a package's SOURCE before its compiled object file, reordering L-SECOND-NAMES the way ch4.1.1 allows (chapter 30) |
PYMDL_PDP10_DATA |
unset | archive directories to search for era helper binaries spread over several tapes, when a program FLOADs one by its ITS name |
PYMDL_FULL_BOUNDARY |
unset | make the emulator's marshal boundary re-render every structure on each crossing instead of by generation; for differential debugging only |
The native compiler
| variable | default | what it does |
|---|---|---|
PYMDL_PYCOMPILE_ALL |
unset | compile every FUNCTION with the native compiler as it is DEFINEd, so the whole suite runs on compiled code (chapter 34) |
PYMDL_PYCOMPILE_ONLY |
unset | with the above, restrict it to the named functions |
PYMDL_PYCOMPILE_LOG |
unset | a file recording what the native compiler compiled and refused |
PYMDL_ERA_COMPILER |
unset | the directory holding era_compiler.py; when set, <COMPILE> and FILE-COMPILE use MIT's compiler unless told NATIVE (chapter 34) |
PYMDL_ERA_SOURCE |
unset | build that era compiler from source (the EC_SOURCE configuration) |
PYMDL_ERA_VERBOSE |
unset | report the era compiler's load as it happens |
PYMDL_PCOMP_ROOT |
/tmp/pymdl-pcomp |
where the companion era-compiler session is staged |
The era tools
| variable | default | what it does |
|---|---|---|
PYMDL_ERA_CORPUS |
~/mdl-1971-1987/mdl |
the archive of MIT tapes |
PYMDL_ERA_MUDDLE |
~/muddle/<mdl.comp> |
the second archive, pcomp.load.13 among its files |
PYMDL_APSIM |
~/pdp10-xdev/bin/pdp10-apsim |
the PDP-10 simulator that runs MDL 55 |
PYMDL_ERA_ROOT |
~/scratch/pymdl/era-root |
a WRITABLE copy of the ITS root for apsim (MDL writes there) |
PYMDL_SELFHOST_STAGE, PYMDL_TAPE_DIFF_ROOT |
under ~/scratch/pymdl/ |
where two measurements stage, so a baseline and the tree can run side by side |
EC_SOURCE |
unset | build the era compiler's helpers and library from MDL source: 1 or all, or a comma list of the binaries to replace |
EC_RAW, EC_RAW_EXCEPT |
unset | stage MIT's own compiled fbins and run them on the emulator -- the authentic path -- except the modules named |
EC_ITS, EC_ITS_FROM, EC_ITS_LOAD |
unset | build from the ITS-side revisions of the compiler modules instead of the vendored ones; pin the tape; use the ITS load order |
EC_NO_MUDSAV |
unset | leave the pure-mapping databases (SAV FILE, FIXUP FILE) out of the staging |
EC_PEEP |
1 in the oracle |
the peephole optimiser on or off; the oracle image has it on and a word-level comparison must match |
EC_PYMAC_PEERS, EC_NO_PYMAC_PEERS |
unset | register only the named pymac peers, or none, to measure what each one changes |
EC_VERBOSE, EC_CKPT |
unset | more of the build's own reporting |
D.2 Initial settings
The manual's Appendix 5 lists the switches and variables MDL starts with. Here it is with pymdl's answers beside it, each one what a fresh interpreter says.
<ACTIVATE-CHARS <STRING <ASCII 7> <ASCII 19> <ASCII 15>>>
;"Tenex and Tops-20 versions only"
<DECL-CHECK T>
<UNASSIGN <GUNASSIGN DEV>>
<GC-MON <>>
<SET INCHAN <SETG INCHAN <OPEN "READ" "TTY:">>>
<UNASSIGN KEEP-FIXUPS>
<UNASSIGN <GUNASSIGN NM1>>
<UNASSIGN <GUNASSIGN NM2>>
<SET OBLIST <SETG OBLIST (<MOBLIST INITIAL 151> <ROOT>)>>
<SET OUTCHAN <SETG OUTCHAN <OPEN "PRINT" "TTY:">>>
<OVERFLOW T>
<UNASSIGN REDEFINE>
<RSUBR-LINK T>
<SETG <UNASSIGN SNM> "working-directory">
<SPECIAL-CHECK <>>
<SPECIAL-MODE UNSPECIAL>
<SET THIS-PROCESS <SETG THIS-PROCESS <MAIN>>>
<ON "CHAR" ,QUITTER 8 0 ,INCHAN>
<ON "IPC" ,IPC-HANDLER 1> ;"ITS version only"
<GASSIGNED? ACTIVATE-CHARS> ⇒ #FALSE () ; the ITS personality
<DECL-CHECK> ⇒ T
<GASSIGNED? DEV> ⇒ #FALSE ()
<GC-MON> ⇒ #FALSE ()
<TYPE ,INCHAN> ⇒ CHANNEL
<ASSIGNED? KEEP-FIXUPS> ⇒ #FALSE ()
<GASSIGNED? NM1> ⇒ #FALSE ()
<LENGTH .OBLIST> ⇒ 4
<TYPE .OUTCHAN> ⇒ CHANNEL
<OVERFLOW> ⇒ T
<ASSIGNED? REDEFINE> ⇒ #FALSE ()
<RSUBR-LINK> ⇒ T
,SNM ⇒ ""
<SPECIAL-CHECK> ⇒ #FALSE ()
<SPECIAL-MODE> ⇒ UNSPECIAL
<==? .THIS-PROCESS <MAIN>> ⇒ T
Found along the way. The manual's initial
.OBLISTis(INITIAL ROOT); a fresh pymdl's is four long,(INITIAL ROOT PP!-PACKAGE EDIT!-PACKAGE). That is not a departure. MDL 55 as distributed on the tapes answers the same four -- the pretty-printer and the editor are in the saved image, and their package OBLISTs are on the path -- measured 2026-09-09 on both the bareTS MUDDLEand the compiler imageECOMP.55SAVE. pymdl's compiler build ends on exactly that path (tools/era_compiler.py, the final OBLIST reset).
SNM, the manual's "working-directory", is the empty string: file names
with no SNAME resolve to the file root itself (chapter 2). The "CHAR"
handler on ,INCHAN is the quit character's, ^G under ITS; the "IPC"
handler is armed under the ITS personality only, as marked.