|
|
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.
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.