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

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>
            久久久久国产精品一区| 欧美**字幕| 在线观看国产欧美| 亚洲综合日韩在线| 欧美一区二区三区在线看| 狠狠色狠狠色综合日日tαg| 久久精品视频免费观看| 欧美日韩精品是欧美日韩精品| 日韩视频免费大全中文字幕| 亚洲在线免费视频| 亚洲一区免费网站| 亚洲高清资源| 91久久久久久久久久久久久| 亚洲国产一区二区三区在线播 | 久久久国产一区二区三区| 国产精品一区毛片| 国产精品一区2区| 国产精品免费看| 国产精品亚洲成人| 欧美日韩精品一区二区在线播放 | 亚洲素人在线| 亚洲激情在线播放| 亚洲视屏一区| 亚洲无吗在线| 久久久综合香蕉尹人综合网| 亚洲国产日韩一区| 亚洲国产老妈| 欧美在线999| 欧美精品二区三区四区免费看视频| 欧美日韩一区在线播放| 影音先锋中文字幕一区| 欧美一区二区三区在线免费观看| 欧美偷拍一区二区| 欧美激情影音先锋| 亚洲国内自拍| 欧美日本在线| 久久久福利视频| 一道本一区二区| 亚洲精品一区中文| 久久久久久穴| 久久国产一二区| 一区二区三区四区国产精品| 最新成人在线| 亚洲精品视频在线播放| 99这里只有精品| 一区二区三区四区五区在线| 亚洲黄色天堂| 亚洲精品国精品久久99热| 亚洲成色777777在线观看影院| 在线精品国产成人综合| 在线观看三级视频欧美| 国产精品一区二区三区四区五区| 国产精品一区二区三区观看| 国产美女精品人人做人人爽| 好吊视频一区二区三区四区| 亚洲精品国产精品乱码不99按摩| 99re这里只有精品6| 日韩一区二区福利| 久久av一区二区三区漫画| 乱码第一页成人| 91久久国产综合久久| 亚洲级视频在线观看免费1级| 妖精视频成人观看www| 99re6热只有精品免费观看| 亚洲欧美日韩精品| 久久亚洲午夜电影| 国产欧美一区二区三区国产幕精品| 国产视频一区在线| 亚洲图片在线| 男人的天堂亚洲在线| 亚洲免费中文| 欧美日韩一二区| 亚洲精品护士| 在线亚洲精品| 欧美高清自拍一区| 国产精品夜夜嗨| 中日韩在线视频| 欧美成人一区二区三区| 久久激情视频免费观看| 欧美性大战久久久久| 亚洲免费大片| 欧美国产极速在线| 久久综合亚州| 亚洲看片免费| 亚洲精品精选| 欧美成人一品| 91久久久国产精品| 亚洲高清视频一区| 欧美日韩a区| 亚洲新中文字幕| 亚洲神马久久| 国产精品久久二区二区| 亚洲一区二区三区精品在线观看| 一区二区三区视频在线看| 国产精品v日韩精品| 亚洲私人影吧| 久久aⅴ国产欧美74aaa| 国产亚洲在线| 欧美大胆人体视频| 欧美高清免费| 国产精品99久久久久久久久久久久| 亚洲人成网站影音先锋播放| 欧美日韩另类综合| 久久久久久久久久久成人| 毛片精品免费在线观看| 亚洲制服av| 欧美在线日韩| 99国产精品久久久久久久成人热| 亚洲一区二区影院| 亚洲国产精品一区二区久 | 亚洲视频碰碰| 99精品福利视频| 国产一区二区三区最好精华液| 牛夜精品久久久久久久99黑人| 欧美激情影音先锋| 久久超碰97中文字幕| 欧美影院视频| 亚洲视频1区2区| 亚洲福利在线看| 欧美高清不卡在线| 国产精品嫩草久久久久| 亚洲第一在线| 国产欧美日韩精品专区| 亚洲经典在线看| 韩国精品主播一区二区在线观看| 老司机午夜精品视频| 国产精品自拍小视频| 在线亚洲精品| 亚洲欧美一区二区原创| 欧美日韩成人网| 亚洲国产一区视频| 亚洲二区在线| 久久黄色网页| 久久精品视频在线看| 国内精品久久久久久久影视蜜臀 | 欧美日韩一区二区三区免费| 久久精品99国产精品| 国产视频在线观看一区| 一本久久a久久精品亚洲| 亚洲精品偷拍| 欧美激情国产精品| 欧美成人亚洲成人| 亚洲日本理论电影| 欧美精品久久久久久久久久| 这里只有视频精品| 欧美一区影院| 亚洲国产精品久久久久婷婷老年| 久久久精品日韩| 久久天堂国产精品| 激情欧美一区二区三区在线观看 | 一区二区日韩精品| 欧美在线观看视频一区二区三区| 国内精品一区二区三区| 欧美夫妇交换俱乐部在线观看| 日韩视频在线观看一区二区| 亚洲在线视频网站| 国内精品视频666| 欧美成人免费在线视频| 在线亚洲伦理| 欧美成人第一页| 亚洲免费一区二区| 极品av少妇一区二区| 在线中文字幕一区| 欧美成人午夜剧场免费观看| 亚洲精品一二| 欧美成人69| 欧美一区日本一区韩国一区| 亚洲国产精品一区制服丝袜| 国产精品成人国产乱一区| 欧美亚洲视频一区二区| 日韩亚洲欧美成人| 欧美国产亚洲视频| 老司机67194精品线观看| 欧美亚洲专区| 9l国产精品久久久久麻豆| 国产视频一区在线观看| 欧美日韩ab| 欧美日韩国产一区二区三区| 久久阴道视频| 久久久久.com| 久久全国免费视频| 欧美中文字幕久久| 亚洲一二三区视频在线观看| 亚洲精品综合久久中文字幕| 91久久精品日日躁夜夜躁国产| 麻豆九一精品爱看视频在线观看免费| 亚洲欧美日韩一区二区三区在线| 亚洲肉体裸体xxxx137| 影音先锋日韩精品| 在线精品国精品国产尤物884a| 国产精品日本精品| 国产精品性做久久久久久| 国产精品看片资源| 国产一区二区三区在线观看免费 | 欧美在线视频不卡| 亚洲专区一区二区三区| 久久亚裔精品欧美| 亚洲欧洲日产国产网站| 亚洲午夜免费视频| 久久久精品久久久久|