青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

loop_in_codes

低調做技術__歡迎移步我的獨立博客 codemaro.com 微博 kevinlynx

像寫函數式語言代碼一樣寫C++


忘記最早接觸函數式編程語言是什么時候了,也忘記接觸的第一門函數式語言是哪一門。斷斷續續接觸過好幾種函數式語言(當然都算不純的,ruby/lisp不算純吧),這些語言的思想在潛移默化中多多少少對我有所影響。

我是個C++程序員,我不知道我平時寫的都是些什么代碼。最讓人印象深刻就是我會經常寫遍歷STL容器的代碼,是經常,這樣的遍歷你可能也不陌生:

for (ListType::iterator it = con.begin(); it != con.end(); ++it) {
    something
}

或者針對std::map/set等的查找:

Table::iterator it = table.find(key);
if (it == table.end())
    
do-something
do-something

多虧STL接口的一致性,這讓我們寫出了很多“一致性“代碼。慢慢地我覺得惡心,不禁想起函數式編程語言中,對于這種需求一般都會提供類似的接口:

con.map(function (it) if (it->some-filed == some-value) return something end)
# 或者
con.each 
do |it| if it.some-filed == some-value then return something end end
# 或者
(con.map (lambda (it) (
if ((= it.some-filed some-value)) (return something))))

(好吧,lisp我又忘了)總之,這種針對容器的遍歷操作,都會成為一種內置接口,并且通過lambda來讓用戶直接編寫處理代碼,少去寫循環的冗余。然后,我寫了類似下面的一組宏(隨手敲的不保證能運行):

#define IT_N __it

#define TRAVERSE_MAP(type, map, exps) \
    
for (type::iterator IT_N = map.begin(); IT_N != map.end(); ++IT_N) { \
        exps; \
    }
#define I_KEY (IT_N->first)
#define I_VALUE (IT_N->second)

#define TRAVERSE_LIST(type, list, exps) \
    
for (type::iterator IT_N = list.begin(); IT_N != list.end(); ++IT_N) { \
        exps; \
    }
#define L_VALUE (*IT_N)

#define FIND_MAP_ITEM(type, map, key, fexps, texps) \
    
do { \
        type::iterator IT_N 
= map.find(key); \
        
if (IT_N == map.end()) { \
            fexps; \
        } 
else { \
            texps; \
        } \
    } 
while(0)

#define VAL_N __val
#define FIND_LIST_ITEM_IF(type, list, cmp, fexps, texps) \
    
do { \
        
struct Comp { \
            
bool operator() (const type::value_type &VAL_N) const { \
                
return cmp; \
            } \
        }; \
        type::iterator IT_N 
= std::find_if(list.begin(), list.end(), Comp()); \
        
if (IT_N != list.end()) { \
            texps; \
        } 
else { \
            fexps; \
        } \
    } 
while(0)

#define NULL_EXP ;

當然,以上接口都還包含一些const版本,用于const容器的使用。使用的時候(截取的項目中的使用例子):

TRAVERSE_MAP(TimerTable, m_timers, 
        I_VALUE.obj
->OnTimerCancel(I_KEY, I_VALUE.arg);
        TIMER_CANCEL(I_VALUE.id)); 

TRAVERSE_LIST(AreaList, areas,
        ids.push_back(L_VALUE
->ID()));

FIND_MAP_ITEM(PropertyTable, m_properties, name,
        LogWarn(
"set a non-existed property %s", name.c_str()); return NIL_VALUE,
        
if (val.Type() != I_VALUE.type()) {
            
return NIL_VALUE; 
        } 
else {
            GValue old 
= I_VALUE;
            I_VALUE 
= val; 
            
return old;
        });

多虧了C/C++宏對一切內容的可容納性,可以讓我往宏參數里塞進像if這種復合語句,甚至多條語句(例如最后一個例子)。這些宏我使用了一段時間,開始覺得挺爽,很多函數的實現里,我再也不用寫那些重復的代碼了。但是后來我發覺這些代碼越來越惡心了。最大的弊端在于不可調試,我只能將斷點下到更深的代碼層;然后就是看起來特不直觀,連作者自己都看得覺得不直觀了,可想而知那些連函數式編程語言都不知道是什么的C++程序員看到這些代碼會是什么心情(可以想象哥已經被詛咒了多少次)。

函數式語言讓人寫出更短的代碼,這一點也對我有影響,例如我最近又寫下了一些邪惡代碼:

