Some changes

This commit is contained in:
2023-01-01 16:19:01 -08:00
parent 271319297d
commit 06142dec66
3 changed files with 118 additions and 56 deletions
+40 -15
View File
@@ -32,29 +32,54 @@
{ :clear true })
:pattern ,pattern_table
:callback ,callback })))
;; Utility functions for use!
(lambda create-list-entries [...]
(let [output { :active-entry nil
:entries {} }]
(lambda output.process [self entry]
(var result false)
(when self.active-entry
(if (and (. self :entries self.active-entry :is-first)
(not (list? entry)))
(do (tset self :entries self.active-entry :data entry)
(set self.active-entry nil)
(set result true))
(= (type entry) :string)
(set self.active-entry nil)
(do (table.insert (. self :entries self.active-entry :data) entry)
(tset self :entries self.active-entry :is-first false)
(set result true))))
(when (and (= (type entry) :string) (. self :entries entry))
(assert-compile (not (. self :entries entry :present))
(.. "':" entry "' cannot appear more than once in `use'"))
(set self.active-entry entry)
(tset self :entries entry :present true)
(set result true))
result)
(lambda output.splice-into [self other]
(each [name entry (pairs self.entries)]
(when entry.present
(tset other name entry.data))))
(each [_ val (ipairs [...])]
(tset output :entries val { :present false :is-first true :data `(lambda [])}))
output))
;; Nicer macro for use
;; :config acts like use-package's :init and :config options,
;; taking in the following lisp expressions as its arguments
(lambda use! [repo ...]
(local output [ repo ])
(var last_key nil)
(var config_mode false)
(var has_config false)
(var config_entries (list `lambda []))
(var list_entries (create-list-entries :config :setup
:run))
(each [_ val (ipairs [...])]
(if config_mode
(if (= (type val) :string)
(set config_mode false)
(table.insert config_entries val))
last_key
(do (tset output last_key val)
(set last_key nil))
(= val :config)
(do (set config_mode true)
(set has_config true))
(if last_key
(do (tset output last_key val)
(set last_key nil))
(not (list_entries:process val))
(set last_key val)))
(if has_config
(tset output :config config_entries))
(list_entries:splice-into output)
`(use ,output))
;; Call a plugin's `setup function'