let's rock!数据结构
((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((()))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))函数
写得代码越多,越感受到本身应该学习使用 lisp。程序老是在处理数据,若是代码自己的数据结构就和数据相相似,那么代码自己也能够很容易地被处理。学习
注意lisp的reql中返回的能够是未被赋值的变量。而elixir不能。atom
(quote x)
> (quote a)
a
> 'a
a
> (quote (a b c))
(a b c)
复制代码
> quote do a end
{:a, [], Elixir}
> quote(do: a)
{:a, [], Elixir}
> quote do [a, b, c] end
[{:a, [], Elixir}, {:b, [], Elixir}, {:c, [], Elixir}]
复制代码
(atom x)
> (atom 'a)
t
> (atom '(a b c))
()
> (atom '())
t
复制代码
> is_atom quote(do: :a)
true
> is_atom quote(do: [:a, :b, :c])
false
> is_atom quote(do: nil)
true
复制代码
区别在于lisp里面变量quote以后并不保存context信息,直接变成了atom;而在elixir里面只有自己是 atom 的状况下,被quote以后才会为 atom 状态,普通变量被quote以后会带有context信息。spa
lisp 中变量的字面量便是 atom, 而elixir里变量的字面量虽然也会使用一个对应的atom,但其自己是一个三元组的结构。code
(eq x y)
> (eq 'a 'a)
t
> (eq 'a 'b)
()
> (eq '() '())
t
复制代码
> quote(do: a) == quote(do: a)
true
> quote(do: a) == quote(do: b)
false
> nil == nil
true
复制代码
(car x)
> (car '(a b c))
a
复制代码
> hd quote(do: [a, b, c])
quote(do: a)
复制代码
(cdr x)
> (cdr '(a b c))
(b c)
复制代码
> tl quote(do: [a, b, c])
quote(do: [b, c])
复制代码
(cons x y)
> (cons 'a '(b c))
(a b c)
> (cons 'a (cons 'b (cons 'c '()) ) )
(a b c)
> (car (cons 'a '(b c)) )
a
> (cdr (cons 'a '(b c) ))
(b c)
复制代码
> [quote(do: a) | quote(do: [b, c]) ]
quote(do: [a, b, c])
> [quote(do: a) | [ quote(do: b) | [ quote(do: c) | [] ] ]
quote(do: [a, b, c])
> hd [quote(do: a) | quote(do: [b, c])]
quote(do: a)
> tl [quote(do: a) | quote(do: [b, c])]
quote(do: [b, c])
复制代码
lisp里空列表 () 表明 false; 而elixir里 nil 和 false 的布尔值才是 false,而 [] 的布尔值是 true。递归
(cond (p1 e1) ... (pn en) )
> (cond ((eq 'a 'b) 'first)
((atom 'a) 'second))
second
复制代码
> cond do
> :a == :b -> :first
> is_atom :a -> :second
> end
:second
复制代码
> ( (lambda (x) (cons x '(b) ) ) 'a )
(a b)
> ( (lambda (x y) ( cons x (cdr y) ) )
'z
'(a b c))
(z b c)
复制代码
> (&([&1 | quote(do: [b])])).( quote(do: a))
quote(do: [a, b])
> fn x, y -> [x | tl(y)] end.(quote(do: z), quote(do: [a, b, c]))
quote(do: [z, b, c])
复制代码
函数也可做为参数:it
> ((lambda (f) (f '(b c)))
(lambda (x) (cons 'a x)))
(a b c)
复制代码
> fn f -> f.(quote(do: [b, c])) end.(fn x -> [quote(do: a) | x] end)
quote(do: [a, b, c])
复制代码
定义一个递归的函数, 功能是在各个层级进行替换:io
> (subst 'm 'b '(a b (a b c) d))
(a m (a m c) d)
复制代码
>
复制代码
def subst(x, x, z), do: z
def subst(x, y, [h|t]), do: [subst(x, y, h) | subst(x, y, t)]
def subst(_, _, []), do: []
def subst(x, y, y), do: x
def subst(x, y, z), do: z
> subst :m, :b, [:a, :b, [:a, :b, :c], :d]
[:a, :m, [:a, :m, :c], :d]
复制代码
TO BE CONTINUE..function