Как соотнести значения со списком в Scheme? - Lisp

Формулировка задачи:

После года самостоятельного изучения Python в качестве первого и основного ЯП, пришел я в университет в магистратуру, где в качестве функционального ЯП предлагается писать задачи на Scheme. Привыкнув писать по императивной парадигме, спотыкаться начал практически сразу же. Например. Требуется написать программу, которая вычисляет день недели по дате. Пусть процедура принимает год-месяц-день и возвращает числа от 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])? Заранее спасибо! P.S: пользуясь случаем, спрошу: а для чего в современном мире используют lisp и функциональное программирование в целом (кроме компьютерной алгебры)? Понятно, что программы более переносимы и быстро работают, но ФП по-прежнему не популярно, это странно - почему?


textual

Код к задаче: «Как соотнести значения со списком в Scheme? - Lisp»

(define (day-of-week day month year)
  (let* ((days '(mon tue wed thu fri sat sun))
         (a (quotient (- 14 month) 12))
         (y (- year a))
         (m (+ month (* 12 a) -2))
         (result (- (remainder (+ 7000
                                  day
                                  y
                                  (quotient y 4)
                                  (- (quotient y 100))
                                  (quotient y 400)
                                  (* m 31))
                               7)
                    1)))
    (list-ref days result)))
Эта работа вам не подошла?

Вы всегда можете заказать любую учебную работу у наших авторов от 20 руб.


СДЕЛАЙТЕ РЕПОСТ

14   голосов, оценка 3.786 из 5

Источник
Похожие ответы