Annotation of 43BSDReno/share/doc/usd/02.learn/p5, revision 1.1

1.1     ! root        1: .\"    @(#)p5  6.1 (Berkeley) 5/23/86
        !             2: .\"
        !             3: .NH
        !             4: The Script Interpreter.
        !             5: .PP
        !             6: The
        !             7: .I
        !             8: learn
        !             9: .R
        !            10: program itself merely interprets scripts.  It provides
        !            11: facilities for the script writer to capture student
        !            12: responses and their effects, and simplifies the job
        !            13: of passing control to and recovering control from the student.
        !            14: This section describes the operation and
        !            15: usage of the driver program,
        !            16: and indicates what is
        !            17: required to produce a new script.
        !            18: Readers only interested in
        !            19: the existing scripts may skip this section.
        !            20: .PP
        !            21: The file structure used by
        !            22: .I learn
        !            23: is shown in Figure 2.
        !            24: There is one parent directory (named \f2lib\f1\^) containing the script data.
        !            25: Within this directory are subdirectories, one for each
        !            26: subject in which a course is available,
        !            27: one for logging (named
        !            28: .I log ),
        !            29: and one in which user sub-directories
        !            30: are created (named
        !            31: .I play ).
        !            32: The subject directory contains master copies of all lessons,
        !            33: plus any supporting material for that subject.
        !            34: In a given subdirectory,
        !            35: each lesson is a single text file.
        !            36: Lessons are usually named systematically;
        !            37: the file that contains lesson
        !            38: .I n
        !            39: is called
        !            40: .I Ln .
        !            41: .br
        !            42: .KF
        !            43: .sp
        !            44: .TS
        !            45: center, box;
        !            46: c s s s
        !            47: l l l l.
        !            48: Figure 2:  Directory structure for \fIlearn\fR
        !            49: .sp
        !            50: .nf
        !            51: lib
        !            52: .if t .sp .5
        !            53:        play
        !            54:                student1
        !            55:                        files for student1...
        !            56:                student2
        !            57:                        files for student2...
        !            58: .if t .sp .5
        !            59:        files
        !            60:                L0.1a   lessons for files course
        !            61:                L0.1b
        !            62:                ...
        !            63: .if t .sp .5
        !            64:        editor
        !            65:                ...
        !            66: .if t .sp .5
        !            67:        (other courses)
        !            68: .if t .sp .5
        !            69:        log
        !            70: .TE
        !            71: .sp
        !            72: .KE
        !            73: .PP
        !            74: When
        !            75: .I
        !            76: learn
        !            77: .R
        !            78: is executed, it makes a private directory
        !            79: for the user to work in,
        !            80: within the
        !            81: .I
        !            82: learn
        !            83: .R
        !            84: portion of the file system.
        !            85: A fresh copy of all the files used in each lesson
        !            86: (mostly data for the student to operate upon) is made each
        !            87: time a student starts a lesson,
        !            88: so the script writer may assume that everything
        !            89: is reinitialized each time a lesson is entered.
        !            90: The student directory is deleted after each session; any permanent records
        !            91: must be kept elsewhere.
        !            92: .PP
        !            93: The script writer must provide certain basic items
        !            94: in each
        !            95: lesson:
        !            96: .IP (1)
        !            97: the text of the lesson;
        !            98: .IP (2)
        !            99: the set-up commands to be executed before the user gets control;
        !           100: .IP (3)
        !           101: the data, if any, which the user is supposed to edit, transform, or otherwise
        !           102: process;
        !           103: .IP (4)
        !           104: the evaluating commands to be executed after the user
        !           105: has finished the lesson, to decide whether the answer is right;
        !           106: and
        !           107: .IP (5)
        !           108: a list of possible successor lessons.
        !           109: .LP
        !           110: .I
        !           111: Learn
        !           112: .R
        !           113: tries to minimize the work
        !           114: of bookkeeping and installation, so
        !           115: that most of the effort involved in
        !           116: script production is in planning lessons,
        !           117: writing tutorial paragraphs,
        !           118: and coding tests of student performance.
        !           119: .PP
        !           120: The basic sequence of events is
        !           121: as follows.
        !           122: First,
        !           123: .I learn
        !           124: creates the working directory.
        !           125: Then, for each lesson,
        !           126: .I learn
        !           127: reads the script for the lesson and processes
        !           128: it a line at a time.
        !           129: The lines in the script are:
        !           130: (1) commands to the script interpreter
        !           131: to print something, to create a files,
        !           132: to test something, etc.;
        !           133: (2) text to be printed or put in a file;
        !           134: (3) other lines, which are sent to
        !           135: the shell to be executed.
        !           136: One line in each lesson turns control over
        !           137: to the user;
        !           138: the user can run any 
        !           139: .UX 
        !           140: commands.
        !           141: The user mode terminates when the user
        !           142: types 
        !           143: .I yes ,
        !           144: .I no ,
        !           145: .I ready ,
        !           146: or
        !           147: .I answer .
        !           148: At this point, the user's work is tested;
        !           149: if the lesson is passed,
        !           150: a new lesson is selected, and if not
        !           151: the old one is repeated.
        !           152: .PP
        !           153: Let us illustrate this with the script
        !           154: for the second lesson of Figure 1;
        !           155: this is shown in Figure 3.
        !           156: .KF
        !           157: .sp
        !           158: .TS
        !           159: center, box;
        !           160: c.
        !           161: T{
        !           162: Figure 3:  Sample Lesson
        !           163: .sp
        !           164: .nf
        !           165: #print
        !           166: Of course, you can print any file with "cat".
        !           167: In particular, it is common to first use
        !           168: "ls" to find the name of a file and then "cat"
        !           169: to print it.  Note the difference between
        !           170: "ls", which tells you the name of the files,
        !           171: and "cat", which tells you the contents.
        !           172: One file in the current directory is named for
        !           173: a President.  Print the file, then type "ready".
        !           174: #create roosevelt
        !           175:   this file is named roosevelt
        !           176:   and contains three lines of
        !           177:   text.
        !           178: #copyout
        !           179: #user
        !           180: #uncopyout
        !           181: tail \-3 .ocopy >X1
        !           182: #cmp X1 roosevelt
        !           183: #log
        !           184: #next
        !           185: 3.2b 2
        !           186: .fi
        !           187: T}
        !           188: .TE
        !           189: .sp
        !           190: .KE
        !           191: .LP
        !           192: Lines which begin with
        !           193: # are commands to the
        !           194: .I  learn 
        !           195: script interpreter.
        !           196: For example,
        !           197: .LP
        !           198: .ul
        !           199:        #print
        !           200: .LP
        !           201: causes printing of any text that follows,
        !           202: up to the next line that begins with a sharp.
        !           203: .LP
        !           204: .ul
        !           205:        #print file
        !           206: .LP
        !           207: prints the contents of
        !           208: .I file ;
        !           209: it
        !           210: is the same as
        !           211: .ul
        !           212: cat file 
        !           213: but has
        !           214: less overhead.
        !           215: Both forms of
        !           216: .I #print
        !           217: have the added property that if a lesson is failed,
        !           218: the
        !           219: .ul
        !           220: #print
        !           221: will not be executed the second time through;
        !           222: this avoids annoying the student by repeating the preamble
        !           223: to a lesson.
        !           224: .LP
        !           225: .ul
        !           226:        #create filename
        !           227: .LP
        !           228: creates a file of the specified name,
        !           229: and copies any subsequent text up to a
        !           230: # to the file.
        !           231: This is used for creating and initializing working files
        !           232: and reference data for the lessons.
        !           233: .LP
        !           234: .ul
        !           235:        #user
        !           236: .LP
        !           237: gives control to the student;
        !           238: each line he or she types is passed to the shell
        !           239: for execution.
        !           240: The
        !           241: .I #user
        !           242: mode
        !           243: is terminated when the student types one of
        !           244: .I yes ,
        !           245: .I no ,
        !           246: .I ready 
        !           247: or
        !           248: .I answer .
        !           249: At that time, the driver
        !           250: resumes interpretation of the script.
        !           251: .LP
        !           252: .ul
        !           253:        #copyin
        !           254: .br
        !           255: .ul
        !           256:        #uncopyin
        !           257: .LP
        !           258: Anything the student types between these
        !           259: commands is copied onto a file
        !           260: called
        !           261: .ul
        !           262: \&.copy.
        !           263: This lets the script writer interrogate the student's
        !           264: responses upon regaining control.
        !           265: .LP
        !           266: .ul
        !           267:        #copyout
        !           268: .br
        !           269: .ul
        !           270:        #uncopyout
        !           271: .LP
        !           272: Between these commands, any material typed at the student
        !           273: by any program
        !           274: is copied to the file
        !           275: .ul
        !           276: \&.ocopy.
        !           277: This lets the script writer interrogate the
        !           278: effect of what the student typed, 
        !           279: which true believers in the performance theory of learning
        !           280: usually
        !           281: prefer to the student's actual input.
        !           282: .LP
        !           283: .ul
        !           284:        #pipe
        !           285: .br
        !           286: .ul
        !           287:        #unpipe
        !           288: .LP
        !           289: Normally the student input and the script commands
        !           290: are fed to the
        !           291: .UX
        !           292: command interpreter (the ``shell'') one line at a time. This won't do
        !           293: if, for example, a sequence of editor commands
        !           294: is provided,
        !           295: since the input to the editor must be handed to the editor,
        !           296: not to the shell.
        !           297: Accordingly, the material between 
        !           298: .ul
        !           299: #pipe
        !           300: and
        !           301: .ul
        !           302: #unpipe
        !           303: commands
        !           304: is fed
        !           305: continuously through a pipe so that such sequences
        !           306: work.
        !           307: If
        !           308: .ul
        !           309: copyout
        !           310: is also desired
        !           311: the
        !           312: .ul
        !           313: copyout
        !           314: brackets must include
        !           315: the
        !           316: .ul
        !           317: pipe
        !           318: brackets.
        !           319: .PP
        !           320: There are several commands for setting status
        !           321: after the student has attempted the lesson.
        !           322: .LP
        !           323: .ul
        !           324:        #cmp file1 file2
        !           325: .LP
        !           326: is an in-line implementation of
        !           327: .I cmp ,
        !           328: which compares two files for identity.
        !           329: .LP
        !           330: .ul
        !           331:        #match stuff
        !           332: .LP
        !           333: The last line of the student's input
        !           334: is compared to
        !           335: .I stuff ,
        !           336: and the success or fail status is set
        !           337: according to it.
        !           338: Extraneous things like the word
        !           339: .I answer
        !           340: are stripped before the comparison is made.
        !           341: There may be several 
        !           342: .I #match
        !           343: lines;
        !           344: this provides a convenient mechanism for handling multiple
        !           345: ``right'' answers.
        !           346: Any text up to a
        !           347: # on subsequent lines after a successful
        !           348: .I #match
        !           349: is printed; 
        !           350: this is illustrated in Figure 4, another sample lesson.
        !           351: .br
        !           352: .KF
        !           353: .sp
        !           354: .TS
        !           355: center, box;
        !           356: c.
        !           357: T{
        !           358: Figure 4:  Another Sample Lesson
        !           359: .sp
        !           360: .nf
        !           361: #print
        !           362: What command will move the current line
        !           363: to the end of the file?  Type 
        !           364: "answer COMMAND", where COMMAND is the command.
        !           365: #copyin
        !           366: #user
        !           367: #uncopyin
        !           368: #match m$
        !           369: #match .m$
        !           370: "m$" is easier.
        !           371: #log
        !           372: #next
        !           373: 63.1d 10
        !           374: T}
        !           375: .TE
        !           376: .sp
        !           377: .KE
        !           378: .LP
        !           379: .ul
        !           380:        #bad stuff
        !           381: .LP
        !           382: This is similar to
        !           383: .I #match ,
        !           384: except that it corresponds to specific failure answers;
        !           385: this can be used to produce hints for particular wrong answers
        !           386: that have been anticipated by the script writer.
        !           387: .LP
        !           388: .ul
        !           389:        #succeed
        !           390: .br
        !           391: .ul
        !           392:        #fail
        !           393: .LP
        !           394: print a message
        !           395: upon success or failure
        !           396: (as determined by some previous mechanism).
        !           397: .PP
        !           398: When the student types
        !           399: one of the ``commands''
        !           400: .I yes ,
        !           401: .I no ,
        !           402: .I ready ,
        !           403: or
        !           404: .I answer ,
        !           405: the driver terminates the
        !           406: .I #user
        !           407: command,
        !           408: and evaluation of the student's work can begin.
        !           409: This can be done either by
        !           410: the built-in commands above, such as
        !           411: .I #match
        !           412: and
        !           413: .I #cmp ,
        !           414: or by status returned by normal
        !           415: .UX 
        !           416: commands, typically
        !           417: .I grep
        !           418: and
        !           419: .I test .
        !           420: The last command
        !           421: should return status true
        !           422: (0) if the task was done successfully and
        !           423: false (non-zero) otherwise;
        !           424: this status return tells the driver
        !           425: whether or not the student
        !           426: has successfully passed the lesson.
        !           427: .PP
        !           428: Performance can be logged:
        !           429: .LP
        !           430: .ul
        !           431:        #log file
        !           432: .LP
        !           433: writes the date, lesson, user name and speed rating, and
        !           434: a success/failure indication on
        !           435: .ul
        !           436: file.
        !           437: The command
        !           438: .LP
        !           439: .ul
        !           440:        #log
        !           441: .LP
        !           442: by itself writes the logging information
        !           443: in the logging directory
        !           444: within the
        !           445: .I learn
        !           446: hierarchy,
        !           447: and is the normal form.
        !           448: .LP
        !           449: .ul
        !           450:        #next
        !           451: .LP
        !           452: is followed by a few lines, each with a successor
        !           453: lesson name and an optional speed rating on it.
        !           454: A typical set might read
        !           455: .LP
        !           456: .nf
        !           457:        25.1a   10
        !           458:        25.2a   5
        !           459:        25.3a   2
        !           460: .fi
        !           461: .LP
        !           462: indicating that unit 25.1a is a suitable follow-on lesson
        !           463: for students with
        !           464: a speed rating of 10 units,
        !           465: 25.2a for student with speed near 5,
        !           466: and 25.3a for speed near 2.
        !           467: Speed ratings are maintained for
        !           468: each session with a student; the
        !           469: rating is increased by one each time
        !           470: the student gets a lesson right and decreased
        !           471: by four each
        !           472: time the student gets a lesson wrong.
        !           473: Thus the driver tries to maintain a level such
        !           474: that the users get 80% right answers.
        !           475: The maximum rating is limited to 10 and the minimum to 0.
        !           476: The initial rating is zero unless the student
        !           477: specifies a different rating when starting
        !           478: a session.
        !           479: .PP
        !           480: If the student passes a lesson,
        !           481: a new lesson is selected and the process repeats.
        !           482: If the student fails, a false status is returned
        !           483: and the program
        !           484: reverts to the previous lesson and tries
        !           485: another alternative.
        !           486: If it can not find another alternative, it skips forward
        !           487: a lesson.
        !           488: .I bye ,
        !           489: bye,
        !           490: which causes a graceful exit
        !           491: from the 
        !           492: .ul
        !           493: learn
        !           494: system.  Hanging up is the usual novice's way out.
        !           495: .PP
        !           496: The lessons may form an arbitrary directed graph,
        !           497: although the present program imposes a limitation on cycles in that
        !           498: it will not present a lesson twice in the
        !           499: same session.
        !           500: If the student is unable to answer one of the exercises
        !           501: correctly, the driver searches for a previous lesson
        !           502: with a set of alternatives as successors
        !           503: (following the
        !           504: .I #next
        !           505: line).
        !           506: From the previous lesson with alternatives one route was taken
        !           507: earlier; the program simply tries a different one.
        !           508: .PP
        !           509: It is perfectly possible
        !           510: to write sophisticated scripts that evaluate
        !           511: the student's speed of response, or try to estimate the
        !           512: elegance of the answer, or provide detailed
        !           513: analysis of wrong answers.
        !           514: Lesson writing is so tedious already, however, that most
        !           515: of these abilities are likely to go unused.
        !           516: .PP
        !           517: The driver program depends heavily on features
        !           518: of
        !           519: .UX
        !           520: that are not available on many other operating systems.
        !           521: These include
        !           522: the ease of manipulating files and directories,
        !           523: file redirection,
        !           524: the ability to use the command interpreter
        !           525: as just another program (even in a pipeline),
        !           526: command status testing and branching,
        !           527: the ability to catch signals like interrupts,
        !           528: and of course
        !           529: the pipeline mechanism itself.
        !           530: Although some parts of 
        !           531: .ul
        !           532: learn
        !           533: might be transferable to other systems,
        !           534: some generality will probably be lost.
        !           535: .PP
        !           536: A bit of history:
        !           537: The first version of
        !           538: .I learn
        !           539: had fewer built-in words
        !           540: in the driver program,
        !           541: and made more use of the
        !           542: facilities of
        !           543: .UX .
        !           544: For example,
        !           545: file comparison was done by creating a
        !           546: .I cmp
        !           547: process,
        !           548: rather than comparing the two files within
        !           549: .I learn .
        !           550: Lessons were not stored as text files,
        !           551: but as archives.
        !           552: There was no concept of the in-line document;
        !           553: even 
        !           554: .I #print
        !           555: had to be followed by a file name.
        !           556: Thus the initialization for each lesson
        !           557: was to extract the archive into the working directory
        !           558: (typically 4-8 files),
        !           559: then 
        !           560: .I #print
        !           561: the lesson text.
        !           562: .PP
        !           563: The combination of such things made
        !           564: .I learn
        !           565: slower.
        !           566: The new version is about 4 or 5 times faster.
        !           567: Furthermore, it appears even faster to the user
        !           568: because in a typical lesson,
        !           569: the printing of the message comes first,
        !           570: and file setup with
        !           571: .I #create
        !           572: can be overlapped with the printng,
        !           573: so that when the program
        !           574: finishes printing,
        !           575: it is really ready for the user
        !           576: to type at it.
        !           577: .PP
        !           578: It is also a great advantage to the script maintainer
        !           579: that lessons are now just ordinary text files.
        !           580: They can be edited without any difficulty,
        !           581: and  
        !           582: .UX
        !           583: text manipulation tools can be applied
        !           584: to them.
        !           585: The result has been that
        !           586: there is much less resistance
        !           587: to going in and fixing substandard lessons.

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.