// split a string into several sub strings by a split character i.e:
// "a;b;c;" => "a", "b", "c"
// "a;b;c" => "a", "b", "c"
std::vector<std::string> SplitString(const std::string &str, char split) {
    std::vector
<std::string> ret;
    size_t last 
= 0;
    
for (size_t pos = str.find(split); pos != std::string::npos; last = pos + 1, pos = str.find(split, last)) {
        ret.push_back(str.substr(last, pos 
- last));
    }
    
return last < str.length() ? ret.push_back(str.substr(last)) : 0, ret;
}

惡心的就是最后那條return語句,因為我需要處理”a;b;c”這種c后面沒加分隔符的情況,但我并不愿意為了這個需求再寫一個會占超過一行的if語句。因為,我太喜歡ruby里的if了:


do-something if exp

也就是ruby里允許這種只有一行if的代碼將if放在其后并作為一條語句。我的不愿意其實是有理由的,在c/c++中有太多只有一行條件體的if語句,對這些語句參合進編程風格/可讀性進來后,就不得不讓你寫出不安的代碼,例如:

if (something) return something; // 某些編程風格里不允許這樣做,因為它不方便調試

if (something) 
    
return something; // 某些風格里又有大括號的統一要求

if (something) {
    
return something; // 就算符合風格了,但這一條語句就得多個大括號
}

if (something) 
{
    
return something; // 某些風格里這大括號就更奢侈了
}

這個return除了乍看上去有點糾結外,其實也不算什么大問題,但是那個問號表達式返回的0實在沒有任何意義,而正是沒有意義才會讓它誤導人。本來我是可以寫成:

return last < str.length() && ret.push_back(str.substr(last)), ret;

這樣利用條件表達式的短路運算,代碼也清晰多了。但是,std::vector::push_back是一個沒有返回值的函數,所以。

全文完。

posted on 2012-07-31 09:43 Kevin Lynx 閱讀(3084) 評論(3)  編輯 收藏 引用 所屬分類: c/c++

評論

# re: 像寫函數式語言代碼一樣寫C++ 2012-08-01 13:43 fzy

#define FIDN_MAP_ITEM(type, map, key, fexps, texps) \


這里FIDN寫錯了
  回復  更多評論   

# re: 像寫函數式語言代碼一樣寫C++ 2012-08-02 09:31 Kevin Lynx

@fzy
thanks,眼神真好!  回復  更多評論   

# re: 像寫函數式語言代碼一樣寫C++ 2012-08-02 12:26 aa

