(I'm talking to myself, a bad sign!)

> If I was serious about "improper = length 1" then it should be "(+ a . 
> z)"instead.

Hmm, now that I've played with it, I think we should rule that the "improper" 
end of a list has length zero, not length 1. After all, if the empty list is in 
that final position, then we'd say it is length 0.  So basically, wherever the 
list ends at a not-pair, that's when we stop counting.  This rule is simple, 
and it generalizes the list processing in a few places to ask about "not pair?" 
instead of "null?".  That seems like the plausibly-correct semantics.

Remarkably, this *reduces* the implementation code by one line, because it no 
longer has to include a special case test to  reject improper lists.

Examples - given these:
{1 + 2}
{ . x}
{1 . x}
{1 + . x}
{1 + 2 . x}
{1 + 2 + . x}
{1 + 2 + 3 . x}
{1 + 2 + 3 + . x}

This interpretation yields these:
(+ 1 2)
(nfx . x)
(nfx 1 . x)
(nfx 1 + . x)
(+ 1 2 . x)
(nfx 1 + 2 + . x)
(+ 1 2 3 . x)
(nfx 1 + 2 + 3 + . x)


A Common Lisp implementation has to be careful, because empty lists *are* lists 
in CL (it slightly different semantics than Scheme regarding empty lists), but 
it'd be no harder to implement in Common Lisp.

Comments?

--- David A. Wheeler


--- srfi-neoteric.scm   2012-08-17 08:30:11.016314393 -0400
+++ ,2  2012-08-17 10:09:40.660663736 -0400
@@ -95,16 +95,15 @@
 
   ; Return true if lyst has an even # of parameters, and the (alternating)
   ; first parameters are "op".  Used to determine if a longer lyst is infix.
   ; If passed empty list, returns true (so recursion works correctly).
   (define (even-and-op-prefix? op lyst)
     (cond
-      ((null? lyst) #t)
-      ((not (pair? lyst)) #f) ; Not a list.
+      ((not (pair? lyst)) #t) ; We're at end of list; improper lists allowed.
       ((not (eq? op (car lyst))) #f) ; fail - operators not the same
-      ((null? (cdr lyst)) #f) ; fail - wrong # of parameters in lyst.
+      ((not (pair? (cdr lyst))) #f) ; fail - wrong # of parameters in lyst.
       (#t (even-and-op-prefix? op (cddr lyst))))) ; recurse.
 
   ; Returns true if item is member of lyst, else false.
   (define (ismember? item lyst)
      (pair? (member item lyst)))
 
@@ -118,13 +117,13 @@
                              ; this way for performance)
       (symbol? (cadr lyst))  ; 2nd parameter must be a symbol.
       (even-and-op-prefix? (cadr lyst) (cdr lyst)))) ; true if rest is simple
 
   ; Return alternating parameters in a lyst (1st, 3rd, 5th, etc.)
   (define (alternating-parameters lyst)
-    (if (or (null? lyst) (null? (cdr lyst)))
+    (if (or (not (pair? lyst)) (not (pair? (cdr lyst))))
       lyst
       (cons (car lyst) (alternating-parameters (cddr lyst)))))
 
   ; Transform a simple infix list - move 2nd parameter into first position,
   ; followed by all the odd parameters.  Thus (3 + 4 + 5) => (+ 3 4 5).
   (define (transform-simple-infix lyst)

------------------------------------------------------------------------------
Live Security Virtual Conference
Exclusive live event will cover all the ways today's security and 
threat landscape has changed and how IT managers can respond. Discussions 
will include endpoint security, mobile security and the latest in malware 
threats. http://www.accelacomm.com/jaw/sfrnl04242012/114/50122263/
_______________________________________________
Readable-discuss mailing list
Readable-discuss@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/readable-discuss

Reply via email to