Как заставить переменные / входные данные обрабатываться как различные типы в схеме? - PullRequest
0 голосов
/ 27 февраля 2020

Я пытаюсь написать функцию рекурсивной схемы, которая анализирует строку и возвращает сумму всех числовых символов в строке.

Я думаю, мне нужно будет сделать что-то вроде этого:

(define (sumNums s)
    (if (null? s) 1
        (if (char-numeric? (car s))
            (+ ((car s) (sumNums (cdr s))))
            (sumNums(cdr s)))))

Всякий раз, когда я пытаюсь запустить его со строкой в ​​качестве аргумента, он выдает мне сообщение о том, что ожидает пару. Как указать в функции, что я дам ей строку?

Кроме того, у меня возникают проблемы при передаче (car) в качестве символа для процедуры (char-Numberri c?). Просто используя простой пример функции:

(define (isDigit c)
    (if(char-numeric? c)
        (display "is a number")
        (display "is not a number")))

(isDigit #\5)

Если я явно включаю # \ перед входом в вызов функции, как указано выше, он работает правильно. Но есть ли какой-либо способ внутри функции заставить ее интерпретировать входные данные как символ?

(define (isDigit #\c)
    (if(char-numeric? c)
        (display "is a number")
        (display "is not a number")))

Я попробовал вышеуказанную функцию, и она выдает ошибку для unbound c. Это:

(isDigit #\(5))

тоже не работает. Так что в схеме я даже не могу заставить ее заставить выражение (5) интерпретировать как символ 5?

Большое спасибо за помощь, я только начинаю изучать схему и нахожу ее очень неинтуитивной .

1 Ответ

1 голос
/ 28 февраля 2020

Используйте string->list для преобразования вашей входной строки s в список символов:

(define (sum-nums s)
  (let ((s (string->list s)))
    ...

Вам также необходимо преобразовать символ цифры 1025 в десятичное число. git, для которого вам понадобится (- (char->integer (car s)) (char->integer #\0)).

РЕДАКТИРОВАТЬ: Извините. Я пропустил требование, чтобы решение было рекурсивным. Возможно, вам потребуются две функции:

(define (sum-digits str)
  (sum-digits-aux (string->list str) 0))

Первая функция преобразует строку в список символов и вызывает вспомогательную функцию с начальной суммой 0. Вторая функция вычисляет сумму:

(define (sum-digits-aux cs sum)
  (cond ((null? cs) ...)
        ((char-numeric? cs) ...)
        (else ...)))

У cond есть три предложения: первое предложение завершает рекурсию и возвращает результат; второй пункт обрабатывает цифры c символов; в третьем пункте обрабатываются нечисловые c символы.

Я оставлю вам право заполнять точки.

...