今天来实现一种函数,这种函数有一个特点就是:每次调用这个函数的效果都不同,在调用了若干次之后,又会从第一种效果从头开始,像是一个循环圈。这种场景对于循环设置某个状态变量的值很有用。
利用函数属性可以实现这样的函数,下面是两个demo:
;; 实现在黑、白两种颜色之前切换当前的背景颜色
(defun my-toggle-bg-color ()
"Toggle change background color between two colors."
(interactive)
(if (get 'my-toggle-bg-color 'state)
(progn
(set-background-color "white")
(put 'my-toggle-bg-color 'state nil))
(progn
(set-background-color "black")
(put 'my-toggle-bg-color 'state t))))
多次使用M-x
调用my-toggle-bg-color
函数,可以发现当前的背景颜色就在黑、白两种颜色之间切换。
;; 实现在白、黑、红、黄、蓝5种颜色之前切换当前的背景颜色
(defun my-cycle-bg-color (@n)
"Cycle change background color among more than two colors."
(interactive "p")
(let* (($colors (list "white" "black" "red" "yellow" "blue"))
($idx-before (if (get 'my-cycle-bg-color 'state)
(get 'my-cycle-bg-color 'state)
0))
($idx-now (% (+ $idx-before @n) (length $colors)))
($color-now (nth $idx-now $colors)))
(set-background-color $color-now)
(put 'my-cycle-bg-color 'state $idx-now)
(message "background color changed to: %s" $color-now)))
多次使用M-x
调用my-cycle-bg-color
函数,可以发现当前的背景颜色就在5种颜色之间切换。
此外,还可以使用C-u
命令传入一个数值,改变每次切换的步长(默认步长为1)。
网友评论