标签: lisp-2

在 Common Lisp 中模拟 Clojure 风格的可调用对象

在 Clojure 中,哈希映射和向量实现了invoke,因此它们可以用作函数,例如

(let [dict {:species "Ursus horribilis"
            :ornery :true
            :diet "You"}]
  (dict :diet))

lein> "You"
Run Code Online (Sandbox Code Playgroud)

或者,对于向量,

(let [v [42 613 28]]
  (v 1))

lein> 613
Run Code Online (Sandbox Code Playgroud)

可以通过让它们实现 Clojure 中的可调用对象IFn。我是 Common Lisp 的新手——可调用对象是否可能,如果是的话,实现它会涉及什么?我真的很想能够做这样的事情

(let ((A (make-array (list n n) ...)))
   (loop for i from 0 to n
         for j from 0 to m
      do (setf (A i j) (something i j)))
   A)
Run Code Online (Sandbox Code Playgroud)

而不是让代码乱七八糟aref。同样,如果您可以以相同的方式访问其他数据结构的条目,例如字典,那将会很酷。

我已经查看了Lisp/Scheme 中函数对象的wiki 条目,似乎拥有一个单独的函数命名空间会使 CL 的问题复杂化,而在 Scheme 中,您可以使用闭包来做到这一点。

clojure common-lisp lisp-2 callable-object

2
推荐指数
1
解决办法
442
查看次数

Emacs Lisp 可以将 lambda 形式分配给像 Scheme 这样的变量吗?

在调查 Emacs Lisp 的符号单元格时,我发现对于一个示例函数,如

(defun a (&rest x)
    x)
Run Code Online (Sandbox Code Playgroud)

我可以调用(symbol-function 'a),它返回(lambda (&rest x) x)。如果我愿意,我可以使用它

> ((lambda (&rest x) x) 1 2 3 4 5)
(1 2 3 4 5)
Run Code Online (Sandbox Code Playgroud)

它与上面的原始函数具有相同的功能。现在,这让我想起了 Scheme,其中 lambda 表达式是函数的主体,并通过 Scheme 的通用 分配给变量名称define。例如

(define atom?
    (lambda (x)
        (and (not (pair? x)) (not (null? x)))))
Run Code Online (Sandbox Code Playgroud)

简单地将 lambda 表达式赋值给atom?-- 现在atom?是一个函数。那么elisp 可以这样做吗,即,将一个lambda 表达式分配给一个符号,然后将其用作函数?我试过了

(setq new-a (lambda (&rest x) x))
Run Code Online (Sandbox Code Playgroud)

这使得(void-function new-a)如果我尝试使用它作为一个功能。有没有办法在这个问题上模仿Scheme世界?好像一定有​​办法。如果我们不能把这个 lambda 表达式变成一个函数,那么为什么要a包含的函数单元格(lambda (&rest x) …

lambda scheme elisp function lisp-2

2
推荐指数
1
解决办法
914
查看次数

"Lisp-1 vs Lisp-2"在静态类型的语言中是否相关?

(这是CS理论类型的问题;我希望这是可以接受的.)

" Lisp-1 vs Lisp-2 "的争论是关于函数的名称空间是否应该与所有其他变量的名称空间不同,并且它与动态类型语言相关,允许程序员将函数作为值传递.Lisp-1语言(例如Scheme)有一个名称空间,因此你不能同时拥有一个名为的函数f和一个名为的整数f(一个会影响另一个,就像两个名为的整数一样f).Lisp-2语言(例如Common Lisp)有两个名称空间,因此您可以同时拥有这两个f变量,但是您必须使用特殊语法指定您的意思(#'f函数f是整数).

在我看来,如果语言也是静态类型的(与大多数Lisps不同),主要的技术问题,即从整数中消除函数歧义的需要不是问题.例如,如果sort函数需要列表和小于函数作为显式签名,

def sort[X](list: List[X], lessThan: Function[X, Boolean])    // Scala syntax; had to pick something
Run Code Online (Sandbox Code Playgroud)

那么函数和其他一切是否在同一名称空间中并不重要. sort(mylist, myless)如果myless是一个函数,它只会传递一个类型检查- 不需要特殊的语法.有些人认为一个命名空间比两个命名空间更美观,但我想关注技术问题.

假设有问题的语言是静态类型的,那么有两个命名空间会更难或更容易出错(或相反地对于一个命名空间)吗?

(我正在考虑我正在研究的领域特定语言的上下文中,并且我想确保我不会遇到问题.使用两个名称空间实现会更容易( Lisp-2),因为它是静态类型的,所以没有必要等同于#'f.我总体上问了这个问题,因为我想听一般点,也许会发现我还不知道要问的问题.)

lisp namespaces static-typing lisp-2

1
推荐指数
1
解决办法
536
查看次数

为什么 lisp 中的 mapcar 使用名称而不是函数?

我正在阅读一本 lisp 书,我正在看mapcar,我的问题是为什么这是有效的:

> (mapcar #'+ '(1 2) '(3 4))
Run Code Online (Sandbox Code Playgroud)

但这不是:

(mapcar + '(1 2) '(3 4))
Run Code Online (Sandbox Code Playgroud)

换句话说,是否有理由在 lisp 中决定第一个参数mapcar不能是函数本身,而必须是它的名字?这样做的目的是什么?

lisp common-lisp lisp-2

1
推荐指数
2
解决办法
74
查看次数