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

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 閱讀(3086) 評論(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>
            可以免费看不卡的av网站| 欧美精品一区在线发布| 久久久久www| 一区二区亚洲精品| 欧美成人亚洲成人日韩成人| 亚洲精品一区二区三区av| 亚洲视屏一区| 国产精品专区第二| 美女精品网站| 在线视频你懂得一区| 久久嫩草精品久久久精品| 亚洲黄色成人网| 国产精品久久久久久久久久免费看 | 欧美插天视频在线播放| 日韩视频在线一区二区| 久久久久国产一区二区三区四区| 亚洲第一福利社区| 国产精品v欧美精品v日韩精品| 欧美在线观看你懂的| 亚洲国产精品电影| 亚洲一区二区av电影| 国语自产精品视频在线看一大j8| 欧美激情综合五月色丁香| 欧美一区二区三区四区高清 | 欲色影视综合吧| 欧美日韩在线播放一区| 久久久久久日产精品| 在线视频中文亚洲| 亚洲第一黄网| 久久久xxx| 亚洲专区一区| 亚洲国产日韩在线| 国产日韩欧美一区二区| 欧美精品激情在线| 久久综合九色综合欧美狠狠| 中文av一区二区| 亚洲国产婷婷香蕉久久久久久| 欧美在线一级va免费观看| 夜夜嗨av一区二区三区四区| 激情综合色丁香一区二区| 国产精品久久久久久久久久三级| 蜜臀91精品一区二区三区| 西西人体一区二区| 亚洲无线视频| 亚洲精品婷婷| 亚洲国产电影| 欧美成人在线影院| 鲁大师成人一区二区三区| 欧美一区二区观看视频| 亚洲女女做受ⅹxx高潮| 一区二区三区四区五区在线| 亚洲人成人99网站| 韩国av一区二区三区在线观看 | 久久久999精品| 香蕉成人啪国产精品视频综合网| 一本久道久久综合婷婷鲸鱼| 亚洲日产国产精品| 亚洲国产一区二区精品专区| 一区二区在线视频| 黄色成人av网站| 国语自产精品视频在线看抢先版结局| 国产精品黄视频| 国产精品国产三级国产aⅴ无密码 国产精品国产三级国产aⅴ入口 | 国产欧美一区二区白浆黑人| 国产精品久久久久久久久免费| 欧美日韩国产综合视频在线观看| 免费在线亚洲欧美| 欧美91大片| 欧美国产视频在线观看| 欧美福利在线观看| 欧美片在线观看| 欧美日韩妖精视频| 欧美午夜片欧美片在线观看| 国产精品成人aaaaa网站| 欧美午夜女人视频在线| 欧美精品观看| 欧美亚一区二区| 国产精品久久久爽爽爽麻豆色哟哟| 欧美性猛交99久久久久99按摩 | 亚洲黄色性网站| 亚洲精品女av网站| 日韩亚洲视频| 亚洲一区二区三区激情| 性欧美超级视频| 久久久久久久一区二区三区| 久热精品视频在线| 亚洲国产高潮在线观看| 日韩视频精品| 亚洲欧美日韩一区二区三区在线观看| 亚洲综合色在线| 久久国产精品久久久久久| 久久亚洲精品一区| 欧美女人交a| 国产精品免费观看在线| 国产字幕视频一区二区| 亚洲国内高清视频| 亚洲天堂激情| 久久人91精品久久久久久不卡| 欧美91大片| 99国产精品久久久久久久| 午夜一区二区三区在线观看| 老司机精品视频网站| 欧美日韩中文字幕| 激情久久久久久久久久久久久久久久| 亚洲黄色在线看| 午夜在线精品偷拍| 欧美激情精品久久久久久久变态| 一区二区三区不卡视频在线观看| 性欧美18~19sex高清播放| 美国十次成人| 国产欧美日韩精品一区| 亚洲精品在线视频观看| 久久精品欧美日韩| 亚洲精品偷拍| 久久精品夜色噜噜亚洲aⅴ| 欧美日韩一区精品| 激情亚洲网站| 亚洲欧美日韩一区二区| 欧美黄色精品| 午夜一区二区三区不卡视频| 欧美乱在线观看| 激情六月综合| 欧美亚洲免费在线| 亚洲欧洲三级电影| 久久久久综合一区二区三区| 国产精品国产三级国产专区53| 亚洲国产精品女人久久久| 性做久久久久久久免费看| 亚洲欧洲精品一区二区| 久久久一区二区| 国产精品视频网址| 一区二区激情视频| 亚洲电影毛片| 久久女同精品一区二区| 国产亚洲激情视频在线| 亚洲欧美日韩爽爽影院| 亚洲人成精品久久久久| 久久婷婷成人综合色| 国产性色一区二区| 性8sex亚洲区入口| 一区二区三区视频观看| 欧美精品1区2区3区| 亚洲国产精品久久久久秋霞影院 | 欧美二区在线看| 久久不射网站| 国产亚洲综合精品| 欧美在线一级va免费观看| 亚洲香蕉成视频在线观看 | 国产日韩欧美精品在线| 亚洲综合国产激情另类一区| 亚洲精品国产欧美| 欧美国产高清| 狠狠做深爱婷婷久久综合一区| 午夜日韩视频| 亚洲午夜一区| 国产精品老牛| 午夜精品影院| 一区二区成人精品| 国产精品wwwwww| 亚洲中无吗在线| 亚洲一区二区三区在线| 欧美日韩天天操| 亚洲欧美日本在线| 亚洲综合激情| 国产在线日韩| 老司机午夜免费精品视频| 久久久久久久999精品视频| 尤物yw午夜国产精品视频明星| 久久国产66| 久久在线免费观看| 亚洲黄色成人| 亚洲日本中文字幕| 欧美亚洲第一区| 久久精品国产一区二区电影| 欧美一区二区视频网站| 尤物99国产成人精品视频| 亚洲电影在线观看| 欧美日韩国产探花| 欧美亚洲一区| 久久精品人人做人人综合| 亚洲二区在线观看| 亚洲精品人人| 国产精品久久久久久久久久免费 | 亚洲砖区区免费| 国产亚洲欧美激情| 欧美国产精品中文字幕| 欧美激情视频网站| 亚洲欧美另类久久久精品2019| 午夜精品一区二区三区电影天堂 | 日韩亚洲国产精品| 国产久一道中文一区| 久久天天躁夜夜躁狠狠躁2022 | 在线电影一区| 亚洲免费成人av| 国产午夜一区二区三区| 亚洲国产精品久久91精品| 国产精品国产三级国产专区53| 久久亚洲私人国产精品va媚药| 欧美大片国产精品| 欧美一级大片在线观看|