分享两个在Scheme/Lisp里的命名小技巧

  1. 在Scheme里 . 可以作为一个identifier的一部分,我们可以把kvp直接命名为key.value

    这个key.value的命名和assoc里的pair (key . value) 对应,显得非常自然。

  2. 在Scheme里,^可以作为一个identifier的一部分,我们可以用它来模拟Haskell里的'

    比如:数学里经常用到的p' p'',在Haskell里能够很优雅的表现,但是Scheme也不差p^ p^^

这些优雅特性得益于Scheme的Prefix notation。

不知道其他怎么样,guile 里能够直接命名 p' p''

Clojure 也可以:

user=> (def a' 1)
#'user/a'
user=> a'
1
user=> (def b'' 2)
#'user/b''
user=> b''
2

@dcsjx @whatacold

在Chez Scheme里:

(define a' 1) ; ok
(lambda (a') 1) ; error
((lambda (x) x) a') ; error

(define a^ 1) ; ok
(lambda (a^) 1) ; ok
((lambda (x) x) a^) ; ok

Clojure ' 可以,^ 不行:

user=> (defn foo [a'] (* 2 a'))
#'user/foo
user=> (foo 3)
6
user=> 
user=> ((fn [b''] (* 3 b'')) 4)
12
user=> 
user=> (def c^ 4)
Syntax error reading source at (REPL:16:10).
Metadata must be Symbol,Keyword,String or Map
Syntax error reading source at (REPL:16:11).
Unmatched delimiter: )
user=> 
user=> (defn bar [c^] (* 2 c^))
Syntax error reading source at (REPL:18:15).
Unmatched delimiter: ]
Syntax error reading source at (REPL:18:24).
Unmatched delimiter: )
Syntax error reading source at (REPL:18:25).
Unmatched delimiter: )