这个Lisp代码是什么意思?

时间:2013-11-08 03:35:43

标签: lambda lisp common-lisp

https://www.thc.org/root/phun/unmaintain.html中,Lisp被视为"LISP is a dream language for the writer of unmaintainable code.",然后继续提供一些代码示例。这些被视为[" can literally be read and understood in about a second by anyone who knows lisp."最近的黑客新闻评论。

我的问题是,作为在Clojure中只有一点点经验的人 - 他们的意思是什么?

  1. (lambda (*<8-]= *<8-[= ) (or *<8-]= *<8-[= ))

    我想这些语法中的一些意味着类似于clojure的#(blah %)语法,对吗?

  2. (defun :-] (<) (= < 2))

    这里大部分都输了。定义一个名为: - 的函数,它接受一个参数&lt;并检查它是否为2?也许(&lt;)是关于小于?

  3. 的部分功能

3 个答案:

答案 0 :(得分:7)

他们的观点只是可用标识符的范围更大,但某些字符的语义重载使得编写看起来的代码变得很容易,就像它可能做了一些奇怪的事情一样。

如果你仔细看看第一个样本,

(lambda (*<8-]= *<8-[= ) (or *<8-]= *<8-[= ))

并将变量*<8-]=重命名为a,将*<8-[=重命名为b,我们发现这是一个非常简单的功能:

(lambda (a b) (or a b))

在第二种情况下,它只是指出,因为像+<之类的东西不是特殊的运算符或任何东西,它们只是名称为{{的符号1}}和"+",您可以将它们用作变量名称。同样,我们可以重命名变量并转向

"<"

进入

(defun :-] (<) (= < 2))

这个是相当不寻常的,因为冒号前缀表示一个关键字(Common Lisp中一种特殊的自我评估常量),但SBCL似乎处理它:

(defun :-] (a) (= a 2))

将函数定义放在关键字符号上有点不寻常,但这并不是闻所未闻,并且可能很有用。例如,见Naming functions with keywords

答案 1 :(得分:3)

这让我想起了我们今天在IM工作中的一次对话,其中一位同事评论说这似乎in the Sidekiq source

def self.❨╯°□°❩╯︵┻━┻
  puts "Calm down, bro"
end

最新版本的Scheme标准也支持Unicode,事实上,以下代码适用于Racket和Guile(也可能是大多数其他Scheme实现):

(define (❨╯°□°❩╯︵┻━┻)
  (display "Calm down, bro")
  (newline))

这个Common Lisp版本在使用SBCL测试时起作用了:

(defun ❨╯°□°❩╯︵┻━┻ ()
  (format t "Calm down, bro~%"))

答案 2 :(得分:3)

Lisp和Common Lisp的一个特性是它没有运算符和复杂的运算符语法之类的东西。标识符都是符号。

符号由少量字符或空格分隔。例如,右括号结束之前的任何符号。

所以

((foo)bar)

((foo) bar)

阅读相同。

否则其他字符如*,=, - ,_,&amp;,%,...都是符号的有效字符,即使没有转义也是如此。

CL-USER > '(*foo =foo -foo _foo &foo %foo)
(*FOO =FOO -FOO _FOO &FOO %FOO)

在练习中,您会看到上面的符号,但不会出现问题中提到的符号。

当更改读取表或更改数字输入时,会真正打扰它。

CL-USER 51 > (setf *read-base* 36)
36

CL-USER 52 > '(dear dad)
(625059 17221)

CL-USER 53 > (+ dear dad)
642280

甚至

CL-USER 54 > (|SETF| |*PRINT-BASE*| 10)
10

CL-USER 55 > (+ dear dad)
DRL4

另请注意,并非每个Lisp实现都允许将带有关键字的函数作为名称:

CL-USER 1 > (defun :foo (a) (* a a))

Error: Defining function :FOO visible from package KEYWORD.
  1 (continue) Define it anyway.
  2 (abort) Return to level 0.
  3 Return to top loop level 0.

Type :b for backtrace or :c <option number> to proceed.
Type :bug-form "<subject>" for a bug report template or :? for other options.

CL-USER 2 : 1 >