123 | 123 |
emitln('{') &
|
124 | 124 |
indent &
|
125 | 125 |
emit_formal_match_patterns(P,B,Mod, FmlNms, Fs, nil) → PatNms &
|
|
126 |
collect_all_pattern_variables(Fs, nil) → AllPatVars &
|
|
127 |
emit_unifier_structure(AllPatVars) &
|
|
128 |
|
126 | 129 |
emitln('if (') &
|
127 | 130 |
emit_pattern_match_expression(PatNms, FmlNms) &
|
128 | 131 |
emitln(' 1) {') &
|
|
372 | 375 |
$:gensym('temp') → Nm &
|
373 | 376 |
emitln_fmt('struct term *%s = %s;', [Nm, VN]) & Nm.
|
374 | 377 |
|
375 | |
compile_r(P,B,Mod, patternvariable(VN)) =
|
|
378 |
compile_r(P,B,Mod, patternvariable(VN, I)) =
|
376 | 379 |
$:gensym('pattern') → Nm &
|
377 | 380 |
emitln_fmt('struct term *%s = term_new_variable("%s", ' +
|
378 | |
'term_new_from_cstring("nil_%s"));', [Nm, VN, VN]) & Nm.
|
|
381 |
'term_new_from_cstring("nil_%s"), %s);', [Nm, VN, VN, I]) &
|
|
382 |
Nm.
|
379 | 383 |
|
380 | 384 |
compile_r(P,B,Mod, constructor(T,Ts)) =
|
381 | 385 |
compile_r(P,B,Mod, atom(T)) → Nm &
|
|
400 | 404 |
collect_variable_names_all(Ts, L).
|
401 | 405 |
collect_variable_names(variable(VN), L) =
|
402 | 406 |
return list(VN, L).
|
403 | |
collect_variable_names(patternvariable(VN), L) =
|
|
407 |
collect_variable_names(patternvariable(VN, I), L) =
|
404 | 408 |
return list(VN, L).
|
405 | 409 |
|
406 | 410 |
############### misc helpers ##############
|
|
438 | 442 |
PatNms ← [PatNm|PatNms] &
|
439 | 443 |
emit_formal_match_patterns(P,B,Mod, Nms, Fs, PatNms).
|
440 | 444 |
|
|
445 |
collect_all_pattern_variables([], Acc) = Acc.
|
|
446 |
collect_all_pattern_variables([F|Fs], Acc) =
|
|
447 |
collect_variable_names(F, nil) → VarNms &
|
|
448 |
list:reverse(VarNms, nil) → VarNms &
|
|
449 |
list:append(Acc, VarNms) → Acc &
|
|
450 |
collect_all_pattern_variables(Fs, Acc).
|
|
451 |
|
|
452 |
emit_unifier_structure(AllPatVars) =
|
|
453 |
emit('const struct term *unifier[] = {') &
|
|
454 |
emit_unifier_structure_r(AllPatVars) &
|
|
455 |
emitln('};').
|
|
456 |
emit_unifier_structure_r(nil) = 'ok'.
|
|
457 |
emit_unifier_structure_r([V]) =
|
|
458 |
emit('NULL').
|
|
459 |
emit_unifier_structure_r([V|Vs]) =
|
|
460 |
emit('NULL, ') & emit_unifier_structure_r(Vs).
|
|
461 |
|
441 | 462 |
emit_pattern_match_expression([], []) = 'ok'.
|
442 | 463 |
emit_pattern_match_expression([PatNm | PatNms], [FmlNm | FmlNms]) =
|
443 | 464 |
emitln_fmt(' term_match(%s, %s) &&', [PatNm, FmlNm]) &
|