Home
Teaching
 
G7400 F'12
General
Blog
Texts
Schedule
Assignments
Project
Lectures
DrRacket

Blog

logo

Important Messages from the Instructor


Friday, November 16th, 2012

Assignment 10 is graded. The average grade is 87% (an A), with a range of 15/15 to 9/15.

You lost points if your submission had the wrong format (not a tar file), your program does not read from standard input or write to standard output, your program needed an X display, or your program failed some tests.

By now, you should have received an annotated copy of your README file and a status report on your grades.


Thursday, November 15th, 2012

A student asks ... The answer is ...

Can we assume that we will never be given an sexpr with free variables?

Yes.


Saturday, November 10th, 2012

I have revised the project page to refine the specification for the final steps of the project. -- As some of you have noticed, I have also started arranging a presentation schedule. I will list the remaining talks next week, when I have obtained a room for an afternoon session. [There are more people in class than presentation slots, given the normal lecture schedule.]


Friday, November 9th, 2012

Assignment 9 is graded. The average grade is 88% (an A), with a range of 12/12 to 8/12.

Problem 3 on this problem set is a mini-case study of problem set 10. See lecture this morning.

Some of you chose to revise the CEK machine in a non-traditional manner. See lecture this morning for the standard solution in this setting.


Wednesday, November 7th, 2012

Phillip pointed out a mistake in problem 2 of set 9. It is correct now (red color).


Tuesday, November 6th, 2012

A student asks ... The answer is ...

Should the result metafunction be able to produce error?

Yes. I have corrected 9-provided.rkt accordingly. Please download and work with the new version.


Monday, November 5th, 2012

Assignment 8 is graded. The average grade is 91% (an A), with a range of 12/12 to 7/12. I have ignored organization problems this time, but homework solutions with problems contain an "MF" labeled hint. Next time I will punish such mistakes, too.


Thursday, November 1st, 2012

The project proposals are graded. The average grade is 80% (a B+), with a range of 20/20 to 12/20.

The grade consists of four parts: content (6), English writing (12), looks (1) and "citation" (1). The last two are awarded for a precise specification of the paper that you use for your project and type setting style. I did not take off either of these two points, though two submissions got really close. Based on this experience, I will refine the project page to specify the format of the resubmission.

The content grade awards three points for a concise, neutral, and correct summary of the paper. The proposal counts for an additional three points. A good proposal consists of two parts: a goal statement (what, specification) and an approach (how, implementation). A goal can come as an indirect question and its explanation [or as a conjecture and the reasoning that produced it]; an approach spells out which tools (software, mathematics, measurements) you will use and how you use them to answer the question [or validate the conjecture]. -- Few of you are in a position to work with conjectures, which is why these sentence fragments are in brackets.

The English writing grade judges memo organization, paragraph organization, sentence organization, grammatical correctness, and spelling.


Thursday, November 1st, 2012

This morning's email came with a pointer to a blog on models and uncertainty that I thought I should share with you. After all, this course is primarily about turning undergraduates (including MS students) into PhD-level researchers.

I consider the the Modelers' Hippocratic Oath (bottom of the blog) of particular interest. All too often, we forget that our models are highly inaccurate, given the true size and complexity of our programs and programming languages; our theorems about these models are not much more than a "testing effort" that ensures some basic validity; and our measurement efforts are not even fully repeatable at the precise data level.

In my opinion, all of the above applies to all other research areas within computer science as much as it applies to programming languages, and for the newer areas (almost all), it applies even more so.


Wednesday, October 31st, 2012

Alex and Fabian write:

So when we were using redex-check, we tracked down a typo you'd made in 8-provided: in the 2nd clause of no-binding-for, you meant to say "d_u" but instead put "du". Took us a while to figure out what was going wrong. ;)
This is correct. I had initially distinguished dt for typed definitions from du for untyped definitions. To make your life easy for the past problem set, I went back to plain d and friends.

I have posted a revised version of 8-provided.rkt.


Wednesday, October 31st, 2012

A student asks ... The answer is ...

In language sl+c, s is extended to include void. For void input, the output result is also void But we found that for void input, eval-s in 8-provided.rkt gives contract violation, because r does not include void in sl+c. What gives?

