国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【Scheme】Scheme 編程學(xué)習(xí) (七) —— Macros 宏

這篇具有很好參考價(jià)值的文章主要介紹了【Scheme】Scheme 編程學(xué)習(xí) (七) —— Macros 宏。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

【Scheme】Scheme 編程學(xué)習(xí) (七) —— Macros 宏


原視頻地址: https://www.bilibili.com/video/BV1Kt411R7Wf?p=7

Macros in scheme
Scheme 語(yǔ)言中的宏,一般我們會(huì)在各種編程語(yǔ)言中見(jiàn)到宏,在 Scheme 中也是同樣的 idea

I - 問(wèn)題 (The problem)

(define num 3)
; 定義符號(hào) num 為 3
(cond
	((zero? num) (display "Z"))
	((positive? num) (display "P"))
	(else (display "N")))

設(shè)置一個(gè)條件判斷,如果 num 為 0 ,則打印 Z (z 代表 zero 零),若為正數(shù)則打印 P (p 代表 positive 正數(shù)) , 其他則打印 N (n 代表 negative 負(fù)數(shù))

II - 隱藏復(fù)雜度 (Hiding complexity)

  • How can we avoid repeating ourselves?
    如何避免重復(fù),編程通用的方式是 DRY (don’t repeat yourself 不要重復(fù)你自己)
  • How can we speak at the right level?
    如何在一個(gè)高的層面 (in a high level) 使用 Scheme

避免重復(fù)的原因是,我們一次表達(dá)出了一個(gè)概念 (express a concept),我們不需要在每次使用的時(shí)候都重新表達(dá)這個(gè)概念 (without re-express it every time),另一種原因是,我們不必要去思考底層實(shí)現(xiàn) (implementation),轉(zhuǎn)而去思考更高層面的問(wèn)題。

僅用代碼實(shí)現(xiàn)一次 (code your concept once),其他時(shí)候只需要引用 (refer to) 它,這里我們希望做的事是避免 (avoid) 重復(fù)代碼中的條件表達(dá)式 (cond expression),do once and leave it alone.

在編程語(yǔ)言中 (In program languages), 有多種方式 (several way) 來(lái)實(shí)現(xiàn)

  • Functions 編寫(xiě)函數(shù)
  • Classes 使用類(lèi)
  • Extending the language 擴(kuò)展語(yǔ)言
    • Code generation 程序生成代碼
      (比如 Qt 擴(kuò)展了 C++,并在編譯時(shí)使用元對(duì)象系統(tǒng)生成 moc 相關(guān)的C++代碼)
    • Macros 宏

III - 初次嘗試 (First attempt)

(define (3-state
		value
		positive-body
		zero-body
		negative-body)
	(cond
		((zero? value)		zero-body)
		((positive? value)	positive-body)
		(else				negative-body)))

我們定義一個(gè)函數(shù) 3-state 需要四個(gè)入?yún)?value, positive-body, zero-body, negative-body
這個(gè)函數(shù)體是一個(gè)條件表達(dá)式 (cond expression)

嘗試調(diào)用

(3-state
	100 (display "P") (display "Z") (display "N"))
; PZN

這種方式定義與調(diào)用會(huì)執(zhí)行所有的 Scheme 語(yǔ)句,所以我們無(wú)法直接定義函數(shù)來(lái)實(shí)現(xiàn)。

IV - 解決方案 (A solution)

因此我們需要定義宏 (macros),定義 syntax ,

(define-syntax
	3-state
	(syntax-rules ()
		((3-state
			value positive-body zero-body negative-body)
		(cond
			((zero? value)		zero-body)
			((positive? value)	positive-body)
			(else				negative-body)))))

第二個(gè)參數(shù)為 syntax-rules ,這里是需要做的匹配和需要擴(kuò)展的模板 (the matching you should do, the template you should expand), 使用模式匹配 (pattern),并使用內(nèi)容替換 (substitute in code)

> (3-state
	100 (display "P") (display "Z") (display "N"))
; P

調(diào)用

> (3-state
	0 (display "P") (display "Z") (display "N"))
; Z
> (3-state
	-100 (display "P") (display "Z") (display "N"))
; N

V - 其他的實(shí)現(xiàn)方式 (How else could we do this?)

在其他語(yǔ)言中如何實(shí)現(xiàn)

5.1 - 宏 (Macros)

在 C 中使用 Macros 舉例如下

/* MACROS */

#define THREESTATE(VALUE,PBODY,ZBODY,NBODY) \
	{\
		int v = (VALUE); \
		if (v == 0) 	{ (ZBODY); }\
		else if (v > 0) { (PBODY); }\
		else 			{ (NBODY); }\
	}

