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

Узнай цену своей работы

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

После года самостоятельного изучения Python в качестве первого и основного ЯП, пришел я в университет в магистратуру, где в качестве функционального ЯП предлагается писать задачи на Scheme. Привыкнув писать по императивной парадигме, спотыкаться начал практически сразу же. Например. Требуется написать программу, которая вычисляет день недели по дате. Пусть процедура принимает год-месяц-день и возвращает числа от 0 (понедельник) до 6 (воскресенье). Покопавшись по вопросу реализации подобного алгоритма, набрёл на интересное решение на Python:
Листинг программы
  1. def whatDay(day, month, year):
  2. days = ["пн","вт","ср","чт","пт","сб","вс"]
  3. a = (14 - month) // 12
  4. y = year - a
  5. m = month+12 * a-2
  6. result = ((7000 + (day + y + y//4 - y//100 + y//400 + (31*m) // 12)) % 7) - 1
  7. return days[result]
Не получается перестроить данное решение под, собственно, Scheme. Пробовал так:
Листинг программы
  1. (define (day-of-week day month year)
  2. (list mon, tue, wed, thu, fri, sat, sun)
  3. (define (calculate-a month)
  4. (quotient (- 14 month) 12))
  5. (define (calculate-y year calculate-a)
  6. (- year calculate-a))
  7. (define (calculate-m month calculate-a)
  8. (- (+ (* 12 calculate-a) month) 2)))
  9. (define (calculate-result calculate-y day calculate-m)
  10. (- (remainder
  11. (+ (-
  12. (+ (quotient (* 31 calculate-m) 12)
  13. (quotient calculate-y 400)
  14. (quotient y 4)
  15. day
  16. calculate-y)
  17. (calculate-y 100))
  18. 7000)
  19. 7)
  20. 1)
Можете, пожалуйста, подсказать по следующему:

Как сопоставить каждому элементу в списке результат выполнения программы (то есть сделать аналог питоновского

return days[result]

)?

Заранее спасибо! P.S: пользуясь случаем, спрошу: а для чего в современном мире используют lisp и функциональное программирование в целом (кроме компьютерной алгебры)? Понятно, что программы более переносимы и быстро работают, но ФП по-прежнему не популярно, это странно - почему?

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

textual
Листинг программы
  1. (define (day-of-week day month year)
  2.   (let* ((days '(mon tue wed thu fri sat sun))
  3.          (a (quotient (- 14 month) 12))
  4.          (y (- year a))
  5.          (m (+ month (* 12 a) -2))
  6.          (result (- (remainder (+ 7000
  7.                                   day
  8.                                   y
  9.                                   (quotient y 4)
  10.                                   (- (quotient y 100))
  11.                                   (quotient y 400)
  12.                                   (* m 31))
  13.                                7)
  14.                     1)))
  15.     (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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы