Как получить возвращаемое значение `string-search-forward` в Scheme? - PullRequest
2 голосов
/ 23 апреля 2011

Я хочу написать процедуру (функцию), которая проверяет, содержит ли строка другую строку.Я прочитал документацию по библиотеке строк из http://sicp.ai.mit.edu/Fall-2004/manuals/scheme-7.5.5/doc/scheme_7.html

. Согласно им,

Шаблон должен быть строкой.Поиск строки для самого правого вхождения шаблона подстроки.В случае успеха возвращается индекс справа от последнего символа совпадающей подстроки;в противном случае возвращается #f.

Это показалось мне странным, поскольку возвращаемое значение является целым или логическим, так с чем мне сравнивать возвращаемое значение?

Я пытался

(define (case-one str)
  (if (= #f (string-search-forward "me" str))
      #t
      #f))

DrScheme не нравится,

expand: unbound identifier in module in: string-search-forward

Спасибо,

Ответы [ 4 ]

2 голосов
/ 23 апреля 2011

Схема имеет очень маленькую стандартную библиотеку, которая является и благословением (вы можете сделать небольшие реализации схемы для встраивания в приложение или устройство, вы можете быстро выучить язык) и проклятием (в нем отсутствует много полезных функций),string-search-forward - это нестандартная функция схемы MIT, ее нет в DrScheme.

Многие библиотечные дополнения доступны в виде SRFIs .SRFI - это принятое сообществом расширение базового языка - его можно рассматривать как дополнительную часть реализации Схемы.DrScheme (или, по крайней мере, его преемник Racket) реализует множество SRFI .

DrScheme имеет ряд строковых функций как часть SRFI 13 .Среди функций поиска строки есть string-contains, что аналогично, за исключением того, что она принимает аргументы в обратном порядке.

(require srfi/13)
(define (case-one str)
  (integer? (string-contains str "me")))

Вы будетеобратите внимание, что в двух реализациях использовался другой порядок аргументов (что указывает на то, что они были разработаны независимо), но при этом используется одно и то же возвращаемое значение.Это показывает, что в Scheme вполне естественно иметь функцию, возвращающую разные типы в зависимости от того, что она передает.В частности, довольно распространено, чтобы функция возвращала полезную информацию, если она может выполнять свою работу, или #f, если она не может выполнять свою работу.Таким образом, функция естественным образом объединяет выполнение своей работы (здесь, возвращая индекс подстроки) с проверкой, выполнимо ли задание (здесь, проверяя, происходит ли подстрока).

2 голосов
/ 23 апреля 2011

string-search-forward не является стандартизированной процедурой Схемы;это расширение, характерное для реализации схемы MIT (поэтому ваша ссылка идет в «Справочное руководство по схеме MIT».) Чтобы увидеть только те процедуры, которые гарантированы, посмотрите документ R5RS.

В схеме #f - это значение only , которое означает «ложь», а все остальное при использовании в условном выражении будет означать «истина».Поэтому нет смысла «сравнивать» это с чем-либо.В таких случаях, как string-search-forward, который возвращает смешанные типы, вы обычно записываете возвращаемое значение в переменную для проверки его, а затем используете его, если оно не ложно:

(let ((result (string-search-forward "me" str)))
  (if result
      (munge result) <i>; Execute when S-S-F is successful (<b>result</b> is the index.)</i>
      (error "hurf") <i>; Execute when S-S-F fails (<b>result</b> has the value <b>#f</b>.)</i>
))

Более продвинутая тактика - использовать cond с предложением =>, которое в некотором смысле является сокращением для вышеупомянутого:

(cond ((string-search-forward "me" str) => munge)
      (else (error "hurf")))

Такая форма (<test> => <expression>) означает, что если <test> является истинным значением, то <expression> являетсяоценивается, что должно быть процедурой с одним аргументом;эта процедура вызывается со значением <test> в качестве аргумента.

1 голос
/ 23 апреля 2011

Попробуйте использовать строковый индекс srfi-13: http://docs.racket -lang.org / srfi-std / srfi-13.html # Поиск Документация, которую вы просматриваете, не предназначена специально для PLT.и, вероятно, соответствует какой-то другой версии Схемы.

1 голос
/ 23 апреля 2011

Сообщение об ошибке кажется немного странным (к сожалению, я не установил drscheme, поэтому не могу исследовать слишком много).

Вы уверены, что str является строкой?

Дополнительно = только для целочисленных сравнений, вместо них можно использовать false?.

Что касается возвращаемого значения string-search-forward, имеющего смешанные типы, схема предполагает, что, если какое-либо полезное значение может быть возвращено, оно должно быть возвращено, поэтому это означает, что различные типы возвращаемых значений являются общими для функций.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...