Как проверить в DrScheme, содержит ли строка заданный символ/подстроку? Как включить правильный модуль, если он определен в модуле?
Проверить содержание строки в схеме
comment
Как указал Виджай, Scheme определяет только очень минимальный базовый язык. Какие реализации Схемы вы используете?
- person z5h   schedule 18.11.2009
Ответы (3)
В DrScheme, при условии, что язык установлен на «Модуль», будет работать следующее
#lang scheme
(require (lib "13.ss" "srfi"))
(string-contains "1234abc" "abc")
person
z5h
schedule
18.11.2009
Стандартной процедуры для этого не существует. SRFI 13 содержит нужную вам процедуру (string-index). Пожалуйста, проверьте, реализует ли ваша схема этот SRFI.
person
Vijay Mathew
schedule
18.11.2009
Вот быстрый хак. Он возвращает индекс (на основе 0) строки s в строке t. Или #f, если не найдено. Вероятно, это не лучший способ сделать это, если ваша схема поддерживает SRFI-13 или другую встроенную поддержку.
Код отредактирован. Спасибо Эли за предложения.
(define (string-index s t)
(let* ((len (string-length s))
(max (- (string-length t) len)))
(let loop ((i 0))
(cond ((> i max)
#f)
((string=? s
(substring t i (+ i len)))
i)
(else (loop (+ i 1)))))))
person
z5h
schedule
18.11.2009
В схеме мы используем
else
, а не #t
. Кроме того, почему вы хотите вернуть -1, если он не найден?
- person Eli Barzilay; 18.11.2009
-1 — это любой-другой-язык, кроме-схемизма. Виноват. Есть что-то, что мне лично нравится в #t. Сохраненное нажатие клавиши. Определенная симметрия. Я не хотел обидеть.
- person z5h; 18.11.2009
Я знаю, как другие языки используют -1 - для этого есть две причины: (а) в некоторых языках вы должны возвращать определенный тип, поэтому вам нужно найти целое число, которое не может быть нормальным результатом; (б) есть языки, которые позволяют возвращать значение любого типа, но приравнивают false к нулю. Схема не страдает ни от одной проблемы. Что касается
else
- вы должны, по крайней мере, знать, что расширение отличается: с #t
вы в основном получаете (if #t ...)
, который не все схемы оптимизируют.
- person Eli Barzilay; 18.11.2009
У меня есть однострочник, который делает это с помощью string-›list и foldl, но я искал более чистый способ. Это выглядит более громоздко
- person Claudiu; 18.11.2009