Как соотнести значения со списком в 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 и функциональное программирование в целом (кроме компьютерной алгебры)? Понятно, что программы более переносимы и быстро работают, но ФП по-прежнему не популярно, это странно - почему?

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

textual
Листинг программы
(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)))

Объяснение кода листинга программы

В данном коде на языке Scheme определяется функция day-of-week, которая принимает три аргумента: day, month и year. Внутри функции используется оператор let* для определения нескольких вспомогательных переменных:

  1. days — список дней недели.
  2. a — значение переменной month, приведенное к числовому виду (вспомогательная переменная для вычисления значения переменной y).
  3. y — значение переменной year, приведенное к числовому виду (год).
  4. m — значение переменной month, приведенное к числовому виду (вспомогательная переменная для вычисления значения переменной result).
  5. result — результат вычисления, который должен быть равен числу от 0 до 6, где 0 соответствует воскресенью, а 6 - субботе. Далее идет вычисление значения переменной result с использованием математических операций и значений переменных month, year, a и m. В конце функции возвращается значение переменной result, которое будет соответствовать дню недели, определенному входными аргументами. В данном коде используется функция list-ref для получения элемента списка days с индексом result.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

14   голосов , оценка 3.786 из 5
Похожие ответы