diff --git a/phpinspect-pipeline.el b/phpinspect-pipeline.el index c684dc9..c9c7cf2 100644 --- a/phpinspect-pipeline.el +++ b/phpinspect-pipeline.el @@ -147,22 +147,23 @@ directories." (error "Function name must be a symbol, got: %s" func-name)) - (let ((thread-name (concat "phpinspect-pipeline-" (symbol-name func-name))) - (statement (list func-name)) - (incoming (gensym "incoming")) - (outgoing (gensym "outgoing")) - (inc-queue (gensym "queue")) - (out-queue (gensym "queue")) - (context-sym (gensym "context")) - (continue-running (gensym "continue-running")) - (pctx-sym (gensym "pipeline-ctx")) - (incoming-end (gensym "incoming-end")) - (end (gensym "end"))) + (let* ((thread-name (concat "phpinspect-pipeline-" (symbol-name func-name))) + (statement (list func-name)) + (statement-rear statement) + (incoming (gensym "incoming")) + (outgoing (gensym "outgoing")) + (inc-queue (gensym "queue")) + (out-queue (gensym "queue")) + (context-sym (gensym "context")) + (continue-running (gensym "continue-running")) + (pctx-sym (gensym "pipeline-ctx")) + (incoming-end (gensym "incoming-end")) + (end (gensym "end"))) (when local-ctx - (setq statement (nconc statement (list context-sym)))) + (setq statement-rear (setcdr statement-rear (cons context-sym nil)))) - (setq statement (nconc statement (list incoming))) + (setq statement-rear (setcdr statement-rear (cons incoming nil))) `(let ((,inc-queue ,queue) (,out-queue ,consumer-queue) diff --git a/phpinspect-util.el b/phpinspect-util.el index f79b6c8..3c04f7f 100644 --- a/phpinspect-util.el +++ b/phpinspect-util.el @@ -179,7 +179,10 @@ it evaluates to a non-nil value." (sequence-pos 0) (sequence-sym (gensym)) (match-sym (gensym)) - checkers key value) + (match-rear-sym (gensym)) + (checkers (cons nil nil)) + (checkers-rear checkers) + key value) (while (setq key (pop pattern)) (unless (keywordp key) @@ -190,26 +193,37 @@ it evaluates to a non-nil value." (cond ((eq key :m) (unless (eq value '*) - (setq checkers - (nconc checkers (list `(equal ,value (elt ,sequence-sym ,sequence-pos))))))) + (setq checkers-rear + (setcdr checkers-rear + (cons `(equal ,value (elt ,sequence-sym ,sequence-pos)) nil))))) ((eq key :f) - (setq checkers - (nconc - checkers (list - (if (symbolp value) - `(,value (elt ,sequence-sym ,sequence-pos)) - `(funcall ,value (elt ,sequence-sym ,sequence-pos))))))) + (setq checkers-rear + (setcdr + checkers-rear + (cons + (if (symbolp value) + `(,value (elt ,sequence-sym ,sequence-pos)) + `(funcall ,value (elt ,sequence-sym ,sequence-pos))) + nil)))) (t (error "Invalid keyword: %s" key))) - (setq checkers (nconc checkers (list `(setq ,match-sym (nconc ,match-sym (list (elt ,sequence-sym ,sequence-pos))))))) + (setq checkers-rear + (setcdr checkers-rear + (cons `(setq ,match-rear-sym + (setcdr ,match-rear-sym + (cons (elt ,sequence-sym ,sequence-pos) nil))) + nil))) (setq sequence-pos (+ sequence-pos 1))) - `(let ((,sequence-sym ,sequence) - ,match-sym) + (setq checkers (cdr checkers)) + + `(let* ((,sequence-sym ,sequence) + (,match-sym (cons nil nil)) + (,match-rear-sym ,match-sym)) (and (= ,sequence-length (length ,sequence)) ,@checkers) - ,match-sym))) + (cdr ,match-sym)))) (defun phpinspect--pattern-concat (pattern1 pattern2) (let* ((pattern1-sequence-length (/ (length (phpinspect--pattern-code pattern1)) 2))) diff --git a/test/test-util.el b/test/test-util.el index 63ead98..c10e7bd 100644 --- a/test/test-util.el +++ b/test/test-util.el @@ -1,4 +1,4 @@ -;; test-util.el --- Unit tests for phpinspect.el -*- lexical-binding: t; -*- +;;; test-util.el --- Unit tests for phpinspect.el -*- lexical-binding: t; -*- ;; Copyright (C) 2021-2023 Free Software Foundation, Inc.