@Timebird

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

После года самостоятельного изучения 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 и функциональное программирование в целом (кроме компьютерной алгебры)? Понятно, что программы более переносимы и быстро работают, но ФП по-прежнему не популярно, это странно - почему?
  • Вопрос задан
  • 310 просмотров
Пригласить эксперта
Ответы на вопрос 1
@PallSmith
На racket это будет выглядеть вот так:

#lang racket
(require racket/date)

(define (dayNum dayVal monthVal yearVal) (date-week-day (seconds->date (find-seconds 0 0 0 dayVal monthVal yearVal))))


И в итоге вызов типа "(dayNum 24 10 2022)" вернет "1".
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы