Finish up ep 10 on macros
这个提交包含在:
父节点
cb32a5873e
当前提交
c29511a3cc
|
@ -29,12 +29,12 @@
|
|||
(require 'fg42/utils)
|
||||
|
||||
(defvar fg42/after-cubes-setup-hook nil
|
||||
"A hook that will be run after all the active cubes got setup. This hook
|
||||
is dedicated for the codes that needs to do stuff based on other cubes
|
||||
presence. With this hook we eliminate the need for cube ordering.
|
||||
"A hook that will be run after all the active cubes got setup.
|
||||
This hook is dedicated for the codes that needs to do stuff based on other cubes
|
||||
presence. With this hook we eliminate the need for cube ordering.
|
||||
|
||||
It will be called in the `fg42-config' and the proper way to use
|
||||
it is to use `fg42/after-cubes' macro. ")
|
||||
it is to use `fg42/after-cubes' macro.")
|
||||
|
||||
|
||||
(defvar fg42/available-cubes '()
|
||||
|
|
|
@ -90,9 +90,12 @@ For example, `(fg42/merge-flags (list f1 f2 f3) f4 -f2)' will return `(f1 f3 f4)
|
|||
(defmacro defflag (flag-name docstring &optional default-value)
|
||||
"Define a new flag FLAG-NAME with the given DOCSTRING.
|
||||
If the DEFAULT-VALUE is a non nil value, then the flag will be
|
||||
added to the activa flags list."
|
||||
(let ((var-name (intern (format "fg42/-flag-%s" flag-name)))
|
||||
(set-default (if default-value `((add-to-list 'fg42/flags ',flag-name)) ())))
|
||||
added to the active flags list."
|
||||
(declare (doc-string 2) (indent defun))
|
||||
(let ((var-name (intern (format "fg42/-flag-%s" (symbol-name flag-name))))
|
||||
(set-default (when default-value
|
||||
`((add-to-list 'fg42/flags ',flag-name)))))
|
||||
|
||||
`(if (boundp ',var-name)
|
||||
(warn (format "Flag name `%s' already defined" ,(format "%s" flag-name)))
|
||||
(progn
|
||||
|
@ -106,12 +109,11 @@ added to the activa flags list."
|
|||
(declare (indent defun))
|
||||
;; The `cube-local-flags' variable here is going to be
|
||||
;; defined in cubes to hold the local flags for each cube
|
||||
(if (and (boundp 'cube-local-flags)
|
||||
(member flag cube-local-flags))
|
||||
`,@body
|
||||
`(if (member ',flag fg42/flags)
|
||||
,@body
|
||||
nil)))
|
||||
(if (not (and (boundp 'cube-local-flags)
|
||||
(member flag cube-local-flags)))
|
||||
`(progn ,@body)
|
||||
`(when (member ',flag fg42/flags)
|
||||
,@body)))
|
||||
|
||||
|
||||
(defmacro if-flag (flag then else)
|
||||
|
@ -121,8 +123,8 @@ added to the activa flags list."
|
|||
;; defined in cubes to hold the local flags for each cube
|
||||
(if (and (boundp 'cube-local-flags)
|
||||
(member flag cube-local-flags))
|
||||
`,@then
|
||||
`(if (member ',flag fg42/flags)
|
||||
then
|
||||
`(if (member ',flag fg42/flags)
|
||||
,then
|
||||
,else)))
|
||||
|
||||
|
|
|
@ -556,7 +556,8 @@ A collection of handy functions that operate on ~sequences~.
|
|||
|
||||
#+END_SRC
|
||||
- ~seq-min~, ~seq-max~
|
||||
* Episode 9 - Introduction to Macros
|
||||
* DONE Episode 9 - Introduction to Macros
|
||||
CLOSED: [2022-09-11 Sun 11:08]
|
||||
** What is a macro?
|
||||
- A macro is defined much like a function
|
||||
- It works on compile time
|
||||
|
@ -598,7 +599,32 @@ A collection of handy functions that operate on ~sequences~.
|
|||
- [[https://twitter.com/lxsameer][@lxsameer]] on Twitter
|
||||
|
||||
* Episode 10 - More on Macros
|
||||
** Quasiquotes aka back quote
|
||||
** Quasiquote aka backquote (`)
|
||||
- Backquote constructs allow us to quote an expression, but selectively evaluate sub-expressions
|
||||
- Similar to a template engine for lisp expressions
|
||||
- It can be used on its own but it will shine in macro definitions
|
||||
- On the simplest form it is identical to ~quote~
|
||||
- Special markers ~,~ and ~,@~ can be used to mark expressions for evaluation
|
||||
- ~,~ will replace the return value of the evaluation with the expression
|
||||
- ~,@~ will replace and splice the return value of the evaluation
|
||||
*** Examples
|
||||
|
||||
#+BEGIN_SRC emacs-lisp
|
||||
`3
|
||||
`(1 2 3 4)
|
||||
`(1 2 3 ,(+ 5 6))
|
||||
`(1 2 3 ,(list 4 5 6))
|
||||
`(1 2 3 ,@(list 4 5 6))
|
||||
|
||||
`(setq ,(intern (upcase "some_var")) 3)
|
||||
#+END_SRC
|
||||
|
||||
** ~declare~ form
|
||||
- It's a special macro which can be used to add meta properties to a function or macro
|
||||
+ ~doc-string~
|
||||
+ ~indent~
|
||||
|
||||
** Real Examples
|
||||
Let's discuss ~defflag~ and ~when-flag~ macros in [[file:../core/fg42/flags.el]]
|
||||
|
||||
* Episode 11 - Common pitfalls of Macros
|
||||
*
|
||||
|
|
|
@ -75,6 +75,7 @@ install_runners() {
|
|||
|
||||
info "Copying share files..."
|
||||
sudo mkdir -p /usr/share/fg42/
|
||||
sudo mkdir -p /usr/local/share/applications
|
||||
sudo cp $fg42_home/share/applications/fg42.desktop /usr/local/share/applications
|
||||
sudo cp -r $fg42_home/share/icons/hicolor/ /usr/local/share/icons
|
||||
sudo cp -r $fg42_home/share/* /usr/share/fg42/
|
||||
|
|
正在加载...
在新工单中引用