新人问下简单的关于返回值问题?

像这样调用一个这个函数的话。我怎么像其他语言一样,得到他的返回值呢? 也就是我调用打开一个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 个赞