不錯 和freebsd中的鏈表/map等類似  回復  更多評論   

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美电影免费观看大全| 久久久久久穴| 国产在线成人| 国产婷婷一区二区| 国产欧美一区二区三区国产幕精品| 国产精品第13页| 国产精品午夜电影| 国内综合精品午夜久久资源| 亚洲国产欧美久久| 99精品国产在热久久婷婷| 一本色道精品久久一区二区三区 | 午夜精彩视频在线观看不卡 | 欧美午夜大胆人体| 欧美1区视频| 在线成人www免费观看视频| 亚洲国产影院| 亚洲一区二区三区精品在线观看| 欧美中文在线观看国产| 久久一区二区三区四区| 欧美va日韩va| 一区二区日韩免费看| 午夜激情一区| 欧美区在线观看| 国产一级一区二区| 日韩性生活视频| 久久久久久久久伊人| 亚洲欧洲精品一区二区三区波多野1战4| 亚洲精品国产精品国产自| 亚洲综合成人在线| 欧美黄色片免费观看| 国产女主播一区二区| 亚洲精品久久久久久久久久久 | 欧美99久久| 亚洲一区二区精品在线| 欧美福利一区二区三区| 国产一区二区黄| 一区二区三区成人| 欧美高清视频| 久久av二区| 国产精品日韩二区| 亚洲网友自拍| 亚洲美女中文字幕| 欧美sm极限捆绑bd| 在线播放不卡| 久久免费国产精品| 午夜电影亚洲| 国产精品一香蕉国产线看观看 | 欧美精品自拍| 亚洲黄色有码视频| 久久阴道视频| 性欧美videos另类喷潮| 欧美日韩小视频| 亚洲精品黄网在线观看| 欧美激情1区2区| 久久久久久综合网天天| 国产中文一区二区| 久久国产综合精品| 新67194成人永久网站| 国产精品va在线播放| 在线一区二区视频| 亚洲日本中文字幕| 欧美连裤袜在线视频| 日韩视频不卡| 亚洲精品一区二区三区99| 欧美激情网友自拍| 日韩亚洲视频| 亚洲精品视频免费观看| 欧美精品色网| 国产日本欧美一区二区三区| 一区二区欧美亚洲| 欧美激情一级片一区二区| 久久久www成人免费无遮挡大片| 国产日韩精品一区二区三区| 欧美亚洲在线播放| 欧美一区二区视频97| 韩国三级在线一区| 欧美gay视频激情| 欧美成人蜜桃| 中文一区字幕| 亚洲在线观看免费视频| 韩国成人理伦片免费播放| 国产亚洲综合精品| 毛片一区二区| 欧美精品久久久久久久久老牛影院 | 欧美激情黄色片| 亚洲免费在线精品一区| 午夜精品区一区二区三| 激情成人av| 亚洲精品影院| 狠狠色丁香久久婷婷综合_中| 欧美a级在线| 国产精品成人一区二区| 久久亚洲一区二区| 欧美极品aⅴ影院| 欧美一区二区成人6969| 久久一区视频| 亚洲一区二区高清| 久久久久久久久久看片| 日韩视频中午一区| 欧美一区视频在线| 亚洲伦理在线免费看| 亚洲午夜激情| 亚洲国产精品va在看黑人| 99在线精品免费视频九九视| 国语对白精品一区二区| 亚洲人成在线观看一区二区| 国产三级欧美三级| 亚洲精品视频一区二区三区| 国产一区二区精品久久91| 欧美黄色精品| 国产自产女人91一区在线观看| 亚洲片在线资源| 伊人成人在线| 亚洲一级高清| 亚洲七七久久综合桃花剧情介绍| 午夜天堂精品久久久久| 国产精品99久久久久久www| 久久久久一区二区三区| 午夜精品久久久久| 欧美日韩不卡一区| 欧美成人在线影院| 国产视频不卡| 一区二区三区你懂的| 99精品热视频只有精品10| 久久蜜桃香蕉精品一区二区三区| 久久成人国产| 国产美女精品视频免费观看| 中文av一区二区| 欧美三区在线视频| 亚洲一区二区成人| 久久综合狠狠综合久久综青草| 亚洲国产精品一区二区www| 国产亚洲综合在线| 黑人巨大精品欧美一区二区| 国内精品福利| 亚洲久久成人| 亚洲一区二区三区成人在线视频精品| 亚洲美女在线一区| 亚洲一区二区三区精品视频| 欧美一区二区在线免费观看| 久久精彩视频| 亚洲国产欧美一区| 亚洲一区国产视频| 久久狠狠婷婷| 欧美精品一区二区三区很污很色的 | 亚洲欧美日韩国产一区| 亚洲欧美中文日韩在线| 欧美激情免费在线| 国产精品专区h在线观看| 国产日韩欧美视频| 欧美激情中文字幕一区二区| 免费成人av| 亚洲综合精品| 精品99一区二区| 91久久午夜| 国产精品福利在线| 男女视频一区二区| 欧美日韩久久| 久久全国免费视频| 欧美日韩日日骚| 欧美成人免费在线视频| 欧美久久久久久久| 久久视频国产精品免费视频在线| 欧美1区免费| 久久久99精品免费观看不卡| 欧美激情一区二区三区在线| 久久综合亚洲社区| 中文在线资源观看网站视频免费不卡 | 亚洲在线第一页| 久久综合久久久| 久久综合给合久久狠狠色| 欧美三级网页| 亚洲小说区图片区| 亚欧美中日韩视频| 国产精品萝li| 亚洲一级片在线观看| 亚洲一区精品视频| 欧美韩日一区二区| 亚洲欧洲三级| 中文av字幕一区| 国产精品久久久久久久久借妻 | 久久免费观看视频| 六月婷婷一区| 亚洲日韩视频| 国产精品xvideos88| 99国产一区| 亚洲自拍偷拍麻豆| 国产精品永久入口久久久| 一本久道久久综合婷婷鲸鱼| 亚洲一区二区四区| 欧美激情欧美激情在线五月| 欧美高清成人| 一区二区三区国产| 国产精品成人在线| 亚洲淫性视频| 欧美亚洲一区二区三区| 国产小视频国产精品| 久久国产精品色婷婷| 欧美不卡一卡二卡免费版| 亚洲激情二区|