Small file (aa.lisp) with examples from the cl-ppcre documentation:
(defpackage :aa (:use :common-lisp :cl-ppcre))
(in-package :aa)
(define-parse-tree-synonym a-z (:char-class (:range #\a #\z) (:range #\a #\z)))
(define-parse-tree-synonym a-z* (:greedy-repetition 0 nil a-z))
(defun ascii-char-tester (string) (scan '(:sequence :start-anchor a-z* :end-anchor) string))
If I just load this file than all is ok. If I compile it first and then load aa.x86f (I use CMUCL) than it stops with error: Unknown token A-Z* in parse-tree [Condition of type PPCRE-SYNTAX-ERROR]
Restarts: 0: [CONTINUE] Return NIL from load of "aa.x86f". 1: [ABORT ] Return to Top-Level.
Debug (type H for help)
(CL-PPCRE::CONVERT-AUX #<unavailable-arg>)
Why does it not work?
On Mon, 10 Oct 2005 20:43:17 +1100, Igor Plekhov penguin@ocean.vvo.ru wrote:
Small file (aa.lisp) with examples from the cl-ppcre documentation:
(defpackage :aa (:use :common-lisp :cl-ppcre))
(in-package :aa)
(define-parse-tree-synonym a-z (:char-class (:range #\a #\z) (:range #\a #\z)))
(define-parse-tree-synonym a-z* (:greedy-repetition 0 nil a-z))
(defun ascii-char-tester (string) (scan '(:sequence :start-anchor a-z* :end-anchor) string))
If I just load this file than all is ok. If I compile it first and then load aa.x86f (I use CMUCL) than it stops with error: Unknown token A-Z* in parse-tree [Condition of type PPCRE-SYNTAX-ERROR]
Restarts: 0: [CONTINUE] Return NIL from load of "aa.x86f". 1: [ABORT ] Return to Top-Level.
Debug (type H for help)
(CL-PPCRE::CONVERT-AUX #<unavailable-arg>)
Why does it not work?
I just checked and I see the same error message. However, your example works fine with LispWorks, AllegroCL, SBCL, and CLISP. I suspect this might be a bug in CMUCL - note the EVAL-WHEN that's part of the definition of DEFINE-PARSE-TREE-SYNONYM. It looks to me as if the code isn't executed at load time although it should.
Maybe you'll want to ask on the CMUCL mailing list.
Cheers, Edi.
On Mon, 10 Oct, 2005 at 16:16:45 +0200, Edi Weitz wrote:
(define-parse-tree-synonym a-z (:char-class (:range #\a #\z) (:range #\a #\z)))
(define-parse-tree-synonym a-z* (:greedy-repetition 0 nil a-z))
(defun ascii-char-tester (string) (scan '(:sequence :start-anchor a-z* :end-anchor) string))
I just checked and I see the same error message. However, your example works fine with LispWorks, AllegroCL, SBCL, and CLISP. I suspect this might be a bug in CMUCL - note the EVAL-WHEN that's part of the definition of DEFINE-PARSE-TREE-SYNONYM. It looks to me as if the code isn't executed at load time although it should.
I have searched Google... It is certainly a bug in CMUCL :-(
As a workaround it can be written as: (defparameter a-z '(:char-class (:range #\a #\z) (:range #\a #\z))) (defparameter a-z* `(:greedy-repetition 0 nil ,a-z))
(defun ascii-char-tester (string) (scan `(:sequence :start-anchor ,a-z* :end-anchor) string))
On Tue, 11 Oct 2005 15:02:23 +1100, Igor Plekhov penguin@ocean.vvo.ru wrote:
I have searched Google... It is certainly a bug in CMUCL :-(
Too bad. Do you have a URL? Will they fix it?
As a workaround it can be written as: (defparameter a-z '(:char-class (:range #\a #\z) (:range #\a #\z))) (defparameter a-z* `(:greedy-repetition 0 nil ,a-z))
(defun ascii-char-tester (string) (scan `(:sequence :start-anchor ,a-z* :end-anchor) string))
But that way you'll lose the constantness of the regular expression so CL-PPCRE won't be able to use the compiler macros to pre-compile the regular expression. (Just in case you're concerned about performance.)
Cheers, Edi.
On Tue, 11 Oct, 2005 at 08:55:52 +0200, Edi Weitz wrote:
I have searched Google... It is certainly a bug in CMUCL :-(
Too bad. Do you have a URL? Will they fix it?
Here are similar problems: http://groups.google.com/group/linux.debian.bugs.dist/browse_thread/thread/d...
As a workaround it can be written as: (defparameter a-z '(:char-class (:range #\a #\z) (:range #\a #\z))) (defparameter a-z* `(:greedy-repetition 0 nil ,a-z))
(defun ascii-char-tester (string) (scan `(:sequence :start-anchor ,a-z* :end-anchor) string))
But that way you'll lose the constantness of the regular expression so CL-PPCRE won't be able to use the compiler macros to pre-compile the regular expression. (Just in case you're concerned about performance.)
In that case will CL-PPCRE ever compile regular expression (at evaluation time for example)? If it will, at which time? Will it, if I change defparameter to defconstant?
On Wed, 12 Oct 2005 09:54:55 +1100, Igor Plekhov penguin@ocean.vvo.ru wrote:
Here are similar problems: http://groups.google.com/group/linux.debian.bugs.dist/browse_thread/thread/d...
Thanks.
In that case will CL-PPCRE ever compile regular expression (at evaluation time for example)? If it will, at which time?
CL-PPCRE will always compile regular expressions. The question is whether it'll do it once or each time SCAN is invoked. It can pre-compile the regular expression if it can figure out that the regular expression in question is constant. See the compiler macros in api.lisp and the definition of DEFINE-COMPILER-MACRO in the CLHS.
Will it, if I change defparameter to defconstant?
Maybe. I think that depends on the interplay between backquote and constants in each Lisp implementation (CMUCL, in your case). See CONSTANTP in the CLHS.
Cheers, Edi.
cl-ppcre-devel@common-lisp.net