Using Tuple and bind in Spirit causes compiler error

Juan Dent <[email protected]> Fri, 23 Oct 2020 17:50:58 +0000
Newsgroups gmane.comp.parsers.spirit.general
Message-ID <PH0PR10MB4582B4450F828DD8F663A45E9B1A0@PH0PR10MB4582.namprd10.prod.outlook.com>
Hi,

I produced a MVCE with the error at compile time (see line 22 of MVCE.cpp). REMOVING the semantic action deletes the compiler error!
The source is as follows:
-------------------------------------------------------------------------------------------------------------------------------------
// MVCE.cpp : This file contains the 'main' function. Program execution begins and ends there.
//

#include <string>
#include <iostream>

#include <boost/spirit/include/qi.hpp>
#include <boost/phoenix/phoenix.hpp>

#define TRY_USING_BOOST_TUPLE									// #defining this creates compile error: "boost\spirit\home\qi\detail\assign_to.hpp(153,1): error C2440: 'static_cast': cannot convert from 'const T_' to 'Attribute'"
#ifdef TRY_USING_BOOST_TUPLE
#include <boost/fusion/tuple.hpp>
#include <boost/fusion/adapted.hpp>

#endif

namespace qi = boost::spirit::qi;
namespace ascii = boost::spirit::ascii;
namespace phoenix = boost::phoenix;


using boost::spirit::qi::int_;
using boost::spirit::qi::_1;
using boost::spirit::qi::_2;
using boost::spirit::ascii::char_;
using boost::spirit::ascii::alpha;
using boost::fusion::vector;
using boost::fusion::at_c;
using boost::optional;
using qi::double_;
using qi::_1;
using qi::_val;
using ascii::space;
using phoenix::ref;

void print_pair(boost::optional<double> a, boost::optional<int> b)
{
	if (a)
	{
		auto aa = *a;
		std::cout << aa << std::endl;
	}
	if (b)
	{
		auto bb = *b;
		std::cout << bb << std::endl;
	}
}



bool do_parse()
{
	std::string s = "25 50.77 80"; 
	auto first = s.begin();
	auto last = s.end();


#ifdef TRY_USING_BOOST_TUPLE
	boost::tuple<optional<double>, optional<int>> to;
#else
	vector<optional<double>, optional<int> > to;
#endif
	bool r = qi::phrase_parse(first, last,
		(
			(double_ || int_) [phoenix::bind(&print_pair, _1, _2)]			// REMOVING this semantic action deletes the compiler error!
			),
		space, to);

	auto a = at_c<0>(to);
	auto aa = a ? *a : 0.0;
	auto b = at_c<1>(to);
	auto bb = b ? *b : 0;

	if (first != last)
		return false;
	return r;
}

int main()
{
	do_parse();
	char ch;
    std::cout << "Press enter to exit!\n";
	std::cin >> ch;
}
/// EOF
-------------------------------------------------------------------------------------------------------------------------
I compiled with Visual Studio 2019 version 16.7.6 on Windows 10 Pro version 2004
The error I get is:

