scheme - Recursive range in Lisp adds a period? -


(define ..   (lambda (start stop)     (cond ((> (add1 start) stop) (quote ()))           ((eq? (add1 start) stop) (sub1 stop))           (else (cons start (.. (add1 start) stop)))))) 

i have defined simple range function. intent for

(.. 1 5)  -->  (1 2 3 4) 

instead, bizarre period being added tuple , have no idea why:

(.. 1 5)  -->  (1 2 3 . 4) 

i don't understand why happening. appreciated

a list in scheme either empty list () (also known nil in lisps), or cons cell car (also known first) element of list , cdr (also known rest) either rest of list (i.e., list), or atom terminates list. conventional terminator empty list (); lists terminated () said "proper lists". lists terminated other atom called "improper lists". list (1 2 3 4 5) contains elements 1, 2, 3, 4, , 5, , terminated (). construct

(cons 1 (cons 2 (cons 3 (cons 4 (cons 5 ()))))) 

now, when system prints cons cell, general case print

(car . cdr) 

for instance, result of (cons 1 2) printed

(1 . 2) 

since lists built of cons cells, can use notation lists too:

'(1 2 3 4 5) == '(1 . (2 . (3 . (4 . (5 . ()))))) 

that's rather clunky, though, lisps (all know of) have special case printing cons cells: if cdr list (either cons cell, or ()), don't print ., , don't print surrounding parenthesis of cdr (which otherwise have, since it's list). so, if you're seeing result

(1 2 3 . 4) 

it means you've got improper list terminated atom 4. has structure

(1 . (2 . (3 . 4))) 

now question is: in code did list construction go awry? .. supposed return proper list, let's @ cases: first case returns proper list (the empty list):

((> (add1 start) stop) (quote ())) 

the second case looks can return that's not list (assuming (sub1 stop) == (- stop 1)):

((eq? (add1 start) stop) (sub1 stop)) 

now, if .. functioning correctly, third case returning proper list (since (cons x y) proper list if y is):

(else (cons start (.. (add1 start) stop))) 

make second case return list , should set.


Comments

Popular posts from this blog

Perl - how to grep a block of text from a file -

delphi - How to remove all the grips on a coolbar if I have several coolbands? -

javascript - Animating array of divs; only the final element is modified -