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

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>
            美女视频黄a大片欧美| 国产美女扒开尿口久久久| 免费一级欧美片在线观看| 亚洲欧洲av一区二区| aa成人免费视频| 一区二区三区高清视频在线观看| 亚洲欧洲综合| 一区二区日韩免费看| 一区二区三区久久网| 欧美一区二区三区成人| 久久久噜久噜久久综合| 亚洲第一区色| 91久久精品一区二区三区| 亚洲精品少妇30p| 亚洲一区二区三区午夜| 欧美一区1区三区3区公司| 久久天天躁夜夜躁狠狠躁2022| 免费一区二区三区| 国产精品系列在线播放| 亚洲成人资源| 亚洲欧美日本国产专区一区| 久久久最新网址| 亚洲精品孕妇| 欧美一区二区三区另类| 欧美freesex8一10精品| 国产乱理伦片在线观看夜一区| 影音先锋久久精品| 亚洲欧美国产精品va在线观看| 久久er精品视频| 亚洲国产日韩欧美在线动漫| 日韩天堂在线视频| 久久成人资源| 欧美日韩国产成人| 国产欧美va欧美va香蕉在| 免费久久精品视频| 免费在线一区二区| 国产精品九九久久久久久久| 国产日韩精品一区观看| 欧美午夜免费电影| 狠狠色综合一区二区| 亚洲理论在线| 欧美一区二区性| 亚洲第一二三四五区| 亚洲一级影院| 美女成人午夜| 国产婷婷一区二区| 亚洲一区二区三区欧美| 久久综合给合久久狠狠狠97色69| 艳女tv在线观看国产一区| 欧美日韩成人在线| 1024亚洲| 亚洲国产欧美精品| 亚洲视频欧美在线| 欧美影院一区| 国产精品成av人在线视午夜片| 亚洲美女av黄| 99av国产精品欲麻豆| 欧美不卡视频一区| 91久久中文字幕| 99精品热视频只有精品10| 老司机午夜精品视频在线观看| 在线观看日韩精品| 欧美高清视频在线播放| 欧美激情一区二区三区蜜桃视频 | 亚洲免费视频中文字幕| 国产精品国产自产拍高清av| 亚洲精品一区二区三区福利| 亚洲黑丝在线| 狠狠色狠狠色综合日日tαg| 欧美在线一二三四区| 亚洲专区在线视频| 在线观看91精品国产入口| 亚洲欧美激情一区| 久久亚洲精品网站| 亚洲欧美日韩天堂一区二区| 久久精品视频免费| 欧美一区午夜视频在线观看| 欧美在线关看| 国产日韩欧美在线播放不卡| 亚洲欧洲日产国产综合网| 国产伪娘ts一区| 亚洲天堂激情| 亚洲国产综合91精品麻豆| 亚洲欧洲精品天堂一级| 亚洲国语精品自产拍在线观看| 亚洲在线播放| 久久国产免费看| 国产精品美女久久| 欧美一二三区精品| 久久精品国产精品亚洲| 欧美中文字幕| 午夜宅男欧美| 国产午夜精品美女视频明星a级 | 久久野战av| 在线 亚洲欧美在线综合一区| 久久大综合网| 免费观看日韩av| 亚洲人成在线观看| 欧美啪啪成人vr| 亚洲欧美国产77777| 亚洲一区二区三区四区中文 | 亚洲精品美女在线观看| 国产欧美日韩视频在线观看 | 国产精品porn| 亚洲精品一区二区三区蜜桃久 | 欧美日韩在线三级| 亚洲一区二区成人| 亚洲国产精品va在线观看黑人 | 99在线精品观看| 欧美日本在线播放| 欧美一区二区在线观看| 日韩一级片网址| 国产欧美日韩三区| 久久亚洲综合网| 欧美成人情趣视频| 欧美xxx在线观看| 狼人社综合社区| 久久午夜精品一区二区| 欧美淫片网站| 亚洲无限av看| 亚洲午夜一级| 午夜精品99久久免费| 国产精品久久久对白| 女人香蕉久久**毛片精品| 午夜在线观看欧美| 欧美激情区在线播放| 麻豆精品在线视频| 米奇777超碰欧美日韩亚洲| 蜜桃久久精品乱码一区二区| 久久精品人人爽| 在线天堂一区av电影| 中国成人亚色综合网站| 亚洲一区二区三区激情| 久久久亚洲人| 欧美二区在线观看| 亚洲欧洲另类国产综合| 99re66热这里只有精品3直播 | 亚洲国产高清在线| 亚洲福利一区| 一本色道久久88综合日韩精品| 欧美激情视频一区二区三区在线播放 | 国产在线视频不卡二| 国产精品成人播放| 一区二区动漫| 欧美资源在线| 欧美日韩国产一区二区| 国产精品一区二区三区四区五区| 国产日韩一区二区| 亚洲精品国产精品国自产观看浪潮| 中文亚洲字幕| 麻豆免费精品视频| 亚洲国产毛片完整版| 国产亚洲电影| 亚洲青色在线| 久久久久久免费| 先锋影音久久| 国产一区二区三区久久| 久久久久久有精品国产| 久久精品主播| 亚洲三级电影全部在线观看高清| 欧美激情第9页| 亚洲综合清纯丝袜自拍| 亚洲在线一区二区三区| 国产精品美女主播| 久久综合色影院| 久久综合网hezyo| 亚洲一区二区在| 麻豆精品精品国产自在97香蕉| 欧美黄色小视频| 国产精品久久久久aaaa樱花| 久久精品视频播放| 另类人畜视频在线| 一二三四社区欧美黄| 欧美亚洲免费高清在线观看| 亚洲精品美女在线| 欧美一区二区三区在线| 久久三级福利| 久久伊伊香蕉| 99日韩精品| 另类欧美日韩国产在线| 久久精品主播| 国产精品久久久久永久免费观看| 欧美α欧美αv大片| 国产日本欧美视频| 午夜欧美不卡精品aaaaa| 日韩一级免费观看| 久久这里只有精品视频首页| 久久久久久噜噜噜久久久精品| 欧美日韩免费观看一区三区| 欧美国产亚洲视频| 精品91视频| 免费一级欧美片在线观看| 久久亚洲一区二区三区四区| 国产精品尤物| 欧美在线视频免费播放| 欧美亚洲免费| 国产午夜精品全部视频在线播放| 一区二区高清| 久久夜色精品国产亚洲aⅴ| 国产亚洲欧美日韩日本|