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