首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >参数是如何传递到Elisp中的函数的?

参数是如何传递到Elisp中的函数的?
EN

Stack Overflow用户
提问于 2018-01-21 04:51:37
回答 2查看 1.8K关注 0票数 6

我来自一个C++背景,我试图弄清楚参数是如何在Elisp中传递给方法的。虽然我承认措辞可能会有所不同,但我想知道它是否更接近于通过引用传递或传递值的C++概念?如果我在方法本身中更改参数,它会改变函数调用中传入的参数吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-01-21 06:31:02

所有Lisps (Emacs Lisp普通Lisp)都按值传递参数,总是:

代码语言:javascript
运行
复制
(defparameter x 42)  ; defconst in Emacs Lisp
(defun test (x)
  (setq x 10))
(test x)
==> 10
x
==> 42

但是,请注意,有些值实际上是指针(或者说是带有组件的对象),因此函数可以通过副作用修改它们的内容:

代码语言:javascript
运行
复制
(defparameter x (list 1 2))
(defun test (x)
  (setf (first x) 42
        (second x) 24
        x 17))
(test x)
==> 17
x
==> (42 24)

PS1.请参阅什么时候在Lisp中使用‘(或引号)?

PS2.请参阅add-to-list -它接受一个符号(变量名)并修改它的值。这只适用于全局动态变量,而不适用于词法变量。不是个好主意。

票数 10
EN

Stack Overflow用户

发布于 2019-01-16 09:24:24

实际上,在Emacs中,没有像通过值或引用传递参数这样的事情,更不用说指针了。但是,传递给函数的所有参数都将预先计算,只有具有'前缀的参数除外。请始终记住,当您设置变量时,始终只需创建带有值的符号。[1]

因此,如果要在函数中修改变量的值,只需修改该函数中该变量的符号的值。

检查我的密码。

代码语言:javascript
运行
复制
(defvar my-val 1)

(defun my-func-value (val)
  (setq val 2))

(defun my-func-symbol (sym)
  ;; NOTE! using set instead of setq,
  ;; casue we want symbol "my-val" be evaluated from "sym" here
  (set sym 2))

(my-func-value my-val) ; evaluate my-val before passed into function
(message "my-val: %s" my-val) ; my-val: 1

(my-func-symbol 'my-val) ; pass my-val symbol directly into function
(message "my-val: %s" my-val) ; my-val: 2

笔记!如果变量是一个词汇绑定的variable[2],,那么仍然可以修改符号的值,但不能修改词法环境中的值。

以下是代码:

代码语言:javascript
运行
复制
(let ((my-lexical-var 1))
  (my-func-symbol 'my-lexical-var)
  ;; evaluate from lexical environment
  (message "my-lexical-var: %s" my-lexical-var) ; my-lexical-var: 1
  ;; evaluate from the symbol
  (message "symbol my-lexical-var: %s" (symbol-value 'my-lexical-var))
  ; symbol my-lexical-var: 2
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48363798

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档