lisp

Can you return nothing from a function in Scheme?

筅森魡賤 提交于 2019-12-23 07:24:04
问题 I'm writing a scheme interpreter, and in the case of an if statement such as: (if (< 1 0) 'true) Any interpreter I've tried just returns a new prompt. But when I coded this, I had an if for whether there was an alternative expression. What can I return in the if such that nothing gets printed? (if (has-alternative if-expr) (eval (alternative if-expr)) #f) ;; what do I return here? 回答1: According to the R6RS specification: If <test> yields #f and no <alternate> is specified, then the result of

Emacs without Lisp

感情迁移 提交于 2019-12-23 07:19:09
问题 Should I learn to use Emacs with no intention to learn Lisp, if my other option is to get familiar with vi? 回答1: Yes. With all the resources out there (FAQ, Emacs wiki, SO emacs) and custom ( M-x custom ). You don't need to know lisp, you just cut/paste what you find. You can drive a Ferrari/Yugo without knowing the internals of the combustion engine or how a formula one transmission works... 回答2: Why not? You can still learn vi (probably vim or elvis). You can learn jedit. Or nano and pico.

emacs lisp 研究 lisp.h 继续 (几何画板开发笔记 六)

跟風遠走 提交于 2019-12-23 07:18:00
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 继续前一篇,关于 struct Lisp_Object 还有一点点相关的宏(函数)要说明。 已知 struct Lisp_Object 的字段 i 中有 val+tag 两种信息,也已知 XTYPE() 宏用于得到 tag 信息,那么也一定有获得 val 部分的宏: #define XPNTR(a) ((intptr_t) (XLI(a) & ~TYPEMASK)) 名字 XPNTR,其中 X 是前缀,PNTR 应是 Pointer 的简写。这个宏取出 val 部分,转换为 intptr_t 类型。从名字知道语义上是将值看做一个指针,实际是指向 Lisp 对象实体的指针。除了int 类型之外。 #define XUNTAG(a, type) ((intptr_t) (XLI (a) - (type))) 关于名字 XUNTAG,前缀 X, UN表示取消、去掉,TAG 是类型标记。这个宏用于当已经 确知 Lisp_Object 对象类型的 a 的标记值 type 时使用。 上面两个宏写作方法形态(略去后者): inline intptr_t Lisp_Object::xpntr() const throw() { return (intptr_t) (this->xli() & ~TYPEMASK); }

emacs lisp 研究 lisp.h 继续 (几何画板开发笔记 五)

一个人想着一个人 提交于 2019-12-23 07:17:47
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 在前一篇中我们已经研究了结构 Lisp_Object,因为其太重要了,并且本篇要继续研究它, 所以再次列出其结构如下: typedef struct { int i; } Lisp_Object; 然后是对其进行访问的一系列宏及函数: #define XLI(o) (o).i 我看到 emacs lisp 中很多宏名字以 X 开头,或者说有一系列的宏以大写字母 X 开头, 我个人归纳加猜测 访问 Lisp_Object 的各种宏有这种 convention(约定,惯例),即以 X 开头。也许不完全正确,但大致可以帮助记忆和区分。 名字中 LI 这里 我猜测是 Lisp, I 是 integer。这样 XLI 意思是 得到 Lisp_Object 中 字段 i 的宏。 这个宏如果写作 Lisp_Object 结构的方法(method)可写为: struct Lisp_Object { inline int xli() const throw() { return i; } ... }; 写作 C++ 的方法形式主要是方便理解,并且因为有类型检测,使用它更不易出错。 有 XLI() 就有反过来的 XIL(),从名字看,自然是从 integer => Lisp_Object: inline Lisp_Object

Make clos objects printable in lisp

