Scheme中一些函数在C++里面的实现与吐槽

 

    最终我失败了,这是显而意见,我试图在一个很看重类型是什么的语言中实现无类型操作,事实上,哪怕我实现了基本的cons,car,cdr,list后面的代码也无法写下去。比如说list-n,根据n的不同返回不同的类型,这个函数只能用一些奇淫怪巧来实现,和boost的代码库源代码一样的难度,我实现is_pair这种函数的时候,压根就没用到他那个函数,实现list时候,是一个大神妹子给我了解决方案,但是后续的代码有些能写,比如求list的长度,但是反正list第n项真心无法写,不是无法写,而是无法用递归写,我真心怀疑编译器会直接当掉在实例化模版参数的过程中。说了那么多废话,上代码吧,事实上,个人认为可行解只有使用指针以及一些怪怪的奇淫怪巧

#include <utility>

#include <iostream>

 

namespace scheme

{

 

    using std::pair;

 

    template<typename _CAR,typename _CDR>

    pair<_CAR,_CDR> cons(_CAR car,_CDR cdr)

    {

        return std::make_pair(car,cdr);

    }

 

    template<typename _CAR,typename _CDR>

    _CAR car(const pair<_CAR,_CDR>& cons)

    {

        return cons.first;

    }

 

    template<typename _CAR,typename _CDR>

    _CDR cdr(const pair<_CAR,_CDR>& cons)

    {

        return cons.second;

    }

 

    template<typename T>

    struct _is_pair

        : std::tr1::false_type

    {

    };

 

    template<typename _CAR,typename _CDR>

    struct _is_pair<pair<_CAR,_CDR>>

        : std::tr1::true_type

    {

    };

 

    template<typename T>

    bool is_pair(T)

    {

        return _is_pair<T>::value;

    }

 

    template <typename _CAR, typename ... _REST>

    struct _list_type

    {

typedef pair<_CAR, typename _list_type<_REST...>::type> type;

    };

 

    template <typename _CAR, typename ... _REST>

    typename _list_type<_CAR, _REST ...>::type list (_CAR car, _REST ... rest)

    {

return cons(car, list(rest ...));

    }

 

    /*

    template<typename _CAR>

    pair<_CAR,nullptr_t> list(_CAR car)

    {

        return cons(car,nullptr);

    }

    

    template<typename _CAR,typename ... _REST>

    auto list(_CAR car,_REST ... rest) -> decltype(cons(car,list(rest ...)))

    {

        return cons(car,list(rest ...));

    }

    */

 

    template<typename T>

    void display(const T& t)

    {

        std::cout<<t;

    }

 

    void newline()

    {

        std::cout<<std::endl;

    }

}

 

最后吐槽一句,模版元编程哪怕写了无数的template<typename T>并不是意味着你可以不用类型写代码了,类型无处不在,这就是现在我对C++的看法

模版元编程不适合C++,唔,这就是我的观点了

终,欢迎来喷

你可能感兴趣的:(Scheme)