看不明白什么问题。你的问题不完整、缺少上下文。
谢谢,基本懂了,剩下的在参照手册,学吧。
有点不明白的地方是,foo本身就是返回自己的函数引用,为何要写成(function foo),它们有区别吗?在scheme中,一般直接写foo,这是不是scheme与lisp的区别所在?
是不是,在elisp中,直接写foo,就从符号定义namespace查找,而(function foo)就是从函数定义namespace中查找的意思?
如果没记错的话, elisp 里函数命名空间和变量命名空间是分开的,就说你可以定义名字是 foo 的函数, 同时也可以定义一个名字是 foo 的变量。 使用 foo 的时候除非是括号第一个位置, 其他位置默认成变量。
刚试了一下
(defun fact (n)
(if (= n 0) 1
(* n (fact (1- n)))))
(defun test (fn n)
(funcall fn n))
(test 'fact 3) => 6
(test #'fact 3) => 6 ;; byte compile
两者都能执行,#’ 第一次compile之后,以后执行应该快一些吧,compile之后的byte code保存在什么地方呢?若没保存的话,岂不是每次都compile。或者,compile之后缓存在自己的buffer里,一旦这个buffer关闭,再次打开的话,第一次遇到这个函数时compile一下。
funcall
会对它的参数求值。无论'foo
或者#'foo
求值的结果都是foo
这个symbol。然后funcall会到foo
的function slot寻找函数定义然后执行。
#'
'
没有实质性的区别。#'
算是一个给字节码编译器的一个提示。如果字节码编译器发现#'foo
的foo
在编译时没有函数定义。会报一个警。
跟buffer没有关系的啊
(defun zx () (print (+ 90 90)))
(symbol-function 'zx)
(byte-compile 'zx)
(symbol-function 'zx)
(fset 'zxc (symbol-function 'zx))
(zxc)
关于这个问题,我另起了一个主题[elisp 符号表 与 namespace]
关于本主题
为了使记号简洁,lisp 中有一个特殊的宏‘,称为 backquote。在这个宏里,所有的表达式都是引用(quote)的,如果要让一个表达式不被直接引用(也就是列表中要计算该表达式的值),需要在前面加 “,”,如果要让一个列表作为整个列表的一部分,可以用“,@”把它展开。
'(a list of ,(+ 2 3) elements) ; => (a list of 5 elements)
(setq some-list ’(2 3)) ; => (2 3)
'(1 ,some-list 4 ,@some-list) ; => (1 (2 3) 4 2 3)
提个问题
(defmacro when (cond &rest body)
(list 'if cond (cons 'progn body)))
; 按理说,是可以替换成
(defmacro when (cond &rest body)
'(if ,cond (progn ,@body)))
; 但提示下面错误
Error running timer 'aggressive-indent--indent-if-changed': (void-function \,)
; 找不到名字为"\,"的函数
macro when
被使用的时候。负责处理lisp解释器解析后的backquote结构的backquote.el
还没被加载呢
是你自己写的宏啊… 我还以为你动手改了subr.el呢。那你应该是写错字了。
好的,谢谢。
不过,以我现在的水平,只看这段代码,看不出哪里写了backquote.el在when之后加载?
写错了吧,应该是
`(if ,cond (progn ,@body))
不是
'(if ,cond (progn ,@body))
我也看不懂。不过subr.el
有不少宏都有类似的提示
正解,非常感谢。
好的,以后我也得仔细看代码和注释了。我感觉看他们的代码,在时间上有些吃不消,你是怎么做到的?
不过我这次的问题是‘ 和 `的问题
获取 “2022-03-26.org” 这个文本, 用过什么 get-text-property, 可能方向错了,
ELISP> (window-list) (#<window 7 on ielm> #<window 9 on 2022-03-26.org> #<window 3 on zzf-7-test-template.el>)
这个是 序列吗, 还是只是1个列表, 还是要用正则来 提取
(mapconcat 'identity (window-list) “”) ;
也不对! 烦请, 那位 专业人士, 帮忙解释下, 给个链接也行, Google 一天多了
(mapconcat
(lambda (x)
(format "%S" x))
(window-list) "")
简单来说, window-list 函数返回一个 对象列表, 每个 window 对象 用 identity 函数处理之后还是原来对象,当然不能当作字符拼接了。
还在忙, 现在正准备写, 写好, 再请教下, 还是要说下, 本人非IT行业
非IT专业没什么,这个群里有许多大牛都是非IT专业
版面不会排高亮, 先图片, 后文件
输出的结果
类似 没处理前的, 输出
代码文本, 可以高亮啊, 要用 “预格式化” 文本这个功能;; $file_name_list 最终需要 提取出 的 文件名
(defun zzf-test-7 ()
(interactive)
(let ($y $t7
$extension_name_list $window_list $file_name_list)
;; 需要 提取的 文件类型
(setq $extension_name_list
'(".el" ".org" ".html" ".css" ".js" ".php" ".txt"))
;; 当前窗格 中打开的 窗口
(setq $window_list
(cdr (split-string
(mapconcat
(lambda (x)
(format "%S" x))
(window-list) "")
"#") ;
)) ;
(dolist ($y $window_list)
;; 先正则 提取 符合的 文件类型
(when (string-match "\\(\\..*[A-Za-z0-9]\\)" $y)
;; 判断 是否是 需要的 文件类型
(when (member (match-string 1 $y) $extension_name_list)
(push (match-string 1 $y) $t7) ; 这个 测试用
;; 提取文件名
(string-match "\\(on .*>\\)" $y)
(push (substring (match-string 1 $y) 3 (1- (length (match-string 1 $y))))
$file_name_list) ;
) ; when 2
) ; when 1
)
(with-output-to-temp-buffer "*xah temp out*"
(print $file_name_list ) ;
(print $t7 )) ;
))
前面 问时, 主要是想, 有没有这样的
(frame-parameter nil 'name)
直接 就提出来了, 找来找出, 找不到,
难道这种格式
非要, 用 正则, 没有 API 可以直接用吗? 还是像 org-mode 一样,
只有 基本的 API