# , ` 是什么意思,不懂

看不明白什么问题。你的问题不完整、缺少上下文。

1 个赞

谢谢,基本懂了,剩下的在参照手册,学吧。

有点不明白的地方是,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寻找函数定义然后执行。

#' ' 没有实质性的区别。#'算是一个给字节码编译器的一个提示。如果字节码编译器发现#'foofoo在编译时没有函数定义。会报一个警。

跟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专业 :rofl:

版面不会排高亮, 先图片, 后文件

输出的结果

2022-03-31_17-05-17

类似 没处理前的, 输出

代码文本, 可以高亮啊, 要用 “预格式化” 文本这个功能

;; $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