Long time no see! I’ve entirely moved on from vanilla R5RS over to Chicken
Scheme and I am now much more sane. My environment for this setup just involves
Atom for editing text (along with a Scheme syntax package) and the Chicken
compiler. Sadly I use windows at home and getting gcc to work correctly is a
royal pain so running my programs usually involves testing them interactively.
No .exes for me :(
Anyway, The chicken scheme library is great and definitely gives me the
impression that it’s suited to real world tasks instead of just education.
Daily Programmer
I’ve had a long absence and this weekend had a large spurt of interest in Scheme
again so I did a few of the easier
/r/dailyprogrammer challenges to get
myself re-acquainted. These have been more helpful in learning the library that
comes with Chicken Scheme rather than Scheme itself, but anyway, let’s step
through a few of the challenges and talk through some code
Challenge 1
Challenge
Your job is to create a program that lists all places within the range of
0-100 in spoken English, excluding the placing (X) of your winning pup. A
reader should see a neatly formatted list of placements from 0-100 in spoken
English, excluding your dog’s placement.
Here’s an example in the case of a 1st place finish; 0th, 2nd, 3rd, 4th, 5th,
6th, 7th, 8th, 9th, 10th, 11st, 12nd, 13rd, 14th, 15th, 16th, 17th, 18th, 19th,
20th …etc
(Note the exclusion of the 1st)
Result
;not exactly elegant...
(define number-suffix '(
(1 . "st")
(2 . "nd")
(3 . "rd")
(0 . "th")
(4 . "th")
(5 . "th")
(6 . "th")
(7 . "th")
(8 . "th")
(9 . "th")))
;loop 'times' times and omit 'position' from the output
(define loop
(lambda (times position)
(cond
((= times position) (loop (sub1 times) position))
(else
(display
(string-append
(number->string times)
(get-suffix (last-digit times)) "\n"))
(if (> times 1)
(loop (sub1 times) position))))))
(define get-suffix
(lambda (key)
(cdr (assq (char->number key) number-suffix))))
; 10934 -> 4
; 503 -> 3
(define last-digit
(lambda (digit)
(string-ref
(number->string digit)
(- (string-length (number->string digit)) 1))))
; #\0 -> 0
; #\4 -> 4
(define char->number
(lambda (char)
(- (char->integer char) 48)))
(loop 100 6)
Challenge link