int main()
{
	THREESTATE(3, print("P\n"), print("Z\n"), print("N\n"));
	return 0;
}

macros 為 literal expression 無(wú)法調(diào)試 (debug),
如何在 scheme 中使用 substitute

5.2 - 引用 (Quoting)

這是一部分 JavaScript 代碼,函數(shù)體使用字符串來(lái)定義 (body express in strings),通過(guò) eval 函數(shù)來(lái)調(diào)用。

function threeState( value, pbody, zbody, nbody )
{
	if (value === 0) 	{ eval( zbody ); }
	else if (value > 0) { eval( pbody ); }
	else 				{ eval( nbody ); }
}

threeState(
	3, "print('P')", "print('Z')", "print('N')" );

5.3 - 函數(shù)指針 (Function pointers)

def three_state(
		value, p_body_fn, z_body_fn, n_body_fn):
	if value == 0:  z_body_fn()
	elif value > 0: p_body_fn()
	else:			n_body_fn()

def pr( x ):
	def ret():
		print x
	return ret

three_state(3, pr("P"), pr("Z"), pr("N"))

5.4 - 類(lèi) (class)

class TestJava {
	
	interface IThreeStateBodies {
		void positiveBody();
		void zeroBody();
		void negativeBody();
	}

	static void threeState(
			int value, IThreeStateBodies bodies ) {
		if ( value == 0 ) 		bodies.zeroBody();
		else if ( value > 0 )	bodies.positiveBody();
		else					bodies.negativeBody();
	}
	
	public static void main( String[] args ) {
		threeState( 3,
			new IThreeStateBodies() {
				public void positiveBody() {
					System.out.println( "P" );
				}
				public void zeroBody() {
					System.out.println( "Z" );
				}
				public void negativeBody() {
					System.out.println( "N" );
				}
			}
		);
	}

Java 通過(guò)定義 Interface文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-736473.html

到了這里,關(guān)于【Scheme】Scheme 編程學(xué)習(xí) (七) —— Macros 宏的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • http中的scheme和小程序中的scheme

    http中的scheme和小程序中的scheme

    scheme就是url中標(biāo)識(shí)協(xié)議的部分,可能是http也可能是ftp等。 / 標(biāo)識(shí)path的開(kāi)始。 ;標(biāo)識(shí)參數(shù)的開(kāi)始,例如: ftp://prep.ai.mit.edu/pub/gnu; type=d ?標(biāo)識(shí)查詢的開(kāi)始,例如: http://www.joes-hardware.com/inventory-check.cgi?item=12731color=blue 問(wèn)題: ;和 ? 都能夠傳遞鍵值對(duì),有什么區(qū)別? 分號(hào)標(biāo)識(shí)

    2023年04月13日
    瀏覽(16)
  • geopandas 筆記:plot 的scheme

    geopandas 筆記:plot 的scheme

