Here python code. Simple request with user login (i remove some details for cleaess):
def process_request(request):
if post:
validators_map = (('email', (validators.v_required, validators.v_email,)),
('password', (validators.v_required,)))
has_errors, errors_map = validators.validate_map(post, validators_map)
context['errors'] = errors_map
if not has_errors:
r = user_login(email=post['email'], password=post['password'])
if r['result'] == 'fail':
context['error'] = r['error']
retu Template('/login')
elif r['result'] == 'ok':
session['user_id'] = r['user_id']
retu Template('/succes_login')
retu Template('/login')
With if statems it looks like little messy. I want to make this code more expressive. So then i look for my code i want to see:
1. Expressive steps of my computation (DSL steps).
2. Expressive control flow grapth. (transition between my DSL steps)
I try with this code:
def process_request(request):
def do_post()
validators_map = (('email', (validators.required, validators.email,)),
('password', (validators.required,)))
has_errors, errors_map = validators.validate_map(post, validators_map)
context['errors'] = errors_map
def has_form_errors():
retu Template('/login')
def form_valid_succes():
r = user_login(email=post['email'], password=post['password'])
def login_ok():
session['user_id'] = r['user_id']
retu Template('/succes_login')
def login_fail():
context['error'] = r['error']
retu Template('/login')
{True: login_ok,
False: login_fail}[r['result'] == 'ok']()
{True: has_form_errors,
False: form_valid_succes}[has_errors]()
def default():
retu Template('/login')
{True: do_post,
False: default}[bool(request.post)]()
It took more code, but now I express and isolate each of my high level steps in separate function block. If I look at this idea without bound to programming language I can express it by FSM graph or CFG graph:
So to make this idea more expressive what should i use for implementation? may be some FSM libs? Can i use monads here ? By definition monad is a structure that represents computations defined as sequences of steps... some libs, examples?
So, how you think what is more expressive way of doing this?

