Схема определения синтаксиса R5RS игнорируется?
-
13-11-2019 - |
Вопрос
Только начал изучать Scheme.Я использую Dr.Рэкет в качестве моего компилятора/интерпретатора.
Мне нужны некоторые строковые функции (точнее, строковая замена), поэтому я скопировал из СРФИ 13.
Когда я тестирую его, он показывает..
reference to undefined identifier: let-string-start+end
Это определяется с помощью
define-syntax let-string-start+end
Кажется, это игнорируют?Что происходит на самом деле?
Решение
Вам не нужно вручную копировать и вставлять элементы из SRFI 13:он встроен в Racket.Фактически, большинство основных SRFI-библиотек включены в состав Racket: http://docs.racket-lang.org/srfi/index.html
Если вы используете р5рс языка в Racket, вы можете подключить SRFI 13 с помощью следующей строки:
(#%require srfi/13)
Странный вид #%require
является специфичным для ракетки крюк это позволяет программе r5rs загружать библиотечные модули из Racket.
Итак, программа r5rs в Racket будет выглядеть примерно так:
(#%require srfi/13)
(display (string-replace "foo world" "hello" 0 3))
(newline)
Если вместо использования основного r5rs
язык, вы используете полноценный #lang racket
вместо этого импорт SRFI 13 будет выглядеть аналогично.Вот небольшая программа в #lang racket
это делает то же самое, что и предыдущая программа:
#lang racket
(require srfi/13)
(string-replace "foo world" "hello" 0 3)
К сожалению, в сообщении об ошибке недостаточно информации для точной диагностики проблемы.Я подозреваю, что где-то неполное копирование и вставка, поскольку вы упоминаете, что скопировали из SRFI 13.Одна из причин, по которой я думаю, что вы, возможно, неправильно скопировали код, заключается в том, что вы упоминаете, что определили его с помощью:
define-syntax let-string-start+end
и в этой строке на самом деле отсутствуют некоторые важные круглые скобки;в исходном источнике в начале этой строки находится ведущая скобка.
Но не стоит пытаться вручную вырезать кусочки реализации SRFI, по крайней мере, до тех пор, пока вы не поближе познакомитесь со Scheme.Упростите задачу, загрузив всю библиотеку.