C:\vcpkg\installed\x64-windows\include\boost\spirit\home\qi\detail\assign_to.hpp(153,1): error C2440: 'static_cast': cannot convert from 'const T_' to 'Attribute'
1>        with
1>        [
1>            T_=attr_type
1>        ]
1>        and
1>        [
1>            Attribute=boost::tuples::tuple<boost::optional<double>,boost::optional<int>,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type>
1>        ]
1>C:\vcpkg\installed\x64-windows\include\boost\spirit\home\qi\detail\assign_to.hpp(153,1): message : No constructor could take the source type, or constructor overload resolution was ambiguous
1>C:\vcpkg\installed\x64-windows\include\boost\spirit\home\qi\detail\assign_to.hpp(171): message : see reference to function template instantiation 'void boost::spirit::traits::assign_to_attribute_from_value<Attribute,T,void>::call<T>(const T_ &,Attribute &,boost::mpl::false_)' being compiled
1>        with
1>        [
1>            Attribute=boost::tuples::tuple<boost::optional<double>,boost::optional<int>,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type>,
1>            T=attr_type,
1>            T_=attr_type
1>        ]
1>C:\vcpkg\installed\x64-windows\include\boost\spirit\home\qi\detail\assign_to.hpp(171): message : see reference to function template instantiation 'void boost::spirit::traits::assign_to_attribute_from_value<Attribute,T,void>::call<T>(const T_ &,Attribute &,boost::mpl::false_)' being compiled
1>        with
1>        [
1>            Attribute=boost::tuples::tuple<boost::optional<double>,boost::optional<int>,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type>,
1>            T=attr_type,
1>            T_=attr_type
1>        ]
1>C:\vcpkg\installed\x64-windows\include\boost\spirit\home\qi\detail\assign_to.hpp(170): message : while compiling class template member function 'void boost::spirit::traits::assign_to_attribute_from_value<Attribute,T,void>::call(const T &,Attribute &)'
1>        with
1>        [
1>            Attribute=boost::tuples::tuple<boost::optional<double>,boost::optional<int>,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type>,
1>            T=attr_type
1>        ]
1>C:\vcpkg\installed\x64-windows\include\boost\spirit\home\qi\detail\assign_to.hpp(370): message : see reference to function template instantiation 'void boost::spirit::traits::assign_to_attribute_from_value<Attribute,T,void>::call(const T &,Attribute &)' being compiled
1>        with
1>        [
1>            Attribute=boost::tuples::tuple<boost::optional<double>,boost::optional<int>,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type>,
1>            T=attr_type
1>        ]
1>C:\vcpkg\installed\x64-windows\include\boost\spirit\home\qi\detail\assign_to.hpp(370): message : see reference to class template instantiation 'boost::spirit::traits::assign_to_attribute_from_value<Attribute,T,void>' being compiled
1>        with
1>        [
1>            Attribute=boost::tuples::tuple<boost::optional<double>,boost::optional<int>,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type>,
1>            T=attr_type
1>        ]
1>C:\vcpkg\installed\x64-windows\include\boost\spirit\home\qi\detail\assign_to.hpp(393): message : see reference to function template instantiation 'void boost::spirit::traits::detail::assign_to<T,Attribute>(const T &,Attribute &,boost::mpl::false_)' being compiled
1>        with
1>        [
1>            T=attr_type,
1>            Attribute=boost::tuples::tuple<boost::optional<double>,boost::optional<int>,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type>
1>        ]
1>C:\vcpkg\installed\x64-windows\include\boost\spirit\home\qi\detail\attributes.hpp(27): message : see reference to function template instantiation 'void boost::spirit::traits::assign_to<Transformed,Exposed>(const T &,Attribute &)' being compiled
1>        with
1>        [
1>            Transformed=attr_type,
1>            Exposed=boost::tuples::tuple<boost::optional<double>,boost::optional<int>,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type>,
1>            T=attr_type,
1>            Attribute=boost::tuples::tuple<boost::optional<double>,boost::optional<int>,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type>
1>        ]
1>C:\vcpkg\installed\x64-windows\include\boost\spirit\home\qi\detail\attributes.hpp(26): message : while compiling class template member function 'void boost::spirit::qi::default_transform_attribute<Exposed,Transformed>::post(Exposed &,const Transformed &)'
1>        with
1>        [
1>            Exposed=boost::tuples::tuple<boost::optional<double>,boost::optional<int>,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type>,
1>            Transformed=attr_type
1>        ]
1>C:\vcpkg\installed\x64-windows\include\boost\spirit\home\qi\action\action.hpp(71): message : see reference to function template instantiation 'void boost::spirit::qi::default_transform_attribute<Exposed,Transformed>::post(Exposed &,const Transformed &)' being compiled
1>        with
1>        [
1>            Exposed=boost::tuples::tuple<boost::optional<double>,boost::optional<int>,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type>,
1>            Transformed=attr_type
1>        ]
1>C:\vcpkg\installed\x64-windows\include\boost\spirit\home\qi\detail\attributes.hpp(77): message : see reference to class template instantiation 'boost::spirit::qi::default_transform_attribute<Exposed,Transformed>' being compiled
1>        with
1>        [
1>            Exposed=boost::tuples::tuple<boost::optional<double>,boost::optional<int>,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type>,
1>            Transformed=attr_type
1>        ]
1>C:\vcpkg\installed\x64-windows\include\boost\spirit\home\qi\detail\attributes.hpp(130): message : see reference to class template instantiation 'boost::spirit::qi::transform_attribute<Exposed,Transformed,void>' being compiled
1>        with
1>        [
1>            Exposed=boost::tuples::tuple<boost::optional<double>,boost::optional<int>,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type>,
1>            Transformed=attr_type
1>        ]
1>C:\vcpkg\installed\x64-windows\include\boost\spirit\home\support\attributes.hpp(960): message : see reference to class template instantiation 'boost::spirit::traits::detail::transform_attribute_base<Exposed,Transformed,Domain>' being compiled
1>        with
1>        [
1>            Exposed=boost::tuples::tuple<boost::optional<double>,boost::optional<int>,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type>,
1>            Transformed=attr_type,
1>            Domain=boost::spirit::qi::domain
1>        ]
1>C:\vcpkg\installed\x64-windows\include\boost\spirit\home\qi\action\action.hpp(60): message : see reference to class template instantiation 'boost::spirit::traits::transform_attribute<Attribute,attr_type,boost::spirit::qi::domain,void>' being compiled
1>        with
1>        [
1>            Attribute=boost::tuples::tuple<boost::optional<double>,boost::optional<int>,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type>
1>        ]
1>C:\vcpkg\installed\x64-windows\include\boost\spirit\home\qi\parse.hpp(169): message : see reference to function template instantiation 'bool boost::spirit::qi::action<boost::spirit::qi::sequential_or<Elements>,boost::phoenix::actor<boost::proto::exprns_::basic_expr<Tag,Args,3>>>::parse<Iterator,boost::spirit::context<boost::fusion::cons<T &,boost::fusion::nil_>,boost::spirit::locals<boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na>>,skipper_type,Attr>(Iterator &,const Iterator &,Context &,const Skipper &,Attribute &) const' being compiled
1>        with
1>        [
1>            Elements=boost::fusion::cons<boost::spirit::qi::any_real_parser<double,boost::spirit::qi::real_policies<double>>,boost::fusion::cons<boost::spirit::qi::any_int_parser<int,10,1,-1>,boost::fusion::nil_>>,
1>            Tag=boost::phoenix::detail::tag::function_eval,
1>            Args=boost::proto::argsns_::list3<boost::proto::exprns_::basic_expr<boost::proto::tagns_::tag::terminal,boost::proto::argsns_::term<boost::phoenix::detail::function_ptr<void,void (__cdecl *)(boost::optional<double>,boost::optional<int>)>>,0>,boost::phoenix::actor<boost::spirit::argument<0>>,boost::phoenix::actor<boost::spirit::argument<1>>>,
1>            Iterator=std::_String_iterator<std::_String_val<std::_Simple_types<char>>>,
1>            T=boost::tuples::tuple<boost::optional<double>,boost::optional<int>,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type>,
1>            Attr=boost::tuples::tuple<boost::optional<double>,boost::optional<int>,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type>,
1>            Context=boost::spirit::context<boost::fusion::cons<boost::tuples::tuple<boost::optional<double>,boost::optional<int>,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type> &,boost::fusion::nil_>,boost::spirit::locals<boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na>>,
1>            Skipper=skipper_type,
1>            Attribute=boost::tuples::tuple<boost::optional<double>,boost::optional<int>,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type>
1>        ]
1>C:\vcpkg\installed\x64-windows\include\boost\spirit\home\qi\parse.hpp(168): message : see reference to function template instantiation 'bool boost::spirit::qi::action<boost::spirit::qi::sequential_or<Elements>,boost::phoenix::actor<boost::proto::exprns_::basic_expr<Tag,Args,3>>>::parse<Iterator,boost::spirit::context<boost::fusion::cons<T &,boost::fusion::nil_>,boost::spirit::locals<boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na>>,skipper_type,Attr>(Iterator &,const Iterator &,Context &,const Skipper &,Attribute &) const' being compiled
1>        with
1>        [
1>            Elements=boost::fusion::cons<boost::spirit::qi::any_real_parser<double,boost::spirit::qi::real_policies<double>>,boost::fusion::cons<boost::spirit::qi::any_int_parser<int,10,1,-1>,boost::fusion::nil_>>,
1>            Tag=boost::phoenix::detail::tag::function_eval,
1>            Args=boost::proto::argsns_::list3<boost::proto::exprns_::basic_expr<boost::proto::tagns_::tag::terminal,boost::proto::argsns_::term<boost::phoenix::detail::function_ptr<void,void (__cdecl *)(boost::optional<double>,boost::optional<int>)>>,0>,boost::phoenix::actor<boost::spirit::argument<0>>,boost::phoenix::actor<boost::spirit::argument<1>>>,
1>            Iterator=std::_String_iterator<std::_String_val<std::_Simple_types<char>>>,
1>            T=boost::tuples::tuple<boost::optional<double>,boost::optional<int>,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type>,
1>            Attr=boost::tuples::tuple<boost::optional<double>,boost::optional<int>,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type>,
1>            Context=boost::spirit::context<boost::fusion::cons<boost::tuples::tuple<boost::optional<double>,boost::optional<int>,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type> &,boost::fusion::nil_>,boost::spirit::locals<boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na>>,
1>            Skipper=skipper_type,
1>            Attribute=boost::tuples::tuple<boost::optional<double>,boost::optional<int>,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type>
1>        ]
1>C:\vcpkg\installed\x64-windows\include\boost\spirit\home\qi\parse.hpp(201): message : see reference to function template instantiation 'bool boost::spirit::qi::phrase_parse<Iterator,Expr,Skipper,Attr>(Iterator &,Iterator,const Expr &,const Skipper &,boost::spirit::qi::skip_flag,Attr &)' being compiled
1>        with
1>        [
1>            Iterator=std::_String_iterator<std::_String_val<std::_Simple_types<char>>>,
1>            Expr=boost::proto::exprns_::expr<boost::proto::tagns_::tag::subscript,boost::proto::argsns_::list2<const boost::proto::exprns_::expr<boost::proto::tagns_::tag::logical_or,boost::proto::argsns_::list2<const boost::spirit::terminal<boost::spirit::tag::double_> &,const boost::spirit::terminal<boost::spirit::tag::int_> &>,2> &,const boost::phoenix::actor<boost::proto::exprns_::basic_expr<boost::phoenix::detail::tag::function_eval,boost::proto::argsns_::list3<boost::proto::exprns_::basic_expr<boost::proto::tagns_::tag::terminal,boost::proto::argsns_::term<boost::phoenix::detail::function_ptr<void,void (__cdecl *)(boost::optional<double>,boost::optional<int>)>>,0>,boost::phoenix::actor<boost::spirit::argument<0>>,boost::phoenix::actor<boost::spirit::argument<1>>>,3>> &>,2>,
1>            Skipper=boost::spirit::ascii::space_type,
1>            Attr=boost::tuples::tuple<boost::optional<double>,boost::optional<int>,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type>
1>        ]
1>C:\Users\Juan Dent\Source\Repos\DesignPatternsInModernCpp\MVCE\MVCE.cpp(93): message : see reference to function template instantiation 'bool boost::spirit::qi::phrase_parse<std::_String_iterator<std::_String_val<std::_Simple_types<_Elem>>>,boost::proto::exprns_::expr<boost::proto::tagns_::tag::subscript,boost::proto::argsns_::list2<const boost::proto::exprns_::expr<Tag,Args,2> &,const boost::phoenix::actor<boost::proto::exprns_::basic_expr<boost::phoenix::detail::tag::function_eval,boost::proto::argsns_::list3<boost::proto::exprns_::basic_expr<boost::proto::tagns_::tag::terminal,boost::proto::argsns_::term<boost::phoenix::detail::function_ptr<void,void (__cdecl *)(boost::optional<double>,boost::optional<int>)>>,0>,boost::phoenix::actor<boost::spirit::argument<0>>,boost::phoenix::actor<b
 oost::spirit::argument<1>>>,3>> &>,2>,boost::spirit::ascii::space_type,boost::tuples::tuple<boost::optional<double>,boost::optional<int>,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type>>(Iterator &,Iterator,const Expr &,const Skipper &,Attr &)' being compiled
