功能

这两个函数其实是一个,只是逻辑上用在不同的场合。

setq用于给symbol的reference设置,而setf用于设置list 或者 array的reference.

setq的使用

setq比较简单,避免了在使用set的时候用‘来阻止表达式求值。

> (setq x "hello")
"hello"
> x
"hello"

setf的使用

> (setq L '(a b (c d) e f g))
(a b (c d) e f g)
> L
(a b (c d) e f g)
> (setf (L 1) 'B)
B
> L
(a B (c d) e f g)
> (L 1)
B
> 

setf用于设置list或者array的reference,上面的例子首先用setq设置了L, 其值是一个list

然后用setf 将B symbol赋给了L的第二个元素b

因为B是一个symbol,我们可以对它赋值,看下面的代码:

> (setq B "He")
"He"
> (L 1)
B
> (eval (L 1))
"He"
> 

用eval将B的值取出来。

setf的复杂应用

下面这个例子来自官方文档:

(define (double x) (+ x x))
→ (lambda (x) (+ x x))(first double) → (x)
(last double)  → (+ x x); make a fuzzy double
(setf (nth 1 double) '(mul (normal x (div x 10)) 2))(double 10) → 20.31445313
(double 10) → 19.60351563

首先定义了一个lambda表达式。

然后用setf把lambda表达式的body,也就是第二个元素设置成了list (mul (normal x (div x 10)) 2)

这个list用来计算随机数,并和2相乘。

这个例子演示了再define之后也可以通过setf来修改lambda表达式。

setq setf相关推荐

  1. setq 常驻内存lisp_常见Lisp中的set,setq和setf之间的区别?

    What is the difference between "set", "setq", and "setf" in Common Lis ...

  2. python perl lisp,是否可能像python中的perl的lvalue或lisp的setf一样?

    In lisp you can say: (setf (aref a 1) 5) In perl you can say: substr( $string, $start, $stop ) =~ s/ ...

  3. setf 使用方法

    setf 语法: fmtflags setf( fmtflags flags ); fmtflags setf( fmtflags flags, fmtflags needed ); 函数setf() ...

  4. 一个很有意思的问题: 揭示了计算机程序问题的一般处理思路

    2019独角兽企业重金招聘Python工程师标准>>> 一个很有意思的问题: 揭示了计算机程序问题的一般处理思路 === 问题标题: 如何统计汉字的字数? 问题内容: 我想统计: & ...

  5. emacs-w3m查看html帮助手册

    <?xml version="1.0" encoding="utf-8"?> emacs-w3m查看html帮助手册 emacs-w3m查看html ...

  6. 给Lisp程序员的Python简介

    给Lisp程序员的Python简介 作者:Peter Norvig,译者:jineslong<zzljlu@gmail.com> 这是一篇为Lisp程序员写的Python简介(一些Pyth ...

  7. Common lisp编译成C的bin(二)

    1.安装ecl#brew install ecl 2.配置ecl在~/.emacs加入:(setq inferior-lisp-program "ecl")(setq slime- ...

  8. python lisp_给Lisp程序员的Python简介

    作者:Peter Norvig,译者:jineslong 这是一篇为Lisp程序员写的Python简介(一些Python程序员告诉我,这篇文章对他们学习Lisp也有帮助,尽管这不是我的本意).基本上, ...

  9. comon lisp标准_common Lisp学习笔记(十四)

    14 Macros 宏通常通过defmacro来定义,它定义了怎样"翻译"出一个函数调用. 我们定义一个宏的时候说明一个函数调用应该翻译成什么,这个翻译称为宏展开(macro-ex ...

最新文章

  1. BCB 多线程的同步与协调
  2. Shell程序设计 | 文本处理工具 :正则表达式、grep、sed、awk
  3. IO-00. Hello World! (5)
  4. 牛逼!不得不服,第一次有人把Java 反射机制讲解这么透!
  5. 找到的程序集清单定义与程序集引用不匹配
  6. Sql Server获取数据库名,表信息,字段信息,主键信息等
  7. Linux进程的管理与调度(六) -- Linux下1号进程的前世(kernel_init)今生(init进程)
  8. linux7不能使用yum,CentOS7.6无法使用yum命令,无法更新解决方法
  9. selenium-绕过登录
  10. Android中获取并设置屏幕亮度
  11. 三角诱导公式 两角和与差 二倍角公式 降幂公式 半角公式 万能公式 积化和差公式 和差化积公式
  12. scratch零基础
  13. 音视频从入门到精通——FFmpeg之swr_convert音频重采样函数分析
  14. 看看别人研究生在做什么,在看看自己---推荐《我这十年》-----一个研究生的自我总结
  15. 香港机房BGP线路有什么用
  16. Organization Chart
  17. 使用python抓取100张人脸图片
  18. 3 - 一元函数积分学
  19. vsftpd lftp
  20. [C# 网络编程系列]专题五:TCP编程

热门文章

  1. 今天来介绍怎么获取 3D 素材,进行 Cocos Creator 3D 游戏开发体验!
  2. mobilesdk实战(含代码)
  3. JavaScript中实现sleep睡眠函数的几种简单方法
  4. 什么是OpenDDS???What is OpenDDS???开源项目???
  5. 硬件工程师的“真实写照”~
  6. 数据填报分析一体化,这家省级投资集团节省70%人力
  7. html打印合并单元格边框不显示不出来,word合并单元格后打印没有边框
  8. 二叉排序树遍历二叉树打印简单图书管理系统
  9. 超实用的 Linux 高级命令,程序员一定要懂!
  10. qr分解实验 matlab,QR分解与最小二乘