This question exhibits a mistunderstanding and a mistake.

The purpose of separating simple-lang definitions from sl+c definitions is to separate what the programmer writes down (the former) and what we need to define additionally so that we can specify a reduction semantics (the latter).

The mistake is to jump to the conclusion that void must be an output (because it can show up in intermediate states). -- You can actually -- prove that void cannot become a part of a result if it is only added by reductions. (This is a good exercise.)

May we assume that inputs are well-formed (and implicitly well-typed if types were provided)?

Yes.


Tuesday, October 30th, 2012

A student asks ... The answer is ...

The sl+c language defines the E as a hole or (+ e E) or a (+ E e). This leads to parallel paths when we have multiple references in the '+' expressions. Shouldn't a standard reduction be unique?

Yes.

The sl+c language defines the E as a hole or (+ e E) or a (+ E e). This leads to parallel paths when we have multiple references in the '+' expressions. Shouldn't a standard reduction be unique?

In this case, you can also "mod out" under parallelism for expression evaluation.

The sl+c language defines the E as a hole or (+ e E) or a (+ E e). This leads to parallel paths when we have multiple references in the '+' expressions. Shouldn't a standard reduction be unique?

But, to make sure nobody is confused, I corrected the definition of evaluation contexts for expressions in 8-provided.rkt. Be sure to download the new version.

In language sl+c, s is extended to include void. For void input, the output result is also void But we found that for void input, eval-s in 8-provided.rkt gives contract violation, because r does not include void in sl+c. What gives?

This question exhibits a mistunderstanding and a mistake.

The purpose of separating simple-lang definitions from sl+c definitions is to separate what the programmer writes down (the former) and what we need to define additionally so that we can specify a reduction semantics (the latter).

The mistake is to jump to the conclusion that void must be an output (because it can show up in intermediate states). -- You can actually -- prove that void cannot become a part of a result if it is only added by reductions. (This is a good exercise.)


Sunday, October 28th, 2012

