Another theory is that there are far fewer symbols in Lisp than python or coffeewhatever, making it easier to read.
grade = (student) ->
if student.excellentWork
"A+"
else if student.okayStuff
if student.triedHard then "B" else "B-"
else
"C"
(from coffescript examples)Imagine how many more symbols that would have in any lisp dialect
(defun grade (student)
(cond ((excellent-work student) :a+)
((okay-stuff student) (if (tried-hard student) :b :b-))
(t :c))) grade(#student{work=Work, tried_hard=Tried}) -> grade1(Work, Tried).
grade1(excellent_work, _) -> 'a+';
grade1(okay_stuff, yes) -> b;
grade1(okay_stuff, _) -> 'b-';
grade1(_, _) -> c.
Edit: formatting. grade(Student, Grade) :-
worked(Student, Work), work_grade(Work, Student, Grade).
work_grade('Excellent', _, 'A+').
work_grade('Okay', Student, 'B') :- tried_hard(Student).
work_grade('Okay', _, 'B-').
work_grade(_, _, 'C').
I'm a bit rusty, and I don't have a Prolog interpreter to hand to test, so I might have got some syntax wrong. dostuff(x)
is considered so much more readable than (dostuff x) ;; comparing with racket:
(define (grade student)
(cond
[(excellent-work student) "A+"]
[(and (okay-stuff student) (tried-hard student)) "B"]
[(okay-stuff student) "B-"]
[else "C"]))
;; Or
(require racket/match)
(define (grade student)
(match (map (lambda (fn) (fn student))
'(excellent-work okay-stuff tried-hard))
[(list #t _ _) "A+"]
[(list _ #t #t) "B"]
[(list _ #t _) "B-"]
[else "C"])) (defn grade [student]
(cond
(excellent-work student) "A+"
(okay-stuff student) (if (tried-hard student) "B" "B-")
:else "C"))