Top > ScriptFuClass > Step4 å››é™ç›® よã使ã‚れる構文
最åˆã« Scheme ã®æœ€ã‚‚基本的ãªã¨ã“ã‚ã ã‘を説明ã—ã¾ã—ãŸã€‚ã—ã‹ã—変数やリスト以外ã«ã‚‚é‡è¦ãªæ§‹æ–‡ã¯æ²¢å±±ã‚りã¾ã™ã€‚å…¨ã¦ã‚’ã‚«ãƒãƒ¼ã™ã‚‹ã“ã¨ã¯ã§ããªã„ã®ã§ã€Script-Fu を書ã上ã§ãã®æ¬¡ã«é‡è¦ã§ã‚ã‚ã†ã¨æ€ã‚れるもã®ã®èª¬æ˜Žã‚’ã—ã¾ã™ã€‚ 4.1 比較
ã“ã®å¾Œã§å‡ºã¦ãã‚‹ç¹°ã‚Šè¿”ã—æ–‡ã‚„æ¡ä»¶åˆ†å²ã§ã¯ã€ç‰¹å®šã®æ¡ä»¶ã‚’満ãŸã—ã¦ã„ã‚‹ã‹ã©ã†ã‹ã‚’判定ã™ã‚‹å¿…è¦ãŒå‡ºã¦ãã¾ã™ã€‚ã“ã®åˆ¤å®šã¯ä¸¡è€…を比較ã—ã¦æˆç«‹æ¡ä»¶ã‚’満ãŸã—ã¦ã„ã‚‹ã‹ã©ã†ã‹ã‚’判別ã™ã‚‹ã“ã¨ã§è¡Œã„ã¾ã™ã€‚例ãˆã°äºŒã¤ã®æ•°å€¤ã‚’比較ã—ã¦ã¿ã¾ã™ã€‚ 4.1.1 比較å¼
æ•°å€¤ã®æ¯”較ã§ã¯ <ã€>ã€= ã®ç‰å·/ä¸ç‰å·è¨˜å·ã‚’使ã„ã¾ã™ã€‚ã“ã®å ´åˆã‚‚記å·ã‚’å‰ã«ç½®ã„ã¦ã€æ¯”較ã™ã‚‹ã‚‚ã®ã‚’ãã®å¾Œã«ç½®ãã¾ã™ã€‚2 㨠3 を比較ã—ã¦ã¿ã¾ã—ょã†ã€‚Script-Fu コンソール㫠(< 2 3) 㨠(> 2 3) を入力ã—ã¦ä¸‹ã•ã„。 > (< 2 3) #t > (> 2 3) #f ãれãžã‚Œ #t 㨠#f ãŒè¿”ã£ã¦ãã¾ã—ãŸã。ã“れã¯è©•価å¼ãŒçœŸ (TRUE) ã§ã‚ã‚‹ãªã‚‰ã° #t ãŒè¿”ã£ã¦ãã¦ã€è©•価å¼ãŒå½ (FALSE) ã§ã‚ã‚‹ãªã‚‰ #f ãŒè¿”ã£ã¦ãã¦ã„ã‚‹ã®ã§ã™ã€‚#t 㨠#f ã¯çœŸå½å€¤ã‚’ç¾ã—ã¾ã™ã€‚ 上ã«å¼ã§ã® (< 2 3) 㯠2 よりも 3 ãŒå¤§ãã„ã®ã§ã“ã®å¼ã¯æˆã‚Šç«‹ã¡ã€#t ã¨è¿”ã•れã¾ã™ã€‚一方 (> 2 3) ã§ã¯ 2 ㌠3 よりも大ãã„ã¨ã„ã†ã®ã¯é–“é•ã£ã¦ã„ã‚‹ã®ã§ #f ã¨è¿”ã£ã¦ãã¾ã™ã€‚ 2 以上ã®å¤§ãã•ã§ã‚ã‚‹ã‹ã©ã†ã‹ã‚’判定ã™ã‚‹æ–¹æ³•ã¯ã€<= を使ã„ã¾ã™ã€‚下ã®ä¾‹ã§ã¯ #t ã¨è¿”ã£ã¦ãã¾ã™ãŒã€ç‰å· = ã‚’ç„¡ãã™ã¨ #f ã¨è¿”ã£ã¦ãã¾ã™ã€‚2 ãŒå«ã¾ã‚Œã‚‹ã‹å«ã¾ã‚Œãªã„ã‹ã®é•ã„ã§ã™ã€‚ > (<= 2 2) #f > (< 2 2) #f 4.1.2 ç‰ä¾¡ã®åˆ¤å®š
ã§ã¯ã€æ•°å—ã®æ¯”較ã§ã¯ãªãæ–‡å—åˆ—ã®æ¯”較ã®å ´åˆã§ã¯ã©ã†ã§ã—ょã†ã‹ï¼Ÿ 通常文å—åˆ—ã®æ¯”較ã§ã¯ä¸¡è€…ã®å¤§å°é–¢ä¿‚ã¨ã„ã†ã‚ˆã‚Šã‚‚ã€ä¸¡è€…ãŒåŒä¸€ã®ã‚‚ã®ã§ã‚ã‚‹ã‹ã©ã†ã‹ã‚’判定ã™ã‚‹ãŸã‚ã«ä½¿ã„ã¾ã™ã€‚åŒä¸€ã§ã‚ã‚‹ã‹ã©ã†ã‹ã¯ã€equal? を使ã„ã¾ã™ã€‚例ãˆã°ã€ã“ã®ã‚ˆã†ã«ã—ã¦ã¿ã¾ã™ã€‚ > (let* ((name1 "wilber") (name2 "wilma")) (equal? name1 "wilber")) #t > (let* ((name1 "wilber") (name2 "wilma")) (equal? name2 "wilber")) #f ã“ã“ã§ã¯ name1 㨠name2 ã«ãれãžã‚Œæ–‡å—列 wilber 㨠wilma を入れã¦ã€name1 㨠name2 ãŒæ–‡å—列 wilber ã¨ç‰ã—ã„ã‹ã©ã†ã‹ã‚’判定ã—ã¦ã„ã¾ã™ã€‚name1 ã«ã¯ wilber ãŒå…¥ã£ã¦ã„ã‚‹ã®ã§ #t ãŒè¿”ã£ã¦ãã¦ã€name2 ã«ã¯ wilma ãŒå…¥ã£ã¦ã„ã‚‹ãŸã‚é–“é•ã„ãªã®ã§ #f ãŒè¿”ã£ã¦ãã¾ã™ã€‚ 比較ã«ã¯ equal? ã®ä»–ã«ã‚‚ eq? ã‚„ eqv? ãŒã‚りã¾ã™ã€‚何ã®ä¸€è‡´ã‚’確ã‹ã‚ãŸã„ã®ã‹ã«ã‚ˆã£ã¦ä½¿ã„分ã‘ã‚‹ã¨è‰¯ã„ã§ã—ょã†ã€‚ã¡ãªã¿ã«ã€Gimp ã«ãŠã„㦠eqv? 㯠= ã¨ç‰ä¾¡ã«æ‰±ã‚れã¾ã™ã€‚ 上ã®åˆ¤å®šæ–‡ã‚’段è½ã‚’ã¤ã‘ã¦è¨˜è¿°ã™ã‚‹ã¨æ¬¡ã®ã‚ˆã†ã«ãªã‚Šã¾ã™ã€‚ (let* ((name1 "wilber") (name2 "wilma")) (equal? name1 "wilber")) 4.2 ç¹°ã‚Šè¿”ã—æ§‹æ–‡
4.2.1 while
Script-Fu ã§ç”¨ã„られã¦ã„ã‚‹ç¹°ã‚Šè¿”ã—æ–‡ã¯ã€while ã ã‘ã§ã™ã€‚å°†æ¥ã® Gimp ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã§ Guile を実装ã™ã‚‹ã“ã¨ã«ãªã‚Œã°ä»–ã®ç¹°ã‚Šè¿”ã—æ–‡ã‚’使ãˆã‚‹ã‚ˆã†ã«ãªã‚Šã¾ã™ãŒã€ã„ã¾ã®ã¨ã“ã‚㯠while ã—ã‹ã‚りã¾ã›ã‚“。while æ§‹æ–‡ã¯ã“ã®ã‚ˆã†ã«æ›¸ãã¾ã™ã€‚
æˆç«‹æ¡ä»¶ãŒæˆã‚Šç«‹ã£ã¦ã„ã‚‹é–“ã¯ã€ãれ以é™ã«æ›¸ã‹ã‚Œã¦ã„る評価å¼ã‚’é †ç•ªã«è©•価ã—ã¦ã„ãã¾ã™ã€‚while æ§‹æ–‡ã®è¿”り値ã¯ã€æœ€å¾Œã®è©•価å¼ã‚’評価ã—ãŸçµæžœã§ã™ã€‚例ãˆã° 1 ã‹ã‚‰ 10 ã¾ã§ã®æ•°å—ã‚’è¶³ã—ã¦ã¿ã¾ã™ã€‚ > (let* ((i 1) (j 0)) (while (<= i 10) (set! j (+ j i)) (set! i (+ i 1))) i) 11 > (let* ((i 1) (j 0)) (while (<= i 10) (set! j (+ j i)) (set! i (+ i 1))) j) 55 > (+ 1 2 3 4 5 6 7 8 9 10) 55 ã“ã“ã§ã¯æœ€åˆã« i 㨠j ã« 0 を入れã¦ã‚りã¾ã™ã€‚ãã—㦠while ã®æ¡ä»¶åˆ¤å®š (<= i 10) ã§ã¯ i ㌠10 以内ã§ã‚れã°ç¹°ã‚Šè¿”ã—ã€11 以上ã§ã‚れã°çµ‚了ã™ã‚‹ã‚ˆã†ã«ã—ã¦ã„ã¾ã™ã€‚ 繰り返ã•れã¦ã„ã‚‹å¼ã¯äºŒã¤ã‚りã¾ã™ã€‚最åˆã® (set! j (+ j i )) ã§ã¯ã€j ã« j 㨠i ã‚’åŠ ç®—ã—ãŸã‚‚ã®ã‚’入れã¦ã„ã¾ã™ã€‚次㮠(set! i (+ i 1)) ã§ã¯ i ã‚’ 1 ãšã¤å¢—ã‚„ã—ã¦ã„ã¾ã™ã€‚i ㌠11 ã«ãªã£ãŸã¨ã“ã‚ã§å…ˆç¨‹ã®æ¡ä»¶å¼ã¯æˆã‚Šç«‹ãŸãªããªã‚‹ã®ã§ while ã®ç¹°ã‚Šè¿”ã—ã¯çµ‚了ã—ã¾ã™ã€‚ i 㯠11 ã«ãªã£ãŸã¨ã“ã‚ã§çµ‚了ã—ãŸã®ã§ 11 ã§ã™ã€‚j ã«ã¯ i ã‚’åŠ ç®—ã—ã¦ã„ã£ãŸå€¤ãŒå…¥ã£ã¦ãŠã‚Šã€55 ã¨ãªã£ã¦ã„ã¾ã™ã€‚ã“ã®åŠ ç®—ã®çµæžœãŒæœ¬å½“ã«æ£ã—ã„ã®ã‹ã©ã†ã‹ã‚’確ã‹ã‚ã‚‹ãŸã‚ã€ãã®æ¬¡ã« (+ 1 2 3 4 5 6 7 8 9 10) ã¨ã—ã¦ç›´æŽ¥ 1 ã‹ã‚‰ 10 ã¾ã§ã®æ•°å—を並ã¹ã¦è¶³ã—ç®—ã‚’ã—ã¦åˆè¨ˆã‚’出ã—ã¾ã—ãŸã€‚両方ã®çµæžœãŒä¸€è‡´ã—ã¦ã„ã¾ã™ã。 Script-Fu コンソールã§ã¯ã©ã‚“ãªã«é•·ã„å¼ã§ã‚‚コマンドラインã®ä¸€è¡Œã«åŽã‚ãªã‘れã°ãªã‚‰ãªã„ã®ã§ã€å¼ãŒã©ã®ã‚ˆã†ãªæ§‹é€ ã«ãªã£ã¦ã„ã‚‹ã®ã‹æŠŠæ¡ãŒé›£ã—ã„ã¨æ€ã„ã¾ã™ã€‚コンソールã«å…¥åŠ›ã§ã¯ãªãã€å®Ÿéš›ã«ã‚¹ã‚¯ãƒªãƒ—ãƒˆã«æ›¸ã時ã¯è¤‡æ•°è¡Œã«åˆ†ã‘ã¦ã‚¤ãƒ³ãƒ‡ãƒ³ãƒˆã‚’ã¤ã‘ãªãŒã‚‰æ›¸ãã¨è¦‹ã‚„ã™ããªã‚‹ã§ã—ょã†ã€‚今ã®åŠ ç®—ã®å ´åˆã§ã¯ã€ã“ã®ã‚ˆã†ã«ãªã‚Šã¾ã™ã€‚ (let* ((i 1) (j 0)) (while (<= i 10) (set! j (+ j i)) (set! i (+ i 1))) i) ã“ã®ã‚ˆã†ã« "ã‚る一定回数ã ã‘処ç†ã‚’繰り返ã™" ã¨ã„ã†ã®ã¯ã€while æ–‡ã®å‰ã«ã‚«ã‚¦ãƒ³ãƒˆç”¨ã®å¤‰æ•°ã« 0 (ã¾ãŸã¯ 1 ãªã©) を入れã¦ãŠã„ã¦ã€while æ–‡ã®ä¸ã®æœ€å¾Œã§ã‚«ã‚¦ãƒ³ãƒˆç”¨ã®å¤‰æ•°ã®å€¤ã‚’ 1 ãšã¤åŠ ç®—ã—ã¦ãƒ«ãƒ¼ãƒ—ã•ã›ã‚‹ã¨ã„ã†æ‰‹ãŒã‚ˆã使ã‚れã¾ã™ã€‚ 4.3 æ¡ä»¶åˆ†å²
4.3.1 if
æ¡ä»¶åˆ†å²ã«ã¯ã„ãã¤ã‹ã®æ–¹æ³•ãŒã‚りã¾ã™ãŒã€ã“ã“ã§ã¯ if 㨠cond を説明ã—ã¾ã™ã€‚if æ§‹æ–‡ã¯ã“ã®ã‚ˆã†ã«ãªã£ã¦ã„ã¾ã™ã€‚
ã‚‚ã—æ¡ä»¶å¼ãŒæˆç«‹ã—ãŸã‚‰ã€æˆç«‹ã—ãŸæ™‚ã®è©•価å¼ã‚’評価を行ã„ã€æˆç«‹ã—ãªã‹ã£ãŸã‚‰æˆç«‹ã—ãªã„時ã®è©•価å¼ã‚’評価ã—ã¾ã™ã€‚æˆç«‹æ¡ä»¶å¼ã¯çœŸå½å€¤ã‚’ã‚‚ãŸã‚‰ã™ã‚‚ã®ã§ã‚れã°ã©ã®ã‚ˆã†ã«ãªã£ã¦ã„ã¦ã‚‚æ§‹ã„ã¾ã›ã‚“。if æ§‹æ–‡ã®è¿”り値ã¯ã€æˆç«‹ã—ãŸæ™‚/æˆç«‹ã—ãªã‹ã£ãŸæ™‚ã®è©•価å¼ã‚’評価ã—ãŸçµæžœã§ã™ã€‚例ãˆã°æ•°å—を比較ã—ã¦å¤§å°ã‚’判定ã™ã‚‹ã«ã¯ã“ã†ã—ã¾ã™ã€‚ > (let* ((atai 5) (kekka "")) (if (> atai 6) (set! kekka "High") (set! kekka "Low"))) "Low" > (let* ((atai 5) (kekka "")) (if (> atai 4) (set! kekka "High") (set! kekka "Low"))) "High" ã“れ㯠atai ã« 5 を入れã€atai ãŒæ¯”較ã™ã‚‹æ•°å—よりも大ãã‘れ㰠kekka ã«æ–‡å—列 "High" を入れã€ãã†ã§ãªã‘れ㰠"Low" を入れã¦ã„ã¾ã™ã€‚if 構文を実行ã—ãŸæ™‚ã«è¿”ã£ã¦ãã‚‹ã®ã¯ã€æ¡ä»¶ã‚’分å²ã•ã›ãŸæ™‚ã«è¡Œã£ãŸè©•価å¼ã®çµæžœãŒè¿”ã£ã¦ãã¾ã™ã€‚set! を行ã£ãŸã¨ãã«ã¯ä»£å…¥ã—ãŸã‚‚ã®ãŒè¿”ã£ã¦ãã‚‹ã®ã§ "High" 㨠"Low" ã¨ã„ã†æ–‡å—列ãŒè¿”ã£ã¦ãã¾ã™ã€‚ ãã®ãŸã‚ (> atai 6) ã®æ™‚ã«ã¯æ¡ä»¶ãŒæˆã‚Šç«‹ãŸãªã„ã®ã§å¾Œè€…を評価ã—ãŸçµæžœã®"Low" ãŒè¿”ã£ã¦ãã¦ã€(> atai 4) ã®æ™‚ã¯æˆã‚Šç«‹ã¤ã®ã§å‰è€…を評価ã—ãŸçµæžœã® "High" ãŒè¿”ã£ã¦ãã¦ã„ã¾ã™ã€‚ã“れをインデントをã¤ã‘ã¦æ›¸ãã¨ã“ã†ãªã‚Šã¾ã™ã€‚ (let* ((atai 5) (kekka "")) (if (> atai 4) ; æ¡ä»¶åˆ¤å®š (set! kekka "High") ; æ¡ä»¶ãŒæˆç«‹ã—ãŸæ™‚ (set! kekka "Low"))) ; æ¡ä»¶ãŒæˆç«‹ã—ãªã‹ã£ãŸæ™‚ 4.3.2 cond
cond ã§ã¯è¤‡æ•°ã®æ¡ä»¶å¼ã‚’並ã¹ã¦ãŠãã€æœ€åˆã«è¦‹ä»˜ã‹ã£ãŸæ¡ä»¶ã‚’満ãŸã™å¼ãŒé¸ã°ã‚Œã€ãã®å¼ã‚’評価ã—ãŸçµæžœãŒè¿”ã£ã¦ãã¾ã™ã€‚
ãã®æ¡ä»¶ã‚’満ãŸã—ãŸå ´åˆã«è¡Œã†å¼ã‚’ç¶šã‘ã¦æ›¸ãã¾ã™ã€‚ã©ã®æ¡ä»¶ã‚‚満ãŸã•ãªã‹ã£ãŸå ´åˆã®ãŸã‚ã«ã€æœ€å¾Œã«å—ã‘çš¿ã¨ãªã‚‹è©•ä¾¡å¼ (ã„ã‚ゆる else 節) を書ãã“ã¨ã‚‚ã§ãã¾ã™ (最後ã®è©•価å¼ã¯ãªãã¦ã‚‚よã„)。例ãˆã°ã“ã®ã‚ˆã†ã«æ›¸ãã¾ã™ã€‚ (let* ((seiseki 50)) (cond ((= seiseki 100) "Perfect!") ((>= seiseki 70) "Very good!") ((>= seiseki 50) "Good!") ((>= seiseki 30) "Bad!") ('else "No comment..."))) ã“ã®å ´åˆä¸Šã‹ã‚‰é †ç•ªã«è©•価ã—ã¦ã„ãã€seiseki ㌠100 ã ã£ãŸå ´åˆã«ã¯ "Perfact!" ã‚’ã€70 以上ã ã£ãŸå ´åˆã«ã¯ "Very good!" ã‚’ã€50 以上ã ã£ãŸå ´åˆã«ã¯ â€Good!" ã‚’ã€30 以上ã ã£ãŸå ´åˆã«ã¯ Bad!" を出力ã—ã¾ã™ã€‚ã©ã®æ¡ä»¶ã«ã‚‚当ã¦ã¯ã¾ã‚‰ãªã‹ã£ãŸå ´åˆ (seiseki ãŒ30 より下) ã«ã¯ "No comment..." を出力ã—ã¦ã„ã¾ã™ã€‚詳ã—ã„説明ã¯çœãã¾ã™ãŒã€'else ã¯ã‚¢ãƒˆãƒ ã§ã™ã€‚ã¾ãŸã€'else ã®ä»£ã‚り㫠"#t" を使ã£ã¦ã‚‚ã„ã„ã§ã—ょã†ã€‚#t ã¯çœŸã‚’æ„味ã™ã‚‹ã®ã§ã€å¿…ãšæ¡ä»¶ãŒæˆã‚Šç«‹ã£ã¦ã„ã‚‹ã“ã¨ã«ãªã‚Šã¾ã™ã€‚ 4.3.3 and 㨠or
and ã¯ãれã«ç¶šã評価å¼ã«ä¸€ã¤ã§ã‚‚å½ãŒã‚れã°ãã“ã§è©•価をæ¢ã‚ã¦å½ã‚’è¿”ã—ã¾ã™ã€‚å…¨ã¦ãŒçœŸã§ã‚ã‚Œã°æœ€å¾Œã«è©•価ã—ãŸå¼ã®çµæžœã‚’è¿”ã—ã¾ã™ã€‚一方 or ã¯ãれã«ç¶šã評価å¼ã®ã©ã‚Œã‹ä¸€ã¤ã§ã‚‚真ã§ã‚れã°ãã“ã§æ¢ã‚ã¦çœŸã‚’è¿”ã—ã¾ã™ã€‚å…¨ã¦ãŒå½ã§ã‚れã°å½ã‚’è¿”ã—ã¾ã™ã€‚è¤‡æ•°ã®æ¡ä»¶ãŒä¸€åº¦ã«æˆã‚Šç«‹ã£ã¦ã„ã‚‹ã‹ã©ã†ã‹ã‚’判定ã™ã‚‹å ´åˆã«ä½¿ã†ã¨ã‚ˆã„ã§ã—ょã†ã€‚
and 㨠or ã®å ´åˆã€è©•価å¼ã‚’書ãé †ç•ªãŒæ„味をæŒã¡ã¾ã™ã€‚and ã§ã¯å½ã¨ãªã‚‹å¼ãŒã€or ã§ã¯çœŸã¨ãªã‚‹å¼ãŒè¦‹ä»˜ã‹ã£ãŸå ´æ‰€ä»¥é™ã®è©•価å¼ã¯è©•価ã•れã¾ã›ã‚“。 4.3.4 begin
ã“ã‚Œã¯æ¡ä»¶åˆ†å²ã®å¼ã§ã¯ã‚りã¾ã›ã‚“。ã—ã‹ã—ã€è¤‡æ•°ã®å¼ã‚’書ã‹ãªã‘れã°ãªã‚‰ãªã„ã“ã¨ãŒå¤šã„æ¡ä»¶åˆ†å²ã®å ´é¢ã§ begin ãŒã‚ˆã使ã‚れã¦ã„ã‚‹ã®ã§ã“ã“ã§å–り上ã’ã¾ã—ãŸã€‚begin ã¯è¤‡æ•°ã®å¼ã‚’é †ç•ªã«è©•価ã—ã¾ã™ã€‚最後ã®å¼ã‚’評価ã—ãŸçµæžœãŒè¿”ã£ã¦ãã¾ã™ã€‚
評価å¼ã‚’é †ç•ªã«å…¨ã¦è©•価ã—ã¦ã„ãã¾ã™ã€‚if 文や cond æ–‡ã§ã¯ãã®æ¡ä»¶ãŒæˆç«‹ã—ãŸæ™‚ã«å–り得る評価å¼ã¯ä¸€ã¤ã§ã™ãŒã€begin を使ã£ã¦ãã®ä¸€ã¤ã®å¼ã®ä¸ã«è¤‡æ•°ã®å¼ã‚’書ãã“ã¨ãŒã§ãるよã†ã«ãªã‚‹ã®ã§ã™ã€‚ 4.4 局所変数
4.4.1 let* 㨠let
最åˆã® Scheme ã®èª¬æ˜Žã®ã¨ã“ã‚ã§ã€set! ã«ã‚ˆã‚‹å¤‰æ•°ã«å€¤ã‚’入れる方法を紹介ã—ã¾ã—ãŸã€‚set! ã§å®šç¾©ã•れãŸå¤‰æ•°ã¯ã€å¤§åŸŸå¤‰æ•°ã¨ãªã‚Šã¾ã™ã€‚大域変数ã¨ã¯ã€å¤‰æ•°ã®é©ç”¨ç¯„囲ãŒå…¨ä½“ã«ã‚ãŸã£ã¦æœ‰åйã§ã‚ã‚‹ã¨ã„ã†æ„味ã§ã™ã€‚ ã“ã®ã‚ˆã†ãªå¤§åŸŸå¤‰æ•°ã«å¯¾ã—ã¦ã€å¤‰æ•°ã®æœ‰åŠ¹ç¯„å›²ãŒã‚る範囲内ã«é™å®šã•れã¦ã„ã‚‹ã‚‚ã®ã‚’局所変数ã¨å‘¼ã³ã¾ã™ã€‚局所変数ã®å®šç¾©ã¯ let* æ§‹æ–‡ãªã©ã‚’用ã„ã¦è¡Œã„ã¾ã™ã€‚
let* æ§‹æ–‡ã§ã¯æœ€åˆã«å¤‰æ•°ã«å€¤ã‚’入れãŸã‚‚ã®ã‚’括弧ã§å›²ã¿ã€ãã®å¾Œã«è©•価å¼ãŒä¸¦ã³ã¾ã™ã€‚ã“ã“ã§å®šç¾©ã—ãŸå¤‰æ•°ã¯ let* æ–‡ã®æ‹¬å¼§ã®ä¸ã ã‘ã§æœ‰åйã§ã€æ‹¬å¼§ã®å¤–ã«å‡ºã¦ã—ã¾ã†ã¨ç„¡åй (通常ã¯ã‚¨ãƒ©ãƒ¼) ã«ãªã‚Šã¾ã™ã€‚let* 構文を使ã£ãŸæ™‚ã®è¿”り値ã¯ã€ä¸€ç•ªæœ€å¾Œã®è©•価å¼ã‚’評価ã—ãŸçµæžœãŒè¿”ã£ã¦ãã¾ã™ã€‚ > (let* ((x 5) (y 7) (z 9)) (+ x y z)) 21 上ã®å¼ã¯ã‚³ãƒ³ã‚½ãƒ¼ãƒ«ã«å…¥åŠ›ã™ã‚‹ãŸã‚一行ã«åŽã‚ã¾ã—ãŸãŒã€ã‚¤ãƒ³ãƒ‡ãƒ³ãƒˆã‚’ã¤ã‘ã¦è¤‡æ•°è¡Œã§æ›¸ãã¨ã“ã®ã‚ˆã†ã«ãªã‚Šã¾ã™ã€‚ã©ã®æ‹¬å¼§ãŒã©ã“ã®æ‹¬å¼§ã«å¯¾å¿œã—ã¦ã„ã‚‹ã®ã‹ã«æ³¨æ„ã—ã¦ä¸‹ã•ã„。 (let* ((x 5) (y 7) (z 9)) (+ x y z)) let* æ§‹æ–‡ã¨åŒã˜ã‚‚ã®ã¨ã—㦠let æ§‹æ–‡ãŒã‚りã¾ã™ã€‚両者ã¯ã»ã¨ã‚“ã©åŒã˜ãªã®ã§ã™ãŒã€let æ§‹æ–‡ã§ã¯å®£è¨€ã—ãŸå±€æ‰€å¤‰æ•°ã‚’用ã„ã¦æ¬¡ã®å±€æ‰€å¤‰æ•°ã‚’宣言ã§ããªã„ã¨ã“ã‚ã«é•ã„ãŒã‚りã¾ã™ã€‚ (let ((x 6) (y 7) (z (+ x y))) (+ x y z)) ã“ã“ã§ã¯ x ã« 6 ã‚’ã€y ã« 7 を入れã¦ã€x 㨠y ã‚’è¶³ã—ç®—ã—ãŸã‚‚ã®ã‚’ z ã«ã—ãŸã„ã®ã§ã™ãŒã€let ã§ã¯å®£è¨€ã—ãŸã°ã‹ã‚Šã®å¤‰æ•°ã‚’使ã†ã“ã¨ãŒã§ããªã„ã®ã§ã‚¨ãƒ©ãƒ¼ã«ãªã‚Šã¾ã™ã€‚let* ã§ã¯ x 㨠y ã‚’ z ã®å®£è¨€ã®ãŸã‚ã«ä½¿ã†ã“ã¨ãŒã§ãã‚‹ã“ã¨ã‚’確èªã—ã¦ä¸‹ã•ã„。 4.5 æ–°ã—ã„関数ã®å®šç¾©
4.5.1 define
æ–°ã—ã„関数ã®å®šç¾©ã¯ define 文を使ã„ã¾ã™ã€‚最åˆã«ä½œã£ãŸã‚¹ã‚¯ãƒªãƒ—トã®ã¨ã“ã‚ã§ä½•æ°—ãªã出ã¦ã„ã¾ã™ãŒã€ã‚ã‚Œã¯æ–°ã—ã„関数を作ã£ãŸã®ã§ã™ã€‚define ã®å¼ã¯ã“ã†ãªã‚Šã¾ã™ã€‚
関数ã®åå‰ã«ã¯æ–°ã—ã„関数ã®åå‰ã‚’付ã‘ã¾ã™ã€‚ä»»æ„ã®åå‰ã‚’ã¤ã‘ã‚‹ã“ã¨ãŒã§ãã¾ã™ãŒã€ãƒ¦ãƒ‹ãƒ¼ã‚¯ãª (é‡è¤‡ã—ãªã„) åå‰ã«ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚ãã®å¾Œã«ã¯ã“ã®é–¢æ•°ã®ä»®å¼•数を並ã¹ã¾ã™ã€‚仮変数ã«ã¯é–¢æ•°ã‚’呼ã³å‡ºã—ãŸæ™‚ã®å¼•æ•° (実引数) ãŒé †ç•ªã«å…¥ã‚Šã¾ã™ã€‚ãã®å¾Œã«ã¯é–¢æ•°ã®å‡¦ç†ã‚’書ãã¾ã™ã€‚define ã®è¿”り値ã¯ã€æœ€å¾Œã®è©•価å¼ã‚’評価ã—ãŸçµæžœãŒè¿”ã£ã¦ãã¾ã™ã€‚ define 文を実際ã«ã‚„ã£ã¦ã¿ã‚‹ã¨åˆ†ã‹ã‚Šã‚„ã™ã„ã§ã—ょã†ã€‚数値ã®è‡ªä¹—ã‚’è¿”ã™é–¢æ•°ã‚’作ã£ã¦ã¿ã¾ã™ã€‚ > (define (jijyou x) (* x x)) jiyou > (jijyou 4) 16 > (jijyou 9) 81 ã“ã“ã§ã¯ jijyou ã¨ã„ã†åå‰ã®é–¢æ•°ã‚’作りã¾ã—ãŸã€‚jijyou ã¨ã„ã†é–¢æ•°ã¯å¼•数を一ã¤ã ã‘å¿…è¦ã¨ã—ã¾ã™ã€‚ãã—ã¦å¼•数を自乗ã—ãŸã‚‚ã®ã‚’è¿”ã—ã¾ã™ã€‚jijyou 関数ã®å‘¼ã³å‡ºã—ã¯ã€jijyou ã«ç¶šã‘ã¦å¼•æ•°ã¨ãªã‚‹æ•°å€¤ã‚’与ãˆã‚‹ã“ã¨ã§ã§ãã¾ã™ã€‚ 4.5.2 lambda
lambda (ラムダ) å¼ã¯åå‰ã®ãªã„関数を定義ã—ã¾ã™ã€‚ãれ以外㯠define ã¨åŒã˜ã§ã€æœ€å¾Œã«è©•価ã—ãŸå¼ã®çµæžœã‚’è¿”ã—ã¾ã™ã€‚
lambda å¼ã«ä»®å¼•æ•°ã®æ•°ã ã‘引数を与ãˆã‚‹ã“ã¨ã§åˆ©ç”¨ã—ã¾ã™ã€‚例ãˆã°ä¸ŽãˆãŸå¼•æ•°ã« 1 ã‚’åŠ ç®—ã™ã‚‹æ‰‹ç¶šãã¯ã“ã®ã‚ˆã†ã«æ›¸ãã¾ã™ã€‚ > ((lambda (x) (+ x 1)) 0) 1 > ((lambda (x) (+ x 1)) 5) 6 4.6 å†å¸°å‘¼ã³å‡ºã—
å†å¸°å‘¼ã³å‡ºã—ã¨ã¯ã€é–¢æ•°ãŒãã®é–¢æ•°ã®ä¸ã§è‡ªåˆ†è‡ªèº«ã‚’呼ã³å‡ºã™ã“ã¨ã§ã™ã€‚Scheme ã§ã¯å†å¸°å‘¼ã³å‡ºã—ãŒèªã‚られã¦ãŠã‚Šã€Script-Fu ã§ã‚‚使用ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ã“れã«ã‚ˆã£ã¦ã•らã«é«˜åº¦ãªã‚¹ã‚¯ãƒªãƒ—ト処ç†ãŒå¯èƒ½ã«ãªã‚Šã¾ã™ã€‚ å†å¸°å‘¼ã³å‡ºã—ã¯ã€ãƒ—ãƒã‚°ãƒ©ãƒŸãƒ³ã‚°ã®æœ¬ãªã©ã§ã¯ãƒãƒŽã‚¤ã®å¡”を例ã¨ã—ã¦ã‚ˆãå–り上ã’れã¦ã„るよã†ã§ã™ã€‚ã“ã“ã§ã¯å†å¸°å‘¼ã³å‡ºã—ã«ã‚ˆã£ã¦è¨ˆç®—ã‚’ã•ã›ã¦ã¿ã¾ã™ã€‚ã“ã®é–¢æ•°ã«æ•°å€¤ n を与ãˆã‚‹ã¨ã€n ã‹ã‚‰ 1 ã¾ã§éšŽä¹—ã—ãŸçµæžœã‚’è¿”ã—ã¾ã™ã€‚ > (define (kaijyou n) (if (<= n 0) 1 (* n (kaijyou (- n 1))))) kaijyou > (kaijyou 5) 120 ã“ã® kaijyou ã¨ã„ã†é–¢æ•°ã¯ n ㌠0 以下ã®å ´åˆã«ã¯ 1 ã‚’è¿”ã—ã€0 より大ãã‹ã£ãŸå ´åˆã«ã¯ 1 ã ã‘値をå°ã•ãã—ã¦è‡ªåˆ†è‡ªèº«ã‚’呼ã³å‡ºã—ã¾ã™ã€‚ã“ã®ç¹°ã‚Šè¿”ã—ã«ã‚ˆã£ã¦ n! ã‚’ã€ã¤ã¾ã‚Š 1*2*3* [...] *(n-2)*(n-1)*n を計算ã•ã›ã¦ã„ã‚‹ã®ã§ã™ã€‚最åˆã®å¼•æ•°ã¨ã—㦠5 を与ãˆãŸå ´åˆã®è¨ˆç®—éŽç¨‹ã¯ã“ã®ã‚ˆã†ã«ãªã‚Šã¾ã™ã€‚ (kaijyou 5) => (* 5 (kaijyou 4)) => (* 5 (* 4 (kaijyou 3))) => (* 5 (* 4 (* 3 (kaijyou 2)))) => (* 5 (* 4 (* 3 (* 2 (kaijyou 1))))) => (* 5 (* 4 (* 3 (* 2 (* 1 (kaijyou 0)))))) => (* 5 (* 4 (* 3 (* 2 (* 1 1))))) => (* 5 (* 4 (* 3 (* 2 1)))) => (* 5 (* 4 (* 3 2))) => (* 5 (* 4 6)) => (* 5 24) => 120 引数を 5 ã«ã—ã¦ã“ã®é–¢æ•°ã‚’呼ã³å‡ºã—ãŸå ´åˆã€å¼•æ•°ã® 5 ãŒæœ€åˆã« n ã«å…¥ã£ã¦ if æ–‡ã§åˆ¤å®šã•れã¾ã™ã€‚0 よりも大ãã„ã®ã§ n ã‹ã‚‰ 1 を引ã„ãŸå€¤ã€ã¤ã¾ã‚Š 4 を引数ã¨ã—ã¦è‡ªåˆ†è‡ªèº«ã‚’呼ã³å‡ºã—ã¾ã™ã€‚次ã®å¼•数㯠4 ã§ã€ã“れも 0 よりも大ãã„ã®ã§ 3 を引数ã¨ã—ã¦è‡ªåˆ†è‡ªèº«ã‚’呼ã³å‡ºã—ã¾ã™ã€‚ ã“れを繰り返ã—ã€å¼•æ•°ã‚’ 1 ã¨ã—ã¦è‡ªåˆ†ã‚’呼ã³å‡ºã—ãŸæ™‚ã®æ¬¡ã«ã¯ 引数を 0 ã¨ã—ã¦è‡ªåˆ†è‡ªèº«ã‚’呼ã³å‡ºã™ã¯ãšã§ã™ã€‚ã“ã®æ™‚ã®å¼•数㯠0 ãªã®ã§ã€ã“ã“ã§ã‚ˆã†ã‚„ãã¯ã˜ã‚㦠1 ã¨ã„ã†å€¤ãŒè¿”ã£ã¦ãã¾ã™ã€‚ã“れã¯å¼•æ•°ã‚’ 0 ã¨ã—ã¦å‘¼ã³å‡ºã—ãŸæ™‚ã®è¿”り値ã§ã™ã‹ã‚‰ã€ã“ã‚ŒãŒæ±‚ã¾ã‚Œã°å¼•æ•°ã‚’ 1 ã¨ã—ãŸæ™‚ã®å¼•æ•°ãŒæ±‚ã¾ã‚Šã€(* 1 1) ã®è¨ˆç®—ãŒã§ãã¾ã™ã€‚ã“ã®çµæžœã¯å¼•æ•°ã‚’ 1 ã¨ã—ã¦å‘¼ã‚“ã æ™‚ã®è¿”り値ã§ã™ã‹ã‚‰ã€å¼•æ•°ã‚’ 2 ã¨ã—ãŸæ™‚ã®å¼•æ•°ãŒæ±‚ã¾ã‚Šã€(* 2 1) ã®è¨ˆç®—ãŒã§ãã¾ã™ã€‚ãれ以é™ã¯é †ç•ªã«æœ€åˆã®å¼•æ•°ã‚’ 5 ã¨ã—ãŸæ™‚ã¾ã§æ±‚ã‚ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ 上ã®å†å¸°å‘¼ã³å‡ºã—をインデントを付ã‘ã¦æ›¸ãç›´ã—ãŸã‚‚ã®ãŒã“れã§ã™ã€‚éžå¸¸ã«ã‚·ãƒ³ãƒ—ルã§ã™ãŒã€çµæ§‹é«˜åº¦ãªã“ã¨ã‚’ã‚„ã£ã¦ã„ã¾ã™ã€‚å†å¸°å‘¼ã³å‡ºã—を使用ã™ã‚‹å ´åˆã¯ã€ãƒ«ãƒ¼ãƒ—を抜ã‘å‡ºã™æ¡ä»¶ã«æ³¨æ„ã™ã‚‹ã‚ˆã†ã«ã—ã¾ã—ょã†ã€‚ (define (kaijyou n) (if (<= n 0) 1 (* n (kaijyou (- n 1))))) |