当前位置: 首页 > article >正文

Emacs折腾日记(七)——布尔变量、逻辑运算符与位运算

通过前面的几节内容我们已经对elisp中基本类型有所了解了。emacs lisp 简明教程 中下一节开始就是讲相关容器。所以这一篇我将它作为基础类型的一个结尾,将平时会用到,但是之前没有涉及到的内容都包含进来。

bool类型

本篇首先要提到的就是bool类型,我们已经在前面几章中用到过它,但是没有具体提到它。像ifcondwhile 中都有它的声影。有其他编程语言相关经验的读者对它应该不会陌生,而且使用起来应该也是手到擒来。

elisp中bool变量的真和假分别用 tnil 来表示。它只有 nil 表示假,其余都是真。在其他编程语言中,0表示假,但是elisp中0也是真,我们可以使用下列代码来验证

(if 0
    (message "0 is t")
  (message "0 is nil")) ;; ⇒ "0 is t"

包括0、空字符串都是真,elisp中只有 nil 本身是假,其余都是真。

与其他编程语言类似,bool变量主要使用逻辑运算符来进行运算。elisp中的逻辑运算符也是与或非,对应的操作符为 andornot ,它们中间也有短路性质,即and 语句中如果一条语句已经为假,则不执行后一条,而or 中一条语句为真,则不判断后一条语句。elisp中经常利用短路性质来执行一些特殊的操作,例如常常用 or 来设置函数参数的缺省值。例如

(defun say-hello (&optional name)
	(or name (setq name "Emacs"))
	(message "Hello, %s" name))

(say-hello) ;; ⇒ "Hello, Emacs"
(say-hello "Lisp") ;; ⇒ "Hello, Lisp"

位运算

当初在学习C、C++的时候就觉得它对二进制位的操作实在是比较精妙,例如TCP/IP协议中使用位域来定义相关结构体。或者Win32 API中关于flag的设计就是典型的位运算设计。利用位运算的相关内容,一个字节的数据就能存储8位的标志。虽然教程中没有提及位运算的内容,但是我实在是比较好奇elisp中的位运算,所以我加了这一部分的内容。

内容也比较简单,位运算基本也就是那些操作,主要是 andorxornot。以及左移右移的操作。

elisp中提供了支持这些操作的一些函数,下面是一些位的逻辑运算的函数

  • logand: 按位与运算
  • logior: 按位或
  • logxor: 按位异或
  • lognot: 按位非
;; 3 ⇒ 011 5⇒ 101
(logand 3 5) ;; ⇒ 1
(logior 3 5) ;; ⇒ 7
(logxor 3 5) ;; ⇒ 6
(lognot 5) ;; ⇒ -6

下面是位移运算的函数

  • ash: 位移操作

elisp 中没有单独提供左移和右移的操作,上面的函数根据第二个参数来决定左移或者右移,正数代表左移,负数代表右移,例如

(ash 3 1) ;; ⇒ 6
(ash 3 -1) ;; ⇒ 2

本节到此就结束了。本节算是一个针对原来教程的补充,内容不多。


http://www.kler.cn/a/465915.html

相关文章:

  • 【软考网工笔记】计算机基础理论与安全——网络安全
  • HTML-列表标签
  • 使用 Try-With-Resources 简化资源管理
  • springmvc--请求参数的绑定
  • springCloud 脚手架项目功能模块:Java分布式锁
  • Django中自定义模板字符串
  • token、cookie和session
  • 【AIGC】 ChatGPT实战教程:如何高效撰写学术论文引言
  • MR30分布式IO模块助力PLC,打造高效智能仓储系统
  • [redux] useDispatch的两种用法
  • OCR图片中文字识别(Tess4j)
  • Lua开发环境如何安装?保姆级教程
  • 大数据-268 实时数仓 - ODS层 将 Kafka 中的维度表写入 DIM
  • Java编程规约:集合处理
  • 线性变换在机器学习中的应用实例
  • 深入AIGC领域:ChatGPT开发者获取OpenAI API Key的实用指南
  • 公司一个bug引出的对象判空、空指针异常话题之NUll、isEmpty()和“”区别
  • 【华为OD-E卷 - Linux发行版的数量 100分(python、java、c++、js、c)】
  • 【开源免费】基于SpringBoot+Vue.JS保密信息学科平台(JAVA毕业设计)
  • 电脑文件msvcp110.d丢失的解决方法
  • Transformer算法实现IMDB文本分类任务和WMT14机器翻译任务
  • 数据库进阶教程之存储过程(万字详解)
  • 021-spring-springmvc-组件
  • Java重要面试名词整理(二十):GatewaySkyWalking
  • ELK zookeeper kafka
  • 基于Matlab的变压器仿真模型建模方法(12):单相降压自耦变压器的等效电路和仿真模型