在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中只有一点点经验的人 - 他们的意思是什么?
(lambda (*<8-]= *<8-[= ) (or *<8-]= *<8-[= ))
我想这些语法中的一些意味着类似于clojure的#(blah %)
语法,对吗?
(defun :-] (<) (= < 2))
这里大部分都输了。定义一个名为: - 的函数,它接受一个参数&lt;并检查它是否为2?也许(&lt;)是关于小于?
答案 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 >