lambdaway
::
poo
5
|
list
|
login
|
load
|
|
_h1 poo | [[poo2]] | [[poo3]] _p A few steps for lambdatalk in the object oriented world. _h2 1) defining the class "car" {prewrap 1) defining the class properties '{def car.properties {A.new name price power speed}} -> {def car.properties {A.new name price power speed}} 2) defining an object '{def car.new {lambda {:s} {A.new :s}}} -> {def car.new {lambda {:s} {A.new :s}}} 3) getting some property '{def car.get {lambda {:p :c} {let { {:p :p} {:c :c} {:i {A.in? :p {car.properties}}} } {if {= :i -1} then unknown property else {A.get :i :c} }}}} -> {def car.get {lambda {:p :c} {let { {:p :p} {:c :c} {:i {A.in? :p {car.properties}}} } {if {= :i -1} then unknown property else {A.get :i :c} }}}} 4) setting some '{def car.set! {lambda {:p :v :c} {let { {:p :p} {:v :v} {:c :c} {:i {A.in? :p {car.properties}}} } {let { {:foo {if {= :i -1} then {A.addlast! :p {car.properties}} {A.addlast! :v :c} else {A.set! :i :v :c}}}} ok}}}} -> {def car.set! {lambda {:p :v :c} {let { {:p :p} {:v :v} {:c :c} {:i {A.in? :p {car.properties}}} } {let { {:foo {if {= :i -1} then {A.addlast! :p {car.properties}} {A.addlast! :v :c} else {A.set! :i :v :c}}}} ok}}}} 5) displying properties of an object car '{def car.display {def car.display.rec {lambda {:p :c} {if {A.empty? :p} then else
> {A.first :p}: {A.first :c} {car.display.rec {A.rest :p} {A.rest :c}} }}} {lambda {:c} The {A.first :c}'s properties are: {car.display.rec {A.rest {car.properties}} {A.rest :c}} }} -> {def car.display {def car.display.rec {lambda {:p :c} {if {A.empty? :p} then else
> {A.first :p}: {A.first :c} {car.display.rec {A.rest :p} {A.rest :c}} }}} {lambda {:c} The {A.first :c}'s properties are: {car.display.rec {A.rest {car.properties}} {A.rest :c}} }} } _p How to create another class without duplicating all the code? _h2 2) getting & setting properties {pre 1) creating two objects with 3 properties '{def cooper {car.new cooper 40000 231 200}} -> {def cooper {car.new cooper 40000 231 200}} '{def juke {car.new juke 25000 115 180}} -> {def juke {car.new juke 25000 115 180}} 2) getting a property '{car.get price {cooper}} -> {car.get price {cooper}} '{car.get speed {juke}} -> {car.get speed {juke}} '{car.get foo {cooper}} -> {car.get foo {cooper}} 3) editing a property: '{car.set! speed 230 {cooper}} -> {car.set! speed 230 {cooper}} '{car.get speed {cooper}} -> {car.get speed {cooper}} 4) if a property doesn't exist it's added with its value '{car.set! color black {cooper}} -> {car.set! color black {cooper}} '{car.get color {cooper}} -> {car.get color {cooper}} '{car.display {cooper}} -> {car.display {cooper}} '{car.display {juke}} -> {car.display {juke}} } _h2 3) a more object programming style _p Using these macros {pre '{macro \{([\w]*)->([^{}]*)\} to {car.get $2 {$1}}} '{macro \{([\w]*)<-([^{}]*)(?:[\s]*)([^{}]*)\} to {car.set! $2 $3 {$1}}} } {macro \{([\w]*)->([^{}]*)\} to {car.get $2 {$1}}} {macro \{([\w]*)<-([^{}]*)(?:[\s]*)([^{}]*)\} to {car.set! $2 $3 {$1}}} {pre 1) getting '{cooper->price} -> {cooper->price} '{juke->speed} -> {juke->speed} '{juke->foo} -> {juke->foo} '{cooper->speed} -> {cooper->speed} '{cooper->color} -> {cooper->color} 2) setting '{cooper<-color red} -> {cooper<-color red} '{juke<-color yellow} -> {juke<-color yellow} '{cooper->color} -> {cooper->color} '{juke->color} -> {juke->color} {car.display {juke}} } _h2 de quoi s'agit-il ? _p Au final _ul 1) on crée une classe X avec '{X.properties p1 p2 ...}, _ul 2) on crée un objet O de la classe X avec '{def O {X.new v1 v2 ...}} _ul 3) on lit une propriété p de l'objet O avec '{O->p} _ul 4) on assigne la valeur v à la propriété p de l'objet O avec '{O<-p v}, si p n'existe pas elle est créée avec la valeur v. _ul 5) on affiche toutes les propriétés de l'objet O avec '{O.disp} _p What about bikes? _p {i alain marty | 2022/10/13}
lambdaway v.20211111