我现在正在阅读SICP,并不真正理解5.5.6词典寻址中描述的词法寻址的必要性.
因为它说"因为我们的语言是词法范围的,所以任何表达式的运行时环境都会有一个与表达式出现的程序的词汇结构相似的结构",我认为在运行中搜索变量的成本是相同的 - 在编译环境中搜索的时间环境.为什么我们懒得实现编译环境?我认为编译环境将具有与程序的词法结构相同的结构,这与运行时环境相同,不是吗?
只是想从eclipse中尝试Cassandra Java驱动程序,并从“ Practical Cassandra”中复制了示例代码
但是在eclipse的输出下面遇到错误:
Exception in thread "main" java.lang.NoClassDefFoundError: io/netty/util/Timer
at com.datastax.driver.core.Configuration$Builder.build(Configuration.java:294)
at com.datastax.driver.core.Cluster$Builder.getConfiguration(Cluster.java:1247)
at com.datastax.driver.core.Cluster.<init>(Cluster.java:116)
at com.datastax.driver.core.Cluster.buildFrom(Cluster.java:181)
at com.datastax.driver.core.Cluster$Builder.build(Cluster.java:1264)
at SampleApp.connect(SampleApp.java:13)
at SampleApp.main(SampleApp.java:64)
Caused by: java.lang.ClassNotFoundException: io.netty.util.Timer
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
... 7 more
Run Code Online (Sandbox Code Playgroud)
这是示例代码:
import com.datastax.driver.core.Cluster;
import com.datastax.driver.core.Host;
import com.datastax.driver.core.Metadata;
import com.datastax.driver.core.Session;
import com.datastax.driver.core.ResultSet;
import com.datastax.driver.core.Row;
public class SampleApp {
private Cluster cluster;
private Session session;
public void connect(String node) {
cluster = Cluster.builder().addContactPoint(node).build();
Metadata metadata = cluster.getMetadata();
System.out.printf("Cluster: …Run Code Online (Sandbox Code Playgroud) 只是不明白用于创建上下文的运算符的宏的描述.在我看来,如果有一个绑定,宏是唯一的选择.
这是不是通过其他方式实现的?下面的文字到底意味着什么?
非常感谢.
除了词汇环境之外还有另一种语境.从更广泛的意义上讲,上下文是世界的状态,包括特殊变量的值,数据结构的内容以及Lisp之外的事物状态.构建这种上下文的操作符也必须定义为宏,除非它们的代码体要打包在闭包中.上下文构建宏的名称通常以 - 开头.这种类型最常用的宏可能是open-file.使用绑定到用户提供的变量的新打开文件评估其正文:
(with-open-file (s "dump" :direction :output)
(princ 99 s))
Run Code Online (Sandbox Code Playgroud)
......
这个操作符显然必须被定义为amacro,因为它绑定了s.但是,无论如何,必须将导致在新上下文中评估表单的运算符定义为宏.
在On Lisp,p.267,Paul Graham提供了一个继续传递宏的实现:
(setq *cont* #'identity)
(defmacro =lambda (parms &body body)
`#'(lambda (*cont* ,@parms) ,@body))
(defmacro =defun (name parms &body body)
(let ((f (intern (concatenate 'string
"=" (symbol-name name)))))
`(progn
(defmacro ,name ,parms
`(,',f *cont* ,,@parms))
(defun ,f (*cont* ,@parms) ,@body))))
(defmacro =bind (parms expr &body body)
`(let ((*cont* #'(lambda ,parms ,@body))) ,expr))
(defmacro =values (&rest retvals)
`(funcall *cont* ,@retvals))
Run Code Online (Sandbox Code Playgroud)
以下代码遍历树t2的每个叶子的树t1,使用此实现,我想知道restart调用时会发生什么,特别是在t1从A(第一个元素)更改为B(第二个元素)的叶子之后.当restart被调用时,它只是从弹出lambda函数*saved*,而lambda函数调用dft-node …
我不知道这里发生了什么,文中的宏观例子.基本上,不熟悉如何使用get-setf-method,内置宏(可能是函数?).具体来说,get-setf-method的某些返回值为零的情况怎么样?例如(get-setf-method'x)
NIL ;
NIL ;
(#:NEW-3069) ;
(SETQ X #:NEW-3069) ;
X
Run Code Online (Sandbox Code Playgroud)
为什么这个示例代码首先将第五个返回值设置为第二个返回值,以进行初始化?最后它如何处理在表达式中设置变量的顺序,例如(aref ar(incf i)
(get-setf-method '(aref ar (incf i)))
(#:G3070 #:G3071) ;
(AR (INCF I)) ;
(#:G3072) ;
(SYSTEM::STORE #:G3070 #:G3071 #:G3072) ;
(AREF #:G3070 #:G3071)
Run Code Online (Sandbox Code Playgroud)
这是宏的定义:
(defmacro sortf (op &rest places)
(let* ((meths (mapcar #'(lambda (p)
(multiple-value-list
(get-setf-method p)))
places))
(temps (apply #'append (mapcar #'third meths))))
`(let* ,(mapcar #'list
(mapcan #'(lambda (m)
(append (first m)
(third m)))
meths)
(mapcan #'(lambda (m)
(append (second …Run Code Online (Sandbox Code Playgroud) 我想创建一个与C中的宏对应的lisp函数.例如,win32 API中有一个HIWORD,它被定义为头文件中的一个宏.
我尝试将其定义如下,但被告知HIWORD尚未解决.
CL-USER 4 > (hiword #xFFFFFFFF)
Error: Foreign function HIWORD trying to call to unresolved external function "HIWORDW".
Run Code Online (Sandbox Code Playgroud)
我只是想知道如何为C函数创建C宏的包装器.
(fli:define-c-typedef DWORD (:unsigned :long))
(fli:define-c-typedef WORD (:unsigned :short))
(fli:define-foreign-function
(HIWORD "HIWORD" :dbcs)
((dwVal dword))
:result-type word :calling-convention :stdcall)
Run Code Online (Sandbox Code Playgroud) 当我检查ghci时,我发现了这种现象。
Prelude> :t pure []
pure [] :: Applicative f => f [a]
Prelude> :t pure [] 3
pure [] 3 :: [a]
Prelude> pure [] 3
[]
Run Code Online (Sandbox Code Playgroud)
我不确定为什么会这样,为什么pure [] 3是类型[a]?在最后一个表达式中会发生什么?