list = (l) => l.length == 0 ?
  null : cons(l[0], list(l.slice(1)))

assertEqual(list('A', 'B', 'C'),
            ['A', ['B', ['C', null]]])
assertEqual(list(list('A', 'B'), 'C'),
            [['A', ['B', null]], ['C', null]])
assertEqual(list('A', 'B', list('C', 'D')),
            ['A', ['B', [['C', ['D', null]], null]]])
assertEqual(list('A'),
            ['A', null])
assertEqual(list(list('A')),
            [['A', null], null])
assertEqual(list('A', cons('B', 'C')),
            ['A', [['B', 'C'], null]])
assertEqual(car(list('A', 'B', 'C')),
            'A')
assertEqual(cdr(list('A', 'B', 'C')),
            list('B', 'C'))
assertEqual(cons('A', list('B', 'C')),
            list('A', 'B', 'C'))
assertEqual(car(list(list('A', 'B'), 'C')),
            list('A', 'B'))
assertEqual(car(cdr(list('A', 'B', 'C'))),
            'B')
