From mboxrd@z Thu Jan 1 00:00:00 1970 From: Christian Egli Subject: [PATCH 3/5] Replace recursive functions with iterative ones Date: Wed, 16 Mar 2011 12:05:00 +0100 Message-ID: <1300273502-12977-4-git-send-email-christian.egli@alumni.ethz.ch> References: <1300273502-12977-1-git-send-email-christian.egli@alumni.ethz.ch> Return-path: Received: from [140.186.70.92] (port=36610 helo=eggs.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1PzoXS-0006GK-35 for emacs-orgmode@gnu.org; Wed, 16 Mar 2011 07:05:15 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1PzoXP-0005fv-4j for emacs-orgmode@gnu.org; Wed, 16 Mar 2011 07:05:12 -0400 Received: from mail.sbszh.ch ([217.162.18.84]:40946) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1PzoXO-0005ec-O6 for emacs-orgmode@gnu.org; Wed, 16 Mar 2011 07:05:11 -0400 Received: from localhost (localhost [127.0.0.1]) by mail.sbszh.ch (Postfix) with ESMTP id A08DD86E3 for ; Wed, 16 Mar 2011 12:05:07 +0100 (CET) Received: from mail.sbszh.ch ([127.0.0.1]) by localhost (mail01.dmz.sbszh.ch [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id 7j6KV-ffjzRj for ; Wed, 16 Mar 2011 12:05:05 +0100 (CET) Received: from s05.sbszh.ch (s05.sbszh.ch [10.0.9.9]) by mail.sbszh.ch (Postfix) with ESMTP id 4AE7286E4 for ; Wed, 16 Mar 2011 12:05:03 +0100 (CET) Received: from localhost (unknown [127.0.0.1]) by localhost.sbszh.ch (Postfix) with ESMTP id A89EB15C2A9 for ; Wed, 16 Mar 2011 11:05:03 +0000 (UTC) Received: from s05.sbszh.ch ([127.0.0.1]) by localhost (s05.sbszh.ch [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id 12687-05 for ; Wed, 16 Mar 2011 12:05:03 +0100 (CET) Received: from wharton.sbszh.ch (w302.sbszh.ch [10.0.41.2]) by s05.sbszh.ch (Postfix) with ESMTP id 7527F15C2B9 for ; Wed, 16 Mar 2011 12:05:03 +0100 (CET) In-Reply-To: <1300273502-12977-1-git-send-email-christian.egli@alumni.ethz.ch> List-Id: "General discussions about Org-mode." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: emacs-orgmode-bounces+geo-emacs-orgmode=m.gmane.org@gnu.org Errors-To: emacs-orgmode-bounces+geo-emacs-orgmode=m.gmane.org@gnu.org To: emacs-orgmode@gnu.org * org-taskjuggler.el (org-taskjuggler-compute-task-leafiness): (org-taskjuggler-assign-resource-ids): Replace recursive implementation with an iterative one. That way we can avoid to have ask users to increase `max-lisp-eval-depth'. --- lisp/org-taskjuggler.el | 48 ++++++++++++++++++++++++---------------------- 1 files changed, 25 insertions(+), 23 deletions(-) diff --git a/lisp/org-taskjuggler.el b/lisp/org-taskjuggler.el index 2d16790..5b3f16f 100644 --- a/lisp/org-taskjuggler.el +++ b/lisp/org-taskjuggler.el @@ -397,31 +397,33 @@ a path to the current task." "Figure out if each task is a leaf by looking at it's level, and the level of its successor. If the successor is higher (ie deeper), then it's not a leaf." - (cond - ((null tasks) nil) - ;; if a task has no successors it is a leaf - ((null (car (cdr tasks))) - (cons (cons (cons "leaf-node" t) (car tasks)) - (org-taskjuggler-compute-task-leafiness (cdr tasks)))) - ;; if the successor has a lower level than task it is a leaf - ((<= (cdr (assoc "level" (car (cdr tasks)))) (cdr (assoc "level" (car tasks)))) - (cons (cons (cons "leaf-node" t) (car tasks)) - (org-taskjuggler-compute-task-leafiness (cdr tasks)))) - ;; otherwise examine the rest of the tasks - (t (cons (car tasks) (org-taskjuggler-compute-task-leafiness (cdr tasks)))))) - -(defun org-taskjuggler-assign-resource-ids (resources &optional unique-ids) + (let (new-list) + (while (car tasks) + (let ((task (car tasks)) + (successor (car (cdr tasks)))) + (cond + ;; if a task has no successors it is a leaf + ((null successor) + (push (cons (cons "leaf-node" t) task) new-list)) + ;; if the successor has a lower level than task it is a leaf + ((<= (cdr (assoc "level" successor)) (cdr (assoc "level" task))) + (push (cons (cons "leaf-node" t) task) new-list)) + ;; otherwise examine the rest of the tasks + (t (push task new-list)))) + (setq tasks (cdr tasks))) + (print new-list) + (nreverse new-list))) + +(defun org-taskjuggler-assign-resource-ids (resources) "Given a list of resources return the same list, assigning a unique id to each resource." - (cond - ((null resources) nil) - (t - (let* ((resource (car resources)) - (unique-id (org-taskjuggler-get-unique-id resource unique-ids))) - (push (cons "unique-id" unique-id) resource) - (cons resource - (org-taskjuggler-assign-resource-ids (cdr resources) - (cons unique-id unique-ids))))))) + (let (unique-ids new-list) + (dolist (resource resources new-list) + (let ((unique-id (org-taskjuggler-get-unique-id resource unique-ids))) + (push (cons "unique-id" unique-id) resource) + (push unique-id unique-ids) + (push resource new-list))) + (nreverse new-list))) (defun org-taskjuggler-resolve-dependencies (tasks) (let ((previous-level 0) -- 1.7.1