    transbigdata 筆記:官方文檔案例1(出租車(chē)GPS數(shù)據(jù)處理)-CSDN博客? 3.3.1 節(jié)的內(nèi)容的拓展,這里主要是比較各個(gè)scheme的效果 主代碼為:修改的就是第二行scheme的內(nèi)容 ? scheme 參數(shù)在地理數(shù)據(jù)可視化中用來(lái)指定數(shù)據(jù)分類(lèi)方案。這在繪制地圖時(shí)特別有用,因?yàn)樗梢詭椭玫卣故緮?shù)

    2024年01月18日
    瀏覽(151)
  • iOS 常用應(yīng)用的url scheme

    應(yīng)用 連接地址 id url scheme 微信 ?App?Store 上的“微信” 414478124 weixin:// 淘寶 https://itunes.apple.com/cn/app/id387682726?mt=8 387682726 taobao:// QQ https://itunes.apple.com/cn/app/id444934666?mt=8 444934666 mqq:// 百度 https://itunes.apple.com/cn/app/id382201985?mt=8 382201985 BaiduSSO:// 墨跡天氣 https://itunes.apple.com/cn/ap

    2024年02月04日
    瀏覽(12)
  • 門(mén)限簽名(Threshold Signatures Scheme, TSS)

    閾值簽名方案 (TSS) 是一種用于分布式密鑰生成和簽名的加密原語(yǔ)。在區(qū)塊鏈客戶端中使用 TSS 是一種新范例,可以提供許多好處,尤其是在安全性方面。從廣義上講,TSS 可以影響密鑰管理系統(tǒng)(例如 crypto wallets )的設(shè)計(jì),并引領(lǐng) DeFi 用例的原生支持。話雖如此,TSS仍然是一

    2024年02月03日
    瀏覽(20)
  • Android 通過(guò)scheme跳轉(zhuǎn)支付寶實(shí)現(xiàn)支付

    Android 通過(guò)scheme跳轉(zhuǎn)支付寶實(shí)現(xiàn)支付

    原文地址: Android 通過(guò)scheme跳轉(zhuǎn)支付寶實(shí)現(xiàn)支付 - Stars-One的雜貨小窩 需求的來(lái)源是支付功能,由于支付寶不允許個(gè)人開(kāi)通具有webhook的支付服務(wù),所以是對(duì)接了一個(gè)支付系統(tǒng)(應(yīng)該算作四方支付)。創(chuàng)建訂單后,系統(tǒng)會(huì)返回一個(gè)h5鏈接。 對(duì)于PC版的軟件,將此鏈接轉(zhuǎn)為二維碼,然后提示

    2023年04月25日
    瀏覽(26)
  • PyCharm 主題和字體 (Scheme & Editor Font)

    PyCharm 主題和字體 (Scheme & Editor Font)

    Scheme Editor Font File - Settings - Editor - Colors Fonts - Font Show only monospaced fonts: 只顯示等寬字體。編程時(shí)使用等寬字體效果較好。 [1] Yongqiang Cheng, https://yongqiang.blog.csdn.net/

    2024年02月19日
    瀏覽(18)
  • Java實(shí)現(xiàn)獲取微信小程序scheme碼報(bào)錯(cuò)

    Java實(shí)現(xiàn)獲取微信小程序scheme碼報(bào)錯(cuò)

    如標(biāo)題所見(jiàn),使用Java獲取小程序scheme時(shí)除了出現(xiàn)文檔中的常見(jiàn)錯(cuò)誤,我將我調(diào)試的時(shí)候遇到的錯(cuò)誤和解決方式分享出來(lái)方便大家少花一部分時(shí)間解決該問(wèn)題。(往下劃有結(jié)論節(jié)省時(shí)間)。 獲取scheme碼之前需要先獲取access_token,這個(gè)是作為訪問(wèn)小程序API的一個(gè)憑證。其次,對(duì)

    2024年02月10日
    瀏覽(21)
  • h5頁(yè)面跳轉(zhuǎn)小程序-----明文URL Scheme

    h5頁(yè)面跳轉(zhuǎn)小程序-----明文URL Scheme

    ? ? ?1.1? 登錄微信公眾平臺(tái) ? ? ?1.2? 設(shè)置 - 基本設(shè)置 - 隱私與安全 -?明文scheme拉起此小程序 - 配置 ? ? ? ? ?1.3? 進(jìn)入配置后,在里面配置允許通過(guò)scheme URL進(jìn)入的小程序路徑 ps:多個(gè)路徑用分號(hào)隔開(kāi),且路徑必須在小程序正式版存在 否則會(huì)報(bào): 小程序path格式不對(duì),請(qǐng)?zhí)?/p>

    2024年03月26日
    瀏覽(23)
  • Nginx+Springboot配置https后的scheme和port問(wèn)題

    Nginx+Springboot配置https后的scheme和port問(wèn)題

    反向代理:Nginx (nginx version: nginx/1.14.2) 網(wǎng)關(guān):Zuul (2.2.9.RELEASE) 服務(wù):SpringBoot使用內(nèi)置Tomcat (9.0.71) Nginx:設(shè)置請(qǐng)求頭,向后面的代理或服務(wù)傳遞真實(shí)的協(xié)議、域名(ip)、端口 Zuul SpringBoot 3.1.request.getScheme()獲取的是http 1.確認(rèn)Nginx配置:proxy_set_header X-Forwarded-Proto $scheme;

    2024年01月19日
    瀏覽(16)
  • iOS 中支持點(diǎn)擊網(wǎng)頁(yè)scheme超鏈接打開(kāi)其他app

    iOS 中支持點(diǎn)擊網(wǎng)頁(yè)scheme超鏈接打開(kāi)其他app

    網(wǎng)頁(yè)內(nèi)容如圖所示 思路,點(diǎn)擊網(wǎng)頁(yè)中一個(gè)href 超鏈接的時(shí)候,會(huì)執(zhí)行 decidePolicyForNavigationAction 方法,我們?cè)诟姆椒ㄖ薪孬@URL, 判斷如果是URL scheme類(lèi)型的,則執(zhí)行 [[UIApplication sharedApplication]openURL:URL options:@{} completionHandler:nil] 方法,打開(kāi)URL,并取消這次加載 實(shí)現(xiàn)方法 app配置

    2024年02月16日
    瀏覽(25)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包