SRFI нотационные соглашения

Я читаю (смотрю) Справочное руководство Guile, но я не понимаю некоторые условные обозначения, определенные SRFI.

Обратите внимание, что Справочное руководство Guile, похоже, соответствует структуре документов SRFI. Я просмотрел исходный код на GuixSD, чтобы найти некоторые варианты использования без удачи.

Например, я не понимаю значение kons а также knil,

string-fold kons knil s [start [end]]

Гиперссылки: SRFI-13 или Guile Справочное руководство

В: Где представлены условные обозначения Схемы?

2 ответа

Решение

Эта запись для необязательных аргументов используется не только здесь. Он также используется в программе Unix.

string-fold kons knil s [start [end]]

Содержание каждой скобки является необязательным.

Означает, что это можно назвать как:

string-fold kons knil s 
string-fold kons knil s start
string-fold kons knil s start end

kons а также knil названы так, чтобы обозначить их отношения с cons а также nil где (string-fold cons nil s) <=> (string->list s) за исключением того, что он может создавать другие структуры, кроме списков, предоставляя cons как функция и nil стоимость.

Для чтения и понимания SRFI не требуется никаких предварительных знаний. Взятые прямо из SRFI в соответствии с процедурой спецификации:

  • Параметры, указанные в квадратных скобках, являются необязательными.
  • s Параметр является строкой.

Другие параметры, kons а также knil, не упоминаются и, таким образом, они являются простыми именами, которые необходимо объяснить. string-fold объясняется дважды:

Оператор левого сгиба отображает процедуру kons через строку слева направо

(... (kons s[2] (kons s[1] (kons s[0] knil))))

string-fold подчиняется (хвостовой) рекурсии:

(string-fold kons knil s start end) ; ==
(string-fold kons (kons s[start] knil) start+1 end)

Таким образом, это показывает, что:

(string-fold add-char 0 "abracadabra" 8)

такой же как:

(string-fold add-char (add-char #\b 0) "abracadabra" 9 11)

такой же как:

(add-char #\a (add-char #\r (add-char #\b 0)))

И с определением:

(define add-char 
  (let ((ma (- (char->integer #\a))))
    (lambda (char num)
      (+ (char->integer char) ma num))))

(string-fold add-char 0 "abracadabra" 8) ; ==> 18

В настоящее время kons а также knil используется во многих СРФО и очень часто в такой ситуации объединения. Это похоже на процедуры cons и имя '(), Если вы используете те:

(string-fold cons '() "abracadabra" 8) ; ==
(cons #\a (cons #\r (cons #\b '())))   ; ==> (#\a #\r #\b)

Таким образом, имена, хотя и не случайные, не должны быть поняты, чтобы читать и понимать SRFI. Все остальные SRFI имеют аналогичные спецификации. Возможно, вас заинтересует SRFI-9 Определение типов записей, который имеет следующий пример:

(define-record-type :pare
  (kons x y)
  pare?
  (x kar set-kar!)
  (y kdr))

определяет KONS как конструктор, KAR и KDR как аксессоры, SET-KAR! быть модификатором, а PARE? быть предикатом для:PAREs.

(pare? (kons 1 2))        --> #t
(pare? (cons 1 2))        --> #f
(kar (kons 1 2))          --> 1
(kdr (kons 1 2))          --> 2
(let ((k (kons 1 2)))
  (set-kar! k 3)
  (kar k))                --> 3
Другие вопросы по тегам