- A representation of 'partial strings' as difference lists
of characters (_done_).
* `term_expansion/2` and `goal_expansion/2` (_in progress_).
-* Definite Clause Grammars.
+* Definite Clause Grammars (_in progress_).
* Attributed variables using the SICStus Prolog interface and
semantics. Adding coroutines like `dif/2`, `freeze/2`, etc.
is straightforward with attributed variables.
wam.machine_flags())?;
compile_appendix(&mut decl_code, &queue, non_counted_bt, wam.machine_flags())?;
-
+
let idx = code_dir.entry((name, arity)).or_insert(CodeIndex::default());
set_code_index!(idx, IndexPtr::Index(p), self.get_module_name());
let mut code = cg.compile_predicate(&(preds.0).0)?;
compile_appendix(&mut code, &preds.1, false, flags)?;
-
+
Ok(code_repo.term_expanders = code)
},
Declaration::NonCountedBacktracking(name, arity) =>
try_eval_session!(compiler.add_code(wam, module_code, indices));
try_eval_session!(compiler.add_code(wam, toplvl_code, results.toplevel_indices));
-
+
EvalSession::EntrySuccess
}
where Target: CompilationTarget<'a>
{
let r = cell.get();
+
+ let r = match lvl {
+ Level::Shallow => {
+ let k = self.arg_c;
+
+ if let GenContext::Last(chunk_num) = term_loc {
+ self.evacuate_arg(chunk_num, target);
+ }
+
+ self.arg_c += 1;
+ RegType::Temp(k)
+ },
+ _ if r.reg_num() == 0 => RegType::Temp(self.alloc_reg_to_non_var()),
+ _ => r
+ };
- if r.reg_num() == 0 {
- let r = match lvl {
- Level::Shallow => {
- let k = self.arg_c;
-
- if let GenContext::Last(chunk_num) = term_loc {
- self.evacuate_arg(chunk_num, target);
- }
-
- self.arg_c += 1;
- RegType::Temp(k)
- },
- _ => RegType::Temp(self.alloc_reg_to_non_var())
- };
-
- cell.set(r);
- }
+ cell.set(r);
}
fn mark_var<Target>(&mut self, var: Rc<Var>, lvl: Level, cell: &'a Cell<VarReg>,
!,
nonvar(Head),
Head =.. [RuleName | Args],
- append(Args, ['$VAR'(0), '$VAR'(N)], ModArgs),
+ append(Args, ['$VAR'(0), '$VAR'(N)], ModArgs), %% problematic line.
ModHead =.. [RuleName | ModArgs],
nonvar(Body),
expand_body(Body, ModBody1, 0, N1),
continue;
}
-
+
self.indices.code_dir.insert(key.clone(), idx.clone());
}
self.machine_st.copy_and_align_ball_to_heap();
let error_str = self.machine_st.print_exception(Addr::HeapCell(h),
- &heap_locs,
- TermFormatter {},
- PrinterOutputter::new())
+ &heap_locs,
+ TermFormatter {},
+ PrinterOutputter::new())
.result();
EvalSession::from(SessionError::QueryFailureWithException(error_str))