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

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>
            欧美理论电影在线播放| 亚洲一区二区免费| 欧美一级视频| 好吊妞**欧美| 性欧美videos另类喷潮| 亚洲精品一区二区三区在线观看| 国产日产欧产精品推荐色| 欧美一区在线看| 中日韩高清电影网| 亚洲精品一区二区三区99| 亚洲成色www8888| 久久久久久久国产| 久久午夜视频| 乱中年女人伦av一区二区| 久久久久国产一区二区| 亚洲激情在线观看| 亚洲电影下载| 亚洲精品少妇网址| 在线一区观看| 亚洲欧美日韩视频二区| 性欧美1819sex性高清| 久久久久综合网| 免费日韩视频| 亚洲国产精品综合| 一本色道久久88综合日韩精品| 亚洲最新在线| 欧美一区二区三区在线观看视频| 久久精品国产999大香线蕉| 久久久久9999亚洲精品| 欧美国产成人精品| 国产精品久久97| 国产一区观看| 日韩视频一区二区三区在线播放| 亚洲专区在线视频| 午夜精品福利一区二区三区av| 久久青青草原一区二区| 亚洲狠狠丁香婷婷综合久久久| 亚洲性感美女99在线| 亚洲男人第一网站| 久久一区亚洲| 国产精品任我爽爆在线播放| 在线 亚洲欧美在线综合一区| 亚洲精品乱码久久久久| 香港成人在线视频| 欧美激情一区二区三级高清视频| 99精品热视频只有精品10| 欧美激情久久久| 亚洲天堂av在线免费观看| 久久久久久一区二区三区| 欧美人成在线视频| 伊人久久成人| 午夜精品美女自拍福到在线 | 亚洲视频播放| 久久婷婷人人澡人人喊人人爽| 欧美日韩视频在线观看一区二区三区| 国产一区二区三区久久精品| 久久久综合激的五月天| 欧美激情视频一区二区三区不卡| 欧美成人一区二区三区| 国产日韩欧美一区二区三区在线观看 | 欧美国产在线观看| 欧美一区二区三区电影在线观看| 国产精品激情av在线播放| 亚洲线精品一区二区三区八戒| 亚洲国产高清视频| 欧美电影免费观看| 亚洲乱亚洲高清| 日韩视频不卡中文| 欧美小视频在线| 亚洲一区尤物| 亚洲欧美一区二区激情| 国产日韩精品一区二区浪潮av| 午夜精品视频在线观看一区二区 | 另类天堂视频在线观看| 亚洲激情黄色| 日韩午夜激情| 国产精品久久久久久亚洲毛片| 午夜宅男久久久| 欧美亚洲免费| 亚洲国产欧美一区二区三区久久 | 一区二区亚洲欧洲国产日韩| 免费短视频成人日韩| 免费成人高清| 一本色道久久综合| 中文国产成人精品久久一| 国产日本欧美一区二区三区| 乱中年女人伦av一区二区| 欧美国产精品v| 午夜国产精品影院在线观看| 久久精品国产亚洲高清剧情介绍| 亚洲国产精品999| 亚洲美女淫视频| 国产婷婷精品| 亚洲高清资源| 国产精品日韩欧美综合| 免费成人av在线| 欧美日韩高清在线观看| 久久激情综合| 欧美另类极品videosbest最新版本 | 国产精品狼人久久影院观看方式| 久久国产精品第一页| 免费欧美日韩| 欧美一区二区三区在线看| 女人香蕉久久**毛片精品| 欧美一区二区三区精品| 欧美黑人多人双交| 久久久免费观看视频| 国产精品一级二级三级| 欧美一区二区精品久久911| 99精品视频免费| 国内精品视频在线观看| 亚洲国产综合91精品麻豆| 国产精品一区二区三区久久| 亚洲破处大片| 在线免费观看一区二区三区| 亚洲欧美区自拍先锋| 中文在线不卡视频| 久久综合一区| 久久久久久久久综合| 国产精品vvv| 91久久在线| 亚洲欧洲在线观看| 久久中文欧美| 久久夜色精品亚洲噜噜国产mv| 国产精品久久久久久久久久久久久久 | 麻豆精品网站| 久久都是精品| 国产精品视频精品| 99在线|亚洲一区二区| 亚洲国产成人久久| 欧美在线观看网站| 欧美一级午夜免费电影| 欧美午夜不卡视频| 亚洲精品在线三区| 亚洲乱码国产乱码精品精98午夜 | 国产精品美女久久久浪潮软件| 亚洲黑丝在线| 亚洲精品国久久99热| 美女主播一区| 欧美激情视频在线播放| 一区在线播放| 美国成人直播| 欧美激情精品久久久| 亚洲高清不卡av| 久久婷婷亚洲| 亚洲第一网站| 日韩天堂av| 欧美午夜不卡在线观看免费| 亚洲一区二区三| 久久久成人网| 亚洲电影在线看| 欧美激情精品久久久久久变态| 亚洲激情在线观看| 亚洲午夜成aⅴ人片| 国产美女精品| 久久香蕉国产线看观看av| 亚洲第一天堂无码专区| 在线视频你懂得一区二区三区| 欧美日韩国产色视频| 亚洲一区免费| 免费日韩av片| 一区二区三区国产在线| 国产噜噜噜噜噜久久久久久久久 | 日韩天堂在线视频| 午夜精品一区二区三区在线视| 国产麻豆精品在线观看| 久久久99国产精品免费| 亚洲国产欧美国产综合一区| 欧美色视频在线| 久久精品九九| 亚洲欧洲一区二区三区在线观看| 欧美日韩国产首页在线观看| 亚洲欧美电影院| 欧美 日韩 国产 一区| 一本综合精品| 极品少妇一区二区| 欧美日韩日日夜夜| 久久国产精品一区二区三区四区| 最新日韩在线| 久久亚洲美女| 亚洲一二三四区| 亚洲激情不卡| 国产三区精品| 欧美午夜精品电影| 老牛国产精品一区的观看方式| 一本久久青青| 欧美激情一区二区三区在线视频观看| 亚洲欧美日韩精品| 99在线观看免费视频精品观看| 精品99一区二区| 猛男gaygay欧美视频| 亚洲天堂网在线观看| 亚洲欧洲在线一区| 麻豆国产精品一区二区三区| 欧美一区二区三区另类| 一区二区三区四区五区视频| 亚洲成人在线免费| 娇妻被交换粗又大又硬视频欧美| 国产精品久久久久aaaa| 欧美日韩理论|