← Архив: Common Lisp

with-open-file + parse-with-lexer

Author: · 30.07.2013 13:26
· original author: Paul.Alkhimov
Кто знает, что за магия мешает блоку
(with-open-file (stream "c:/!idl/test.idl" :direction :input :if-does-not-exist nil)
   (parse-with-lexer #'(lambda () (lexer stream))
                     *idl-parser*
)
)

вернуть два значения, прописанные в документации по parse-with-lexer?
multiple-value-bind не помогает, но pprint значение показывает (и возвращает Т):
(with-open-file (stream "c:/!idl/test.idl" :direction :input :if-does-not-exist nil)
  (pprint
   (parse-with-lexer #'(lambda () (lexer stream))
                     *idl-parser*
)
)
)

Если вместо pprint я ставлю multiple-value-bind и возврат списка из двух полученных значений, возвращается такое:
(Т)
Подскажите, что это может быть?..
· original author: Charlz_Klug
CL-USER> (cons t nil)
(T)
CL-USER>
Всё верно, список из двух значений.
· original author: Paul.Alkhimov
Я торопился, поэтому написал невнятно.
Вот какой результат мне видно в случае pprint:
(((|include| (|set|)) (|include| (|set.hxx|)) (|include| (|set|)) (|include| (|set.hxx|)) (|include| (|common| |types| |set.hxx|))) (|module| |name.name.name| (|version| "0.0.1" (:COMMENT "/* sdfg sdfgdsfg */" "// test 1 2 3a")) (|const| NIL |uint32| MANAGER_INSTANCE_ID 1) (|const| NIL |uint32| TEST_INSTANCE_ID 2) (|enum| RESULT_TYPE (RESULT_OK 1 :COMMENT "/* * Operation successful */") (RESULT_ERROR_GENERIC 2 :COMMENT "/* * If no more specific error matches the problem, this * is the default error enum. The request will not be * repeated if RESULT_ERROR_GENERIC is returned. */") (RESULT_ERROR_DATABASES_NOT_AVAILABLE) :COMMENT "/* enum 1 comment */") (|struct| |Component| (|string| |componentName| :COMMENT "/* * componentName should be the internal name of the component or * database. It should not be a translated string. */") (|int8| |versionInfo[5]| :COMMENT "// blah blah") :COMMENT "/* * Generic return type that describes a database with name and version. */") (|interface| |RegionInfo| (|version| "0.0.3" NIL) (|request| |asdfasdf| (|sdfg.sdfg.sdfg| |sdfg|) (|uint16| |requestID|)) (|reply| |asdfasdf| (|sdfg.sdfg.sdfg| |sdfg|) (|uint16| |requestID|)) (|request| |asdfasdf| (|sdfg.sdfg.sdfg| |sdfg|) (|uint16| |requestID|)) :COMMENT "/* * Interface between ConnectedNav and Navigation */") :COMMENT "/* module comment */"))TНо во втором случае, при использовании multiple-value-bind, остаётся только T, весь основной результат работы не сохраняется.
Я уже тыкался-пыкался со значениями * (я имею в виду последнее возвращаемое значение в репле), но там тоже только Т.
У меня такое ощущение, что with-open-file как-то чудит, но я не уверен.
Ещё некоторые (но не все) функции обёрнуты в такую форму:
(eval-when (:compile-toplevel :load-toplevel :execute)
  ...
)

Я, к сожалению, не знаю что именно она делает, особенно учитывая, что замыканий в ней нет, только обычные функции.
Может быть, в ней тоже дело.
· original author: Paul.Alkhimov
Чисто для проверки я вынес все функции из eval-when наружу и проверил,
(with-open-file (stream "c:/!idl/test.idl" :direction :input :if-does-not-exist nil)
  (multiple-value-list (parse-with-lexer #'(lambda () (lexer stream))
                                         *idl-parser*
)
)
)

возвращает Т
Так что больше даже предположений нет... :(
· original author: Charlz_Klug
Что за библиотека?
· original author: Paul.Alkhimov
CL-YACC