Проверить содержание строки в схеме

Как проверить в DrScheme, содержит ли строка заданный символ/подстроку? Как включить правильный модуль, если он определен в модуле?


person Claudiu    schedule 18.11.2009    source источник
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
comment
В схеме мы используем else, а не #t. Кроме того, почему вы хотите вернуть -1, если он не найден? - person Eli Barzilay; 18.11.2009
comment
-1 — это любой-другой-язык, кроме-схемизма. Виноват. Есть что-то, что мне лично нравится в #t. Сохраненное нажатие клавиши. Определенная симметрия. Я не хотел обидеть. - person z5h; 18.11.2009
comment
Я знаю, как другие языки используют -1 - для этого есть две причины: (а) в некоторых языках вы должны возвращать определенный тип, поэтому вам нужно найти целое число, которое не может быть нормальным результатом; (б) есть языки, которые позволяют возвращать значение любого типа, но приравнивают false к нулю. Схема не страдает ни от одной проблемы. Что касается else - вы должны, по крайней мере, знать, что расширение отличается: с #t вы в основном получаете (if #t ...), который не все схемы оптимизируют. - person Eli Barzilay; 18.11.2009
comment
У меня есть однострочник, который делает это с помощью string-›list и foldl, но я искал более чистый способ. Это выглядит более громоздко - person Claudiu; 18.11.2009