像这样调用一个这个函数的话。我怎么像其他语言一样,得到他的返回值呢? 也就是我调用打开一个Dired后,我怎么得到当前的Dired是打开状态还是关闭状态 又没有办法像其他语言一样,调用一个函数返回一个状态值 ?lisp本身就不带状态返回的吗? 'list-directory
这个问题我也困惑好久不太明白,其它语言可以方便的获取变量的类型是什么,如php的gettype()、js的typeof()。elisp经常搞不清楚变量的类型是什么,不知道如何实现像其它语言的gettype或typeof这样的功能
type-of
不是干这个的吗?
(type-of 1)
=> Integer
(type-of 'a)
=> symbol
(defun sayhi ()
(message "hi"))
(type-of (sayhi))
=> string
@winq elisp 中不需要像其他语言一样 return,最后一条语句的执行结果就是它的返回值。
6 个赞
感谢指点,原来没搜到相关内容
想要了解某一个函数的返回值,可阅读文档(如 docstring)、尝试(如 C-x C-e)和读源代码。
执行:
(+ 1 2)
;; => 3
任意一个 Lisp 表达式都对应一个值,这是 Emacs Lisp 比其它语言简单的多的重要原因。
函数调用是表达式的一种。
感觉这些办法都不够简单直接,还是不容易弄清楚函数的返回值是什么,还是 @aqua0210 提醒的 type-of
好用至极,可以最快速的知道一个函数的返回值是什么
(type-of (+))
(type-of (or))
(type-of (and))
(type-of (interactive))
(type-of (company-mode))
(type-of (previous-buffer))
把我常用的elisp函数放进去,发现绝大部分函数的返回值类型都是symbol
为什么对返回值的数据类型会有疑惑呢?
函数返回值是函数的最重要特点,使用前你肯定已经清楚了,现在返回值都知道了,那么返回值的数据类型自然就知道了。
动态语言不用那么在意返回值。需要判断的情况可以直接用对应的 predicate 如 stringp
listp
consp
etc…
需要按类型进行 dispatch 可以用 cl-defgeneric
,简单点就 cl-typecase
或者 cl-typep
(type-of '+)
;; => symbol
(type-of (symbol-function '+))
;; => subr
;; `subr' means built-in function, written in C code
(type-of (symbol-function 'cl-remove-if))
;; => compiled-function
2 个赞