Size: a a a

Сообщество Scheme

2020 December 01

D

Doshich in Сообщество Scheme
Ну вообще да, я тоже думал, что на уровне ридера все решить можно
источник

D

Doshich in Сообщество Scheme
Pig Greenest
ты можешь написать функцию которая работает с синтаксисом и применить её перед syntax-case, например
@greenest_pig , я почитал и не понял немного...

Вот у меня есть макрос header, который парсит (пока динамически) хедеры и вызывает объявления ffi функций. Я хочу, чтобы это исполнилось до того, как начнется непосредственно код из вызова. Видимо, ещё на нулевом этапе, ибо идентификаторы вида printf, к моменту, когда их встречает ракет, ещё не доступны...
источник

D

Doshich in Сообщество Scheme
Я думал в ракете это будет работать в виде препроцессинга и ему будет все равно на конструкции, объявлено там что-то или нет
источник

PG

Pig Greenest in Сообщество Scheme
если ты его через define-syntax-rule сделал, то он не будет работать
источник

PG

Pig Greenest in Сообщество Scheme
точнее он корректно раскрывается, но выполняеться будет только со всем остальным файлом
источник

D

Doshich in Сообщество Scheme
Ага, понятно
Надо сделать через дефайн-синтакс?
источник

PG

Pig Greenest in Сообщество Scheme
+
источник

PG

Pig Greenest in Сообщество Scheme
(define-syntax use
 (lambda (stx)
   (let [(lib-name (... stx))]
     ...)))

(define-syntax header
 (lambda (stx)
   (let [(path (... stx))]
     (map (lambda (...)
            #`(define #,fn ...))
          (parse-header path)))))
источник

PG

Pig Greenest in Сообщество Scheme
как-то так
источник

D

Doshich in Сообщество Scheme
Спасибо!
источник

PG

Pig Greenest in Сообщество Scheme
это оочень абстрактный псевдокод
источник

D

Doshich in Сообщество Scheme
Мне пишет, что экспандер вернул не синтаксис 😳
источник

D

Doshich in Сообщество Scheme
(а процедуру)
источник

PG

Pig Greenest in Сообщество Scheme
показывай
источник

A

Aragaer in Сообщество Scheme
ну да, оно не совсем так пишется
источник

A

Aragaer in Сообщество Scheme
(define-syntax opcode
 (syntax-rules ()
   ((opcode name func o1t o2t)
    (let ((name (lambda (regs args)
                  (let ((op1 (if (eq? o1t 'r) (nth regs (first args)) (first args)))
                        (op2 (if (eq? o2t 'r) (nth regs (second args)) (second args))))
                    (map (lambda (i val)
                           (if (= i (third args)) (func op1 op2) val)) '(0 1 2 3) regs)))))
      (push! name *all-opcodes*)))))
источник

A

Aragaer in Сообщество Scheme
вот пример
источник

A

Aragaer in Сообщество Scheme
после чего я это использовал следующим образом
источник

A

Aragaer in Сообщество Scheme
(opcode addr + 'r 'r)
(opcode addi + 'r 'i)
(opcode mulr * 'r 'r)
(opcode muli * 'r 'i)
(opcode banr bitwise-and 'r 'r)
(opcode bani bitwise-and 'r 'i)
(opcode borr bitwise-ior 'r 'r)
(opcode bori bitwise-ior 'r 'i)
(opcode setr (lambda (a b) a) 'r 'i)
(opcode seti (lambda (a b) a) 'i 'i)
(opcode gtir i> 'i 'r)
(opcode gtri i> 'r 'i)
(opcode gtrr i> 'r 'r)
(opcode eqir i= 'i 'r)
(opcode eqri i= 'r 'i)
(opcode eqrr i= 'r 'r)
источник

PG

Pig Greenest in Сообщество Scheme
все таки syntax-rules?
источник