После года самостоятельного изучения Python в качестве первого и основного ЯП, пришел я в университет в магистратуру, где в качестве функционального ЯП предлагается писать задачи на Scheme (R5RS).
Привыкнув писать по императивной парадигме, спотыкаться начал практически сразу же.
Например. Требуется написать программу, которая вычисляет день недели по дате. Пусть процедура принимает год-месяц-день и возвращает числа от 0 (понедельник) до 6 (воскресенье).
Покопавшись по вопросу реализации подобного алгоритма, набрёл на интересное решение на Python:
def whatDay(day, month, year):
days = ["пн","вт","ср","чт","пт","сб","вс"]
a = (14 - month) // 12
y = year - a
m = month+12 * a-2
result = ((7000 + (day + y + y//4 - y//100 + y//400 + (31*m) // 12)) % 7) - 1
return days[result]
Не получается перестроить данное решение под, собственно, Scheme. Пробовал так:
(define (day-of-week day month year)
(list mon, tue, wed, thu, fri, sat, sun)
(define (calculate-a month)
(quotient (- 14 month) 12))
(define (calculate-y year calculate-a)
(- year calculate-a))
(define (calculate-m month calculate-a)
(- (+ (* 12 calculate-a) month) 2)))
(define (calculate-result calculate-y day calculate-m)
(- (remainder
(+ (-
(+ (quotient (* 31 calculate-m) 12)
(quotient calculate-y 400)
(quotient y 4)
day
calculate-y)
(calculate-y 100))
7000)
7)
1)
Можете, пожалуйста, подсказать по следующему:
- Как сопоставить каждому элементу в списке результат выполнения программы (то есть сделать аналог питоновского
return days[result])?
- Почему даже на данном этапе компилятор выбивает ошибку r5rs:body: no expression in body?
Заранее спасибо!
P.S: пользуясь случаем, спрошу: а для чего в современном мире используют lisp и функциональное программирование в целом (кроме компьютерной алгебры)? Понятно, что программы более переносимы и быстро работают, но ФП по-прежнему не популярно, это странно - почему?