Assignment 7 is graded. The average grade is 89% (an A), with a range of 25/25 to 18/25. Many submissions failed to define a function with the required name (check) or the required signature (one input or to produce an error token (instead signaling an error).

I graded problem 3 extremely leniently. If I had graded the proof idea according to my 'reading meter' for submissions to a conference, most submissions would have lost all points allocated for this problem. Here is a sample explanation:

Every reduction step shrinks the size of the "state". Since the size cannot drop below 0, a reduction must be finite.
Such explanations must convey the basic idea, and they must be grammatically well-formed sentences. Good reviewers will catch problems with the former aspect, and really good reviewers will stomach bad sentences only if the ideas are overwhelmingly good.


Thursday, October 25th, 2012

A student asks ... The answer is ...

Isn't it essential to retain some type-related information for evaluation, even after type-checking is done in problem 2?

In principle, yes. I am willing to accept a slightly different semantics than the one that type checking suggests.

for problem 3 we aren't exactly sure what the precise definition of size is, is it supposed to be the number of statements in s or the number of expressions?

What you consider a notion of 'size' is left to you. The question is asked in the context of a problem.


Thursday, October 25th, 2012

Due to bad network connectivity I could not respond to any email and questions concerning the current problem set. While none of the questions are complex, I will postpone the due date until Friday midnight so that you will be able to see my responses.


Monday, October 22nd, 2012

A student asks ... The answer is ...

Should we extend simple-lang defined in PS 7 to contain untyped statements, declarations, and expressions?

Yes, you need to specify strip's signature.

Is it acceptable to extend simple-lang to have a unit type?

There is no need for such a type in simple-lang.


Monday, October 22nd, 2012

Assignment 6 is graded. The average grade is 82% (a B+), with a range of 23/25 to 16/25. The key problems concerned reduction and standard reduction.

The first problem called for restricting the ==> relation so that reductions would take place in the first statement of a block. To my surprise, a fair number of solutions did neither eliminate s_1 ... from the rules (the obvious problem) nor restrict the S contexts (the subtle problem).

The third problem called for the creation of a standard reduction relation for the reduction relation from problem 1. As the book and the lecture emphasized, the main idea is to restrict the contexts where ==> reductions can take place. So the only true modification called for was a change to the with clause; depending on your approach to problem 1, you may have also had to extend the language so that the proper kinds of contexts would be available. -- I was lenient in grading this problem.


Saturday, October 20th, 2012

I have edited the project page to clarify the role of the proposal memo. Please re-read.

As of Friday, October 26, NOON, you must collaborate with a different partner on the weekly problem sets. Send me an one email per new partnership by Friday before class.


Thursday, October 18th, 2012

By sheer coincidence, someone posted a small excerpt from a conversation with Hemingway that I referred to in lecture last Tuesday:

Interviewer: How much rewriting do you do?

Hemingway: It depends. I rewrote the ending of A Farewell to Arms, the last page of it, thirty-nine times before I was satisfied.

Interviewer: Was there some technical problem there? What was it that had you stumped?

Hemingway: Getting the words right.

From "The Art of Fiction," an interview with Ernest Hemingway in Paris Review, 1956.


Thursday, October 18th, 2012

Le Chen and Matt Clarke-Lauer discovered an error in the s-subst function of 5.rkt. The originally posted function failed to take into account shadowing of variables via nested block declarations. The file is fixed now.

I had discovered this problem in a previous version of the solution, but the fix got lost due (I conjecture) to a file synchronization mishap. The true lesson is that I forgot to add a test case for this critical case.


Wednesday, October 17th, 2012

Assignment 5 is graded. The average grade is 87% (an A), with a range of 19/20 to 15/20. The emphasis was problem 3: organization, proper restrictions, and loose enough restrictions.

To my surprise, most of you failed to understand the spirit of problem 4. Please re-read the purpose of the problem set and take a close look at the problem I provided:

  (traces ->simple-lang.v2 (term (block ((x 0)) (x = 1) (block ((y 1)) (y = 2)))))
This kind of example inspired people to purse the goal of parallel execution as early as around 1980.


Tuesday, October 16th, 2012

I have replaced 5.rkt with a new version that properly eliminates the "fast path" merger. Credit to Cuisheng and Fabian who pointed out with a test that the rule worked incorrectly even for well-formed programs. -- I have also strengthened the comparison of results to include a quasi-alpha comparison. See comments for details.

A student asks ... The answer is ...

Can we use define-extended-language to specify the standard reduction relation?

Yes. This is the intended solution.

What is the role of with in Redex?

See section 12.3 in the required readings list.

Should our relation -->simple-lang.v3 deal with tests such as (x = 1)?

No. As explained at the beginning of the lecture, your homework does not have to deal with ill-formed programs (e.g., programs with free variables) until you start dealing with types.


Tuesday, October 9th, 2012

A student asks ... The answer is ...

Problem 3 requests that you "[e]dit and/or supplement the ==> rules (and only those) of ->simple-lang.v2 with side conditions as needed so that they get triggered only according to your understanding of C's and Java's semantics." What does "edit" mean and how does "block merging" relate to C or Java?

Read the sentence as "supplement the ==> rules (and only those) of ->simple-lang.v2 with side conditions as needed so that they get triggered only according to your understanding of C's and Java's semantics" and "edit the merge rule without changing its shape" so that it maintains C and Java-style lexical scope.

The merge rule exists to make the problem set reasonably difficult. In a simple language, like the one of this assignment, there is no need to maintain inner blocks after their statements have been executed.

Problem 4 asks for "the smallest possible example", which implies the existence of an ordering amongst examples (programs here) wrt size. ...

The phrase "the smallest" is inappropriate because I did not define size and one can argue about the appropriate measure. So please send "a very small program" with the specified properties.

Does merging blocks require renaming variables?

Of course, otherwise your reductions violate the scope of the program.


Tuesday, October 9th, 2012

What I do NOT want I do not want people to conduct research. I do not want people to figure out new insights.

What I do want I want people to learn that there is more to a paper than the surface syntax. Reading a paper usually means a first pass with a basic understanding and some open questions. Turning a part of the paper into an executable Redex model and playing with this model will help you improve your understanding. I want you to understand this process of going from a first reading to a deep reading.


Tuesday, October 9th, 2012

Here is the proof for problem 3:

THEOREM: For all XFSM, (fsm-2-xfsm (xfsm-2-fsm XFSM)) = XFSM 

NOTE: Since the definitions of FSM and XFSM are not inductive
 per se, it makes no sense to use induction. Instead we calculate. 

PROOF: Thus let XFSM be 

   (fsm ((initial STATE_i))
         (final ((label STATE_f))) ... 
         (transition ((current STATE_c) (next STATE_n)) 
                     (action ((key KEY))) ...))

Then we can simply unwind the function definitions, one step at a time: 
  (fsm-2-xfsm
   (xfsm-2-fsm
    (fsm ((initial STATE_i))
         (final ((label STATE_f))) ... 
         (transition ((current STATE_c) (next STATE_n)) 
                     (action ((key KEY))) ...))))

= (fsm-2-xfsm
   (fsm STATE_i
        ;; NOTE: the ... could be suspicious to a hair-splitting mathematician here.
        ;; To satisfy this person, you could use induction on the length of the sequence. 
        ((xml-final (final ((label STATE_f)))) ...)
        ;; NOTE: see above 
        ((xml-transition
          (transition ((current STATE_c) (next STATE_n)) 
                      (action ((key KEY))) ...)) ...)))

= (fsm-2-xfsm
   (fsm STATE_i
        (STATE_f ...)
        ;; NOTE: see above 
        ((STATE_c ((xml-key (action ((key KEY)))) ...) STATE_n) ...)))

= (fsm-2-xfsm
   (fsm STATE_i
        (STATE_f ...)
        ((STATE_c (KEY ...) STATE_n) ...)))

= (fsm ((initial STATE_i)) 
       (final ((label STATE_f))) ...
       (transition ((current STATE_c) (next STATE_n)) 
                   (action ((key KEY))) ...) ...)
where
  ;; -----------------------------------------------------------------------------
  ;; convert an XFSM representation of a finite state machine into an FSM
  (define-metafunction TOP 
    xfsm-2-fsm : XFSM -> FSM 
    [(xfsm-2-fsm (fsm ((initial STATE)) FINAL ... TRANSITION ...))
     (fsm STATE ((xml-final FINAL) ...) ((xml-transition TRANSITION) ...))])

  (define-metafunction TOP 
    xml-final : FINAL -> STATE
    [(xml-final (final ((label STATE)))) STATE])

  (define-metafunction TOP 
    xml-transition : TRANSITION -> (STATE (KEY ...) STATE)
    [(xml-transition (transition ((current STATE_c) (next STATE_n)) ACTION ...))
     (STATE_c ((xml-key ACTION) ...) STATE_n)])

  (define-metafunction TOP
    xml-key : ACTION -> KEY 
    [(xml-key (action ((key KEY)))) KEY])

  ;; -----------------------------------------------------------------------------
  ;; convert a FSM representation of a finite state machine into an XFSM 
  (define-metafunction TOP 
    fsm-2-xfsm : FSM -> XFSM 
    [(fsm-2-xfsm (fsm STATE_i (STATE_f ...) ((STATE_c (KEY ...) STATE_n) ...)))
     (fsm ((initial STATE_i))
	  (final ((label STATE_f))) ...
	  (transition ((current STATE_c) (next STATE_n))
		      (action ((key KEY))) ...) ...)])


Sunday, October 7th, 2012

Assignment 4 is graded. The average grade is 11/15, with a range of 9/15 to 15/15. Due to my decision concerning problem 2 (see below), 3 of these points are "free" for many of you.

To my surprise, problem 1 caused consternation on your side, with all but one pair getting the notion of stuck state wrong. Consider this FSM specification:

  (term (fsm "a" ("b") (("a" ("b") "b") ("a" ("b") "c")))) 
It is non-deterministic and the state labeled "c" is a sink of the graph but not a final state. Hence, when this FSM is "applied" to the sequence that consists of one key ("b"), one path leads to a (term REJECT) state:
Please take a close look because this matters for the next problem set, too.

Problem 2 is a complete failure for most of you; I decided to ignore the problem for the grades. -- Apparently your undergraduate background does not enable you to carry out a straightforward proof by calculation. I decided to let you know what I think of your proof on a 3-point basis. Even if you have a perfect 3 (few of you), you should not think that you have found a proof that reviewers would accept. If you have less than 3 points, you are in trouble. Study the proofs in the book for starters.


Thursday, October 4th, 2012

Please call the reduction relation for FSMs (problem 1, set 4) ->fsm. Thanks.


Tuesday, October 2nd, 2012

A student asks ... The answer is ...

After the definition of run-1, the question mentions: (redex-check FSM-L FSM (run-1 (term FSM)) #:attempts 3)

It was meant to be (redex-check FSM-L XFSM (run-1 (term XFSM)) #:attempts 3) because run-1 consumes an Xexpr?


Tuesday, October 2nd, 2012

As of Friday, October 5, NOON, you must collaborate with a different partner on the weekly problem sets. Send me an one email per new partnership by Friday before class.


Tuesday, October 2nd, 2012

Here is the code in class:

  #lang racket 
  (require redex)

  (define-language functions
    [e x n (e + e) (λ x e) (e e)]
    [n number]
    [x variable-not-otherwise-mentioned]
    [C hole (e + C) (C + e) (C e) (e C) 
       ;; since an expression of shape (λ x e) contains a subexpression e, 
       ;; you must be able to reduce function applications in this part of 
       ;; the tree too. Here is the context for doing this: 
       (λ x C)])

  ;; reduce expressions 'e' in the 'functions' language 
  (define ->fun
    (reduction-relation
     functions 
     [--> (in-hole C (n_1 + n_2))
	  (in-hole C ,(+ (term n_1) (term n_2))) "add"]
     [--> (in-hole C ((λ x e_rhs) e_arg))
	  (in-hole C (subst e_rhs x e_arg)) "fun"]))

  ;; replace all occurrences of x in e with n 
  (define-metafunction functions
    subst : e x e -> e
    [(subst x x e) e]
    [(subst x_y x e) x_y]
    [(subst n x e_x) n]
    [(subst (e_1 + e_2) x e)
     ((subst e_1 x e) + (subst e_2 x e))]
    [(subst (λ x e_body) x_para e_arg)
     (λ x (subst e_body x_para e_arg))]
    [(subst (e_f e_a) x e)
     ((subst e_f x e)  (subst e_a x e))])

  (test-->> ->fun (term ((λ f ((f 1) + (f 2))) (λ x (x + 2)))) 7)

  ; (traces ->fun (term ((λ f ((f 1) + (f 2))) (λ x (x + 2)))))
Find a term e for which this reduction relation should find two results. Which one is correct? Why does it find the other one?


Saturday, September 29th, 2012

Assignment 3 is graded. The average grade is 12/15 (79%), with a range of 6/15 to 15/15. The 15 points are distributed over three functions (stuck?, your conjecture(s), type-of). In addition, I allocated four "style and convention" points. You may lose one of these latter points if your functions fail my tests, if you break basic Redex style conventions (as seen in the text book and in class), or if you break the hand-in conventions.

As always, point subtractions and observations are marked up with "MF" in your submissions.

Some of you did really well with Redex pattern matching and some of you should take a second look (experiment!). Here is all of type-of, a formulation inspired by Claire Alvis and Alex Marquez:

  (define-metafunction simple-lang 
    type-of : s -> t
    [(type-of s_0) (s-aux s_0 ())])

  ;; compute the type for a sub-statement s of s_0
  ;; invariant: d specifies all types declared between s_0 and s 
  (define-metafunction simple-lang 
    s-aux : s d -> t
    [(s-aux (x ... x_last = e ... e_last) d)
     t 
     (where (t t) ((lookup x_last d) (e-aux e_last d)))
     (side-condition (equal? (term ((lookup x d) ...)) (term ((e-aux e d) ...))))]
    [(s-aux (block ((t_1 x_1) ...) s ... s_last) ((t_2 x_2) ...))
     (s-aux s_last d_extended)
     (where d_extended ((t_1 x_1) ... (t_2 x_2) ...))
     (side-condition (term ((s-aux s d_extended) ...)))]
    [(s-aux s d)
     ,(error 'type-of "empty block or assignment encountered")])

  ;; compute the type for a sub-expression e of s_0
  ;; d specifies all types declared between s_0 and s 
  (define-metafunction simple-lang 
    e-aux : e d -> t
    [(e-aux x d) (lookup x d)]
    [(e-aux n d) ,(if (exact-integer? (term n)) int float)]
    [(e-aux (+ e_l e_r) d) t (where (t t) ((e-aux e_l d) (e-aux e_r d)))]
    [(e-aux s d) (s-aux s d)])
Please also pay attention to code arrangements.


Thursday, September 27th, 2012

A student asks ... The answer is ...

Is an FSM stuck if the current state is a final state?

No.


Sunday, September 23rd, 2012

Assignment 2 is graded. The average grade is 9.7/12, with a range of 6/12 to 12/12. The 12 points are distributed over three functions: depth (3), fdive (4), fv (3). In addition, I allocated two "style and convention" points. You may lose one of these latter points if your functions fail my tests, if you break basic Redex style conventions (as seen in the text book and in class), or if you break the hand-in conventions.

Last time I wrote "Code is the best way we have to communicate thoughts to other people; it accidentally runs on computers. Good code is like good poetry. Everything fits: from the textual shape to the global organization. Bad code makes readers feel ill. Please work on your code design skills." Take me seriously; if you cannot write beautiful looking code in any language you encounter, you cannot compete.

Here is one more example so that you can see how Redex/Racket code is formatted, documented, arranged:

  ;; -----------------------------------------------------------------------------
  ;; replace free variable occurrences with "free", bound ones with "bound"
  (define-metafunction PL 
    fv : e -> e
    [(fv e_0) (fv-aux e_0 ())])

  ;; invariant: (v ...) is the list of variables occurring in 'function' on
  ;;   the path from e_0 to e 
  (define-metafunction PL
    fv-aux : e (v ...) -> e
    [(fv-aux v (v_1 ... v v_2 ...)) "bound"]
    [(fv-aux v (v_1 ...)) "free"]
    [(fv-aux (function v e) (v_1 ...))
     (function v (fv-aux e (v v_1 ...)))]
    [(fv-aux (e_f e_a) (v_1 ...))
     ((fv-aux e_f (v_1 ...)) (fv-aux e_a (v_1 ...)))])

  ;; possible escape to Racket for first two clauses: 
  ;; ,(if (member (term v) (term (v_1 ...))) "bound" "free")

  ;; tests, arranged bottom up because you want to check helpers first
  ;; term with the same variable free and bound 
  (define e0 (term ((function "x" "x") "x")))

  (test-equal (term (fv-aux "x" ("y" "x"))) "bound")
  (test-equal (term (fv-aux "x" ("z" "y"))) "free")
  (test-equal (term (fv-aux ,e0 ())) (term ((function "x" "bound") "free")))

  (test-equal (term (fv ,e0)) (term ((function "x" "bound") "free")))
You should make the following, basic observations: (1) present most important function first, least important last ("top down") though you probably don't develop this way. (2) Write down one purpose statement for functions that belong together and an explicit invariant for each accumulator style function. (3) Do not break lines in the middle of an expression just because the line would be more than 80 characters wide, see book/lecture. (4) let DrRacket indent for you. If you find yourself indenting on your own, you are making code look bad. Find a precedent and use it.


Wednesday, September 19th, 2012

A student asks ... The answer is ...

What is the distance between tree 1 and tree 2 in a list of trees?

1. The distance is the number of trees between the first tree and the tree in question, including the latter.

In the fv function , do we need to replace v in (function v e) with bound?

No. The v in (function 'v' e) is different from 'v' in (function x v). It is not replaced during "checking".

Are we supposed to write template for each metafunction in the program?

The template step is 'crutch' for those of you who have never been exposed to structural recursion or have little experience with it. There is no need to include templates in your solution; I will recognize whether your program's organization matches the data representation or not.

I have one small question I'd like clarified. In part 1 you say to "Define five sample trees, with at least three composites.". I'm not sure if by that you mean that of the five trees three of the trees have to include composites, or if the 5 trees each have to individually include 3 composites.

The former.


Wednesday, September 19th, 2012

Here is my XML parser for problem set 1:

  ;; -----------------------------------------------------------------------------
  ;; XML -> FSM
  ;; produce a finite-state machine representation from an XML configuration 
  (define (parse x)
    ;; parse does not check the names of states because all strings are allowed 
    (define (<fsm> x)
      (define <initial> 
	(element-named-attributes "not an initial attribute: ~e" initial))
      (define <finals> 
	(curry map (element-named-attributes "not a final element: ~e" label)))
      (define (<transition*> transition*)
	(define <key> 
	  (element-named-attributes "not an action element: ~e" key))
	(define <current-&-next> 
	  (element-named-attributes "not a transition element: ~e" current next))
	(define <actions>
	  (elements-named-content action))
	(define (key> x)
	  (unless (and (= (string-length x) 1) (regexp-match #px"\\d|[a-zA-Z]" x))
	    (error "not an alphanumeric key: ~e" x))
	  x)
	(define (<transition> e)
	  (define-values (current next) (<current-&-next> e))
	  (define key* (map (compose key> <key>) (<actions> e)))
	  (transition current key* next))
	(map <transition> transition*))
      (define <final-&-transition> (elements-named-content final transition))
      ;; -- IN -- 
      (unless (eq? (element-name x) 'fsm) (error 'parse "not an fsm: ~e" x))
      (define-values (final* transition*) (<final-&-transition> x))
      (fsm (<initial> x) (<finals> final*) (<transition*> transition*)))
    ;; -- IN -- 
    (<fsm> x))

  ;; -----------------------------------------------------------------------------
  ;; internal representation of FSM 

  ;; FSM        = (fsm State [List-of State] [List-of Transition])
  ;; State      = String 
  ;; Transition = (transition State [List-of LetterKeyEvent] State)

  (struct fsm (initial finals transitions) #:transparent)
  (struct transition (current keys next) #:transparent)
The parser relies on two essential constructs for extracting content elements and attributes from XML element (representation):
  ;; retrieve all attributes from e with name in n ...
  ;; error messages are specified via msg
  (element-named-attributes msg:string n:id ...)
  ;; XML-Element -> [Listof String]

 ;; retrieve all elements in content of e with name in n ...
 (elements-named-content n:id ...)
 ;; XML-Element *->* [Listof XML-Element]
Here is a typical unit test for the parser:
    (module+ test 
             (define (read-parse xml0:string)
               (parse (read-xml/element (open-input-string xml0:string))))
             (define xml0:string
               #<< eos
        <fsm initial="a">
           <final label="d"></final>
           <transition current="a" next="bc">
              <action key="a"></action>
           </transition>
           <transition current="bc" next="bc">
              <action key="b"></action>
              <action key="c"></action>
           </transition>
           <transition current="bc" next="d">
             <action key="d"></action>
           </transition>
        </fsm>
     eos
               )
             (check-equal? (read-parse xml0:string) fsm0)
    ...)


Tuesday, September 18th, 2012

Problem set 2 is due midnight Friday, 21 September 2012. This will give you a chance to see accumulator design in action and to ask questions concerning code.


Tuesday, September 18th, 2012

Assignment 1 is graded. The average grade is 7/10. The 10 points are distributed over three groups: project delivery (3); running the code on five simple files (3); and superficial code inspection (4: model-view, purpose statements, unit tests).

I will send out emails with individual grades later tonight.

Code is the best way we have to communicate thoughts to other people; it accidentally runs on computers. Good code is like good poetry. Everything fits: from the textual shape to the global organization. Bad code makes readers feel ill. Please work on your code design skills.


Monday, September 17th, 2012

Skeuomorphism is the word for designing virtual objects so that they look like real-world objects. It is also the word for over-designing in this direction.


Friday, September 14th, 2012

Partner Choice Choose your partner by Tuesday, 18 September 2012, 9:50am. One of the partners must send me an email at my CCIS address -- cc to his or her partner -- with the full names of both partners in the body.


Monday, September 3rd, 2012

Welcome to the PhD-level course on programming languages.

Preparation for First Meeting: Take an 8x11, fold it in half along the long axis, and fill one half of one page with the name of your favorite programming language. -- In the future such announcements will show up on the course notifications, called "blog".


last updated on Mon Nov 19 17:49:27 EST 2012generated with Racket