Back to lecture notes
Keyboard shortcut: 'u' 

;;;; This is a simple demo LAML document style, written for the paper 
;;;; 'A Programmatic Approach to WWW authoring using functional programming', see
;;;; http://www.cs.auc.dk/~normark/laml/papers/programmatic-approach.pdf

; LAML Library loading
(lib-load "file-read.scm")
(lib-load "html4.0-loose/basis.scm")
(lib-load "html4.0-loose/surface.scm")
(lib-load "html4.0-loose/convenience.scm")
(lib-load "time.scm")
(lib-load "color.scm")

; Return a function which tags some information with tag-symbol
(define (tag-information tag-symbol)
  (lambda information (cons tag-symbol information)))

; Tag function generation
(define quiz-entry (tag-information 'quiz-entry))
(define question-formulation (tag-information 'question-formulation)) 
(define answers (tag-information 'answers))
(define answer (tag-information 'answer))
(define answer-formulation (tag-information 'answer-formulation))
(define answer-correctness (tag-information 'answer-correctness))
(define answer-clarification (tag-information 'answer-clarification))

;;; Quiz entry selectors
(define question-of-entry (make-selector-function 2))
(define answers-of-entry (make-selector-function 3))

;;; Question selector
(define formulation-of-question (make-selector-function 2))

;;; Answer list selector
(define answer-list-of-answers (make-selector-function 2))

;;; Answer selectors
(define answer-formulation-of (compose second (make-selector-function 2)))
(define answer-correctness-of (compose second (make-selector-function 3)))
(define answer-clarification-of (compose second (make-selector-function 4)))

;; Present the quiz list q-list
(define (quiz q-lst)
 (write-text-file
  (let ((n (length q-lst)))
   (page 
     "Quiz Example"
     (list-to-string
      (map2 present-quiz-entry q-lst (number-interval 1 n))
      (p))))
  (string-append (source-filename-without-extension) ".html")))

; Present a single quiz entry qe, which is assigned to the number n.
(define (present-quiz-entry qe n)
 (let* ((question (formulation-of-question (question-of-entry qe)))
        (answers (answer-list-of-answers (answers-of-entry qe)))
        (m (length answers)))
  (con (font-color red (b question)) (br)
       (list-to-string 
         (map2 
           (lambda (a m) (present-answer a n m))
           answers (number-interval 1 m))
         (br)))))

; Present a single answer a in quiz entry n.
; This answer is assigned to the the number m.
(define (present-answer a n m)
 (let ((formulation (answer-formulation-of a))
       (answer-id (make-id n m)))
   (con (checkbox answer-id #f) 
        (horizontal-space 1)
        formulation)))

; Make an internal answer identification string based on two numbers.
(define (make-id n m)
  (string-append "a" "-" (as-string n) "-" (as-string m)))
        
; Has quiz-entry only correct or incorrect answering possibilities
(define (black-or-white-quiz-entry? quiz-entry)
  (let ((answer-list (answer-list-of-answers (answers-of-entry quiz-entry)))
        (partical-correct-answer?
          (lambda (answer)
            (let ((n (answer-correctness-of answer)))
              (and (> n 0) (< n 100)))))
       )
    (null?
      (filter partical-correct-answer? answer-list))))

; Make a quiz entry from a list lst
(define (make-quiz-entry-from-list lst)
  (let* ((question (first lst))
         (a-lst (second lst)))
    (quiz-entry
       (question-formulation question)
       (answers (map make-answer-from-list a-lst)))))
       
; Make an answer entry from a list lst
(define (make-answer-from-list lst)
  (let ((fo (first lst))
        (co (second lst))
        (cl (third lst)))
    (answer (answer-formulation fo) (answer-correctness co) (answer-clarification cl))))