1>        with
1>        [
1>            _Elem=char,
1>            Tag=boost::proto::tagns_::tag::logical_or,
1>            Args=boost::proto::argsns_::list2<const boost::spirit::terminal<boost::spirit::tag::double_> &,const boost::spirit::terminal<boost::spirit::tag::int_> &>,
1>            Iterator=std::_String_iterator<std::_String_val<std::_Simple_types<char>>>,
1>            Expr=boost::proto::exprns_::expr<boost::proto::tagns_::tag::subscript,boost::proto::argsns_::list2<const boost::proto::exprns_::expr<boost::proto::tagns_::tag::logical_or,boost::proto::argsns_::list2<const boost::spirit::terminal<boost::spirit::tag::double_> &,const boost::spirit::terminal<boost::spirit::tag::int_> &>,2> &,const boost::phoenix::actor<boost::proto::exprns_::basic_expr<boost::phoenix::detail::tag::function_eval,boost::proto::argsns_::list3<boost::proto::exprns_::basic_expr<boost::proto::tagns_::tag::terminal,boost::proto::argsns_::term<boost::phoenix::detail::function_ptr<void,void (__cdecl *)(boost::optional<double>,boost::optional<int>)>>,0>,boost::phoenix::actor<boost::spirit::argument<0>>,boost::phoenix::actor<boost::spirit::argument<1>>>,3>> &>,2>,
1>            Skipper=boost::spirit::ascii::space_type,
1>            Attr=boost::tuples::tuple<boost::optional<double>,boost::optional<int>,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type>
1>        ]
1>Done building project "MVCE.vcxproj" -- FAILED.


-----Original Message-----
From: Joel de Guzman <[email protected]> 
Sent: Thursday, October 22, 2020 6:36 PM
To: [email protected]
Subject: Re: [Spirit-general] how to get all the attributes out of a parser

On 10/23/20 8:27 am, Juan Dent wrote:
> Hi,
> 
> This does not address the big question about which are the needed includes for using boost::tuple to get the attributes...
> 
> Or even more general and useful: where is this documented?


In Boost Fusion. For boost::tuple, that would be:
#include <boost/fusion/adapted.hpp>

Seth's stackoverflow is very informative.

Here's my suggestion: if you want trouble-free use of Spirit, just start with the examples and tests and venture outside carefully as you gain more proficiency. If your goal is gaining expertise on Spirit, then read all the docs through-and-through, including all the support libraries such as Fusion. Missing out on little things can get you tangled in (non)issues like this.

Regards,
--
Joel


_______________________________________________
Spirit-general mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/spirit-general