泪湿孤枕 提交于 2019-12-23 07:15:45
问题 If you want to make CLOS objects in common lisp printable (print readably), how do you go about doing this without using anything but print and read. 回答1: There are two parts to doing this, at least in my solution, however you will need this function (thanks to the guys at cl-prevalence for this ( warn LLGPL ) (defun get-slots (object) ;; thanks to cl-prevalence #+openmcl (mapcar #'ccl:slot-definition-name (#-openmcl-native-threads ccl:class-instance-slots #+openmcl-native-threads ccl:class

Make clos objects printable in lisp

杀马特。学长 韩版系。学妹 提交于 2019-12-23 07:14:12
问题 If you want to make CLOS objects in common lisp printable (print readably), how do you go about doing this without using anything but print and read. 回答1: There are two parts to doing this, at least in my solution, however you will need this function (thanks to the guys at cl-prevalence for this ( warn LLGPL ) (defun get-slots (object) ;; thanks to cl-prevalence #+openmcl (mapcar #'ccl:slot-definition-name (#-openmcl-native-threads ccl:class-instance-slots #+openmcl-native-threads ccl:class

[转]Lisp.自下而上的编程

不问归期 提交于 2019-12-23 07:11:44
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 一个程序的函数元素不能太大是一个长期存在的编程风格原则。如果程序的某些组件增长到读难以理解的成都,它就变成一大堆的复杂东西,它们隐藏错误就像一个大城市隐藏逃亡者一样简单。这样的软件将很难读、很难测试、很难杀臭虫。 遵循这个原则,一个大的程序必须被分成很多片,一个程序越大,就需要被越多地分割。你怎样分割一个程序呢?传统的方法是自上而下的设计:你说“这个程序的目的是做这7件事情,所以我把它分成7个子功能”等等。这个过程持续到整个程序有正确水平的粒度——每块都可以独立地做一些事情,但是能够作为一个单元小到可以读懂。 有经验的Lisp程序员以不同的方式来分割他们的程序。就像自上而下的设计,他们遵循自下而上的设计——改变语言以适应问题。在Lisp中,你不仅仅是根据语言去写你的程序,你也根据你的程序区建立语言。当你正在写一个程序的时候,你可能想"我希望Lisp有这样这样的操作符",所以你就去写它。之后,你意识到使用新的操作符将简化程序其它部分的设计,等等。语言和程序一起演进。就像两个正在战争的国家的边界一样,语言和程序的边界被不断地重画,知道最后沿着山脉和河流,你问题的自然边缘。最后你看的程序,就像这门语言就是为它设计的一样。党语言和程序相互协调很好,你得到的将是清晰、小巧和高效的代码。 值得强调一下

emacs lisp 研究 lisp.h (几何画板开发笔记 四)

走远了吗. 提交于 2019-12-23 07:11:28
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 由于想为所做的几何画板(类)和几何推理引入一种驱动语言,近期研究了 lisp 语言, 其中 emacs lisp 方言的实现看起来规模大小适合,我基本选择它作为研究对象,以 期待能引入到几何软件中。选择 lisp 还有一些其它的原因,例如它天生就和数学有着 紧密的联系关系,所以我偏向于认为为数学软件选择 lisp 是比起其它语言有着一些 优点的。 以下具体看 emacs lisp 语言的实现,重点是考察其细节实现,以引入(或称借鉴、抄袭?) 到我们的几何软件中。 这一研究从头文件 lisp.h 开始。前期从 emacs 官网下载源码,找到 src 目录等就略去了。 似乎 lisp 的传统 C 实现使用 Lisp_Object 来表示所有 lisp 中使用的数据对象,如整数、 点对单元(cons)、符号(symbol)、浮点数(float)、等等(还有很多)。因为我在其它如 steel bank common lisp, common lisp,femotelisp 等大小 lisp 中也似乎看到这个 结构。一个 Lisp_Object 本质上可以看做是到真正 lisp 数据对象实体的指针,但这个指针 只使用了一个字 (word, int 32 bits) 的部分位来表示真正地址,另一小部分位表示对象 的类型

emacs lisp 研究 lisp.h 继续 (几何画板开发笔记 七)

泄露秘密 提交于 2019-12-23 07:10:51
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 粗略地研究了 Lisp_Cons 结构之后,建议研究下一个重要的结构 Lisp_Symbol: struct Lisp_Symbol { unsigned gcmarkbit : 1; // gc 标记位,与 gc 相关以后详述。 enum symbol_redirect redirect : 3; // 指示值存储的方式。 unsigned constant : 2; // 非 0 表示是常量。 unsigned interned : 2; // 是否 interned 标志,值为 enum symbol_interned unsigned declared_special : 1; // 是否特殊变量。 Lisp_Object name; // 此符号的名字,是一个 Lisp_String 对象。 Lisp_Object val.value; // 此符号绑定的值。参见注解。 Lisp_Object function; // 此符号绑定的函数。如果未绑定到函数则为 Qunbound. Lisp_Object plist; // 此符号的属性列表(plist) struct Lisp_Symbol *next; // 在 hash 表的下一项,如果放入到 hash 表的话。一般都放的。 }; 注: val

跨越边界: Lisp 之美

﹥>﹥吖頭↗ 提交于 2019-12-23 07:06:34
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> Lisp 长久以来一直被视为伟大的编程语言之一。其漫长的发展过程(接近五十年)中引发的追随狂潮表明:这是一门非同凡响的语言。在 MIT,Lisp 在所有程序员的课程中占了举足轻重的地位。像 Paul Graham 那样的企业家们将 Lisp 卓越的生产力用作他们事业成功起步的推动力。但令其追随者懊恼万分的是,Lisp 从未成为主流编程语言。作为一名 Java? 程序员,如果您花一点时间研究 Lisp 这座被人遗忘的黄金之城,就会发现许多能够改进编码方式的技术。 我最近第一次完成了马拉松赛跑,我 发现跑步比我预想的更有价值。我跑了 26.2 英里,通过该步骤,我开始认为这是对身体非常有益的简单活动。一些语言给了我类似的感觉,如 Smalltalk 和 Lisp。对 Smalltalk 来说,引发类似感觉的是对象;Smalltalk 中的一切内容都是在处理对象和消息传递。对于 Lisp 来说,这个至为重要的步骤更为简单。这门语言完全由列表组成。但不要被这个简单的假相所欺骗。这门有着 48 年历史的语言具有难以置信的强大功能和灵活性,这是 Java 语言所不能企及的。 第一次和 Lisp 打交道时,我还是在校大学生,但这次不是很顺利。因为我拼命地想把 Lisp 编入到熟悉的过程化范例中,而不是在 Lisp