Contenu connexe Similaire à Introduction to Zeder - a production rules toolkit for Clojure (7) Introduction to Zeder - a production rules toolkit for Clojure19. st
Fogus' 1 Law
In the same way that an apple tree
“apples” – so too should your
systems “tuple”
34. Zeder pods decomplect
●
Reference policy
–
●
There are themselves references
Change policy
–
–
●
Transients internally
Mutable objects
Sharing policy (Zeder version anyway)
–
–
Single-thread
Multiple threads
37. th
Fogus' 10 Rule
Any sufficiently complicated Clojure
program contains an ad hoc,
informally-specified, bug-ridden,
slow implementation of half of
OPS5.
38. OPS5
●
Invented in the late 1970s
●
Charles Forgy
●
Rete algorithm
●
Incredibly efficient
●
Used to develop expert systems (XCON)
40. OPS5
{:db/ident :user/username … }
{:db/ident :user/salt … }
(defn store-user-info [uname]
@(transact connection
[{:user/username uname
:user/salt (gen-salt)}]))
;; something triggers a call
;; to store-user-info
41. OPS5
(literalize user
username
salt
)
{:db/ident :user/username … }
{:db/ident :user/salt … }
(p new-user
(user ^username <name>
^salt nil))
-->
(modify 1 ^salt “Bad salt”)
)
(defn store-user-info [uname]
@(transact connection
[{:user/username uname
:user/salt (gen-salt)}]))
(make user ^username fogus
;; something triggers a call
42. OPS5
(literalize user
username
salt
)
{:db/ident :user/username … }
{:db/ident :user/salt … }
(p new-user
(user ^username <name>
^salt nil))
-->
(modify 1 ^salt “Bad salt”)
)
(defn store-user-info [uname]
@(transact connection
[{:user/username uname
:user/salt (gen-salt)}]))
(make user ^username fogus
;; something triggers a call
43. OPS5
(literalize user
username
salt
)
{:db/ident :user/username … }
{:db/ident :user/salt … }
(p new-user
(user ^username <name>
^salt nil))
-->
(modify 1 ^salt “Bad salt”)
)
(defn store-user-info [uname]
@(transact connection
[{:user/username uname
:user/salt (gen-salt)}]))
(make user ^username fogus
;; something triggers a call
44. OPS5
(literalize user
username
salt
)
{:db/ident :user/username … }
{:db/ident :user/salt … }
(p new-user
(user ^username <name>
^salt nil))
-->
(modify 1 ^salt “Bad salt”)
)
(defn store-user-info [uname]
@(transact connection
[{:user/username uname
:user/salt (gen-salt)}]))
(make user ^username fogus
??
;; something triggers a call
56. Driving principles
●
Get stuff done
●
Data rocks
●
Don't invent anything
●
Protocols (swappable engines)
●
Pattern matching
●
Immutability (or the appearance thereof)
●
Fast would be nice