Separate defhsx package from hsx package

This commit is contained in:
Akira Tempaku 2024-05-28 12:33:01 +09:00
commit ead5c408e3
10 changed files with 156 additions and 150 deletions

View file

@ -2,12 +2,13 @@
(:use #:cl)
(:import-from #:alexandria
#:make-keyword)
(:import-from #:hsx/hsx
(:import-from #:hsx/defhsx
#:defhsx))
(in-package #:hsx/builtin)
(defmacro define-and-export-builtin-elements (&rest names)
`(progn
`(eval-when (:compile-toplevel :load-toplevel :execute)
,@(mapcan (lambda (name)
(list `(defhsx ,name ,(string-downcase name))
`(export ',name)))

35
src/defhsx.lisp Normal file
View file

@ -0,0 +1,35 @@
(uiop:define-package #:hsx/defhsx
(:use #:cl)
(:import-from #:alexandria
#:symbolicate)
(:import-from #:hsx/element
#:create-element)
(:export #:defhsx
#:defcomp))
(in-package #:hsx/defhsx)
(defmacro defhsx (name element-type)
`(eval-when (:compile-toplevel :load-toplevel :execute)
(defmacro ,name (&body body)
(multiple-value-bind (props children)
(parse-body body)
`(create-element ,',element-type (list ,@props) ,@children)))))
(defun parse-body (body)
(if (keywordp (first body))
(loop :for thing :on body :by #'cddr
:for (k v) := thing
:when (and (keywordp k) v)
:append (list k v) :into props
:when (not (keywordp k))
:return (values props thing)
:finally (return (values props nil)))
(values nil body)))
(defmacro defcomp (name props &body body)
(let ((%name (symbolicate '% name)))
`(eval-when (:compile-toplevel :load-toplevel :execute)
(defun ,%name ,props
,@body)
(defhsx ,name (fdefinition ',%name)))))

View file

@ -7,6 +7,7 @@
#:expand-component))
(in-package #:hsx/element)
;;;; class definitions
(defclass element ()

View file

@ -1,45 +1,9 @@
(uiop:define-package #:hsx/hsx
(:use #:cl)
(:import-from #:alexandria
#:symbolicate)
(:import-from #:hsx/element
#:create-element)
(:export #:defhsx
#:defcomp
#:hsx))
(:export #:hsx))
(in-package #:hsx/hsx)
;;;; hsx definitions
(defmacro defhsx (name element-type)
(eval-when (:compile-toplevel :load-toplevel :execute)
`(defmacro ,name (&body body)
(multiple-value-bind (props children)
(parse-body body)
`(create-element ,',element-type (list ,@props) ,@children)))))
(defun parse-body (body)
(if (keywordp (first body))
(loop :for thing :on body :by #'cddr
:for (k v) := thing
:when (and (keywordp k) v)
:append (list k v) :into props
:when (not (keywordp k))
:return (values props thing)
:finally (return (values props nil)))
(values nil body)))
(defmacro defcomp (name props &body body)
(let ((%name (symbolicate '% name)))
`(eval-when (:compile-toplevel :load-toplevel :execute)
(defun ,%name ,props
,@body)
(defhsx ,name (fdefinition ',%name)))))
;;;; hsx macro to find hsx symbols
(defmacro hsx (&body form)
(when (not (= (length form) 1))
(error "The body of the hsx macro must be a single form."))

View file

@ -1,6 +1,7 @@
(uiop:define-package :hsx
(:nicknames #:hsx/main)
(:use #:cl)
(:use-reexport #:hsx/hsx)
(:import-from #:hsx/builtin))
(:use-reexport #:hsx/defhsx)
(:import-from #:hsx/builtin)
(:use-reexport #:hsx/hsx))
(in-package :hsx)