1

https://www.thc.org/root/phun/unmaintain.html Lisp 被认为是这样的,"LISP is a dream language for the writer of unmaintainable code."然后继续提供一些代码示例。这些被认为是“任何知道 lisp 的人都可以在大约一秒钟内真正阅读和理解的东西。 ”在最近的 Hacker News 评论中。

我的问题是,作为一个在 Clojure 方面只有很少经验的人——他们是什么意思?

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

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

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

    大多迷失在这里。定义一个名为 :-] 的函数,它接受一个参数 < 并检查它是否 = 到 2?也许 (<) 是关于小于的部分函数?

4

3 回答 3

7

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

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

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

并将变量重命名为*<8-]=a*<8-[=我们b看到这是一个非常简单的函数:

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

在第二种情况下,它只是指出,由于+,<等不是特殊运算符或任何东西,它们只是带有名称的符号"+""<",您可以将它们用作变量名。同样,我们可以重命名变量并转

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

进入

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

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

CL-USER> (defun :-] (<) (= < 2))
:-]
CL-USER> (:-] 2)
T
CL-USER> (:-] 3)
NIL

将函数定义放在关键字符号上有点不寻常,但它并非闻所未闻,而且很有用。例如,请参阅使用关键字命名函数

于 2013-11-08T03:40:58.763 回答
3

这让我想起了我们今天在工作 IM 上的一次对话,我的一位同事评论说这出现在 Sidekiq 源中

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~%"))
于 2013-11-08T03:53:06.573 回答
3

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

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

所以

((foo)bar)

((foo) bar)

读起来一样。

否则,其他字符(如 *、=、-、_、&、%、...)是符号的有效字符,即使没有转义。

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 > 
于 2013-11-08T09:14:48.343 回答