a
Size: a a a
a
M
ND
M
ND
ND
M
ND
ND
M
ND
y
cut
из SRFI-26, которая будет работать и на вложенных списках. То есть (cut* + (- <> <>) <>)
будет раскрываться во что-то вроде (lambda (x1 x2 x3) (+ (- x1 x2) x3))
(по дефолту cut такое не умеет). Реализовать обычную версию получилось нормально (с обработкой <...>
пока не заморачивался):
;; Принимает список аргументов для лямбды, список, являющийся телом лямбды и необработанные символы
(define-syntax internal-cut*
(syntax-rules (<>)
;; Конец обработки, генерация конечной лямбды
((_ (slot-name ...) (func arg ...))
(lambda (slot-name ...) (func arg ...)))
;; Обработка <>
((_ (slot-name ...) (processed ...) <> . slots-or-exprs)
(internal-cut* (slot-name ... x) (processed ... x) . slots-or-exprs))
;; Обработка не <>
((_ (slot-name ...) (processed ...) not-diamond . slots-or-exprs)
(internal-cut* (slot-name ...) (processed ... not-diamond) . slots-or-exprs))))
(define-syntax cut*
(syntax-rules ()
((_ . slots-or-exprs)
(internal-cut* () () . slots-or-exprs))))
;; Принимает список аргументов для лямбды, список, являющийся телом лямбды и необработанные символы
(define-syntax internal-cut*
(syntax-rules (<>)
;; Конец обработки, генерация конечной лямбды
((_ (slot-name ...) (func arg ...))
(lambda (slot-name ...) (func arg ...)))
;; Обработка <>
((_ (slot-name ...) (processed ...) <> . slots-or-exprs)
(internal-cut* (slot-name ... x) (processed ... x) . slots-or-exprs))
;; Обработка списка с <>
((_ (slot-name ...) (processed ...) (before ... <> after ...) . slots-or-exprs)
(internal-cut* (slot-name ... x) (processed ... (before ... x after ...)) . slots-or-exprs))
;; Обработка всего прочего
((_ (slot-name ...) (processed ...) not-diamond . slots-or-exprs)
(internal-cut* (slot-name ...) (processed ... not-diamond) . slots-or-exprs))))
While compiling expression:
Syntax error:
unknown file:3489:43: syntax-case: misplaced ellipsis in form (dummy (slot-name ...) (processed ...) (before ... <> after ...) . slots-or-exprs)
(define-syntax test
(syntax-rules ()
((_ before ... after ...)
(- (+ before ...) (+ after ...)))))
AP
(_ before ... after ...)Лисп не может понять, где заканчивается набор
before
, и где начинается after
.y
y
DP
Aß
Aß
AP