๋ค์๊ณผ ๊ฐ์ ์ธ๊ณ๊ฐ ์ฃผ์ด์ง๋๋ค.
require('cucumber').defineSupportCode( ({setWorldConstructor:world}) => {
world(class {
constructor(p) { ... }
foo(bar) { return new Promise(.... ) }
})
})
๋๋ ๋ค์๊ณผ ๊ฐ์ด ์ธ ์ ์๊ธฐ๋ฅผ ์ํ๋ค.
When(/^I do the foo with (.*)$/i, (ctx, bar) => ctx.foo(bar) );
๋์ ์
When(/^I do the foo with (.*)$/i, function(bar) {
return this.foo(bar)
});
์ด๊ฒ์ ๋ํ ๋ชจ๋ ๋น๋๊ธฐ ์์
์์ .bind(this)
์ ๋ฉํ๊ฒ ํ๋ ๊ฒ์ ์์ ๊ฑฐ๋ ์ํ๋ ๊ฒฝ์ฐ var that = this
๋ก ๋ฉํ๊ฒ ํ๋ ๊ฒ์ ์ ๊ฑฐํฉ๋๋ค.
๋ ํ๋์ ์ด์ (IMHO) - ์ฌ๋๋ค์ด ์ธ๊ณ์ ๋ํ ์์ ํธ๋ฆฌ์์ ๋ฒ์ด๋ JS์ ๋ ๋์ ๊ธฐ๋ฅ์ ๋ ์ ์งํฅํ๋๋ก ๋์์ค๋๋ค.
๋๋ ๊ทธ๊ฒ์ด ๋น์ ์ด ํญ์ world
๋ฅผ ์ธ์๋ก ๋ฐ์๋ค์ธ๋ค๋ ๊ฒ์ ์๋ฏธํ๋ฉฐ ๊ทธ๊ฒ์ด API ๋ณ๊ฒฝ์ด๋ผ๋ ๊ฒ์ ๋์ํฉ๋๋ค.
--ui exports
๋ฐ --ui tdd
๋ฐ --ui bdd
๊ฐ ์๋ ๋ชจ์นด์ ๋ง์ฐฌ๊ฐ์ง๋ก ํํ๋ ๊ฐ๋ฅํฉ๋๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก ๋จ๊ณ๊ฐ ์ธ๊ณ์์ ํธ์ถ/์ ์ฉ๋๋์ง ๋๋ ์ฒซ ๋ฒ์งธ ์ธ์๋ก ์๋ฝํ๋์ง ๊ฒฐ์ ํ๋ ํ๋ก์ ํธ ๋ณ์์
๋๋ค.
๋๋ ์ด๊ฒ์ด ์ฅ๊ธฐ์ ์ผ๋ก ๊ฐ์น๊ฐ ์๋ค๊ณ ์๊ฐํ์ง ์์ต๋๋ค. ์, =>
๋ฅผ ์ฌ์ฉํ ์ ์๋ 1์ค ๋จ๊ณ์ ์ข์ต๋๋ค. ์ ๊ฒฝํ์ ์ด๋ฐ ๋จ๊ณ๋ ๊ฑฐ์ ์์์ต๋๋ค. ES6์ ์ปจํ
์คํธ๋ฅผ ์ ์งํ์ง ์๋ ํ์ดํ ๊ธฐ๋ฅ์ด ํฌํจ๋์ด ์์ง ์๋ค๋ ์ฌ์ค์ ๋๋์ต๋๋ค.
์ด๊ฒ์ ๋ํ ๋ชจ๋ ๋น๋๊ธฐ ์์ ์์
.bind(this)
์ ๋ฉ ๋๋ฆฌ๋ ๊ฒ์ ์์ ๊ฑฐ๋ ์ํ๋ ๊ฒฝ์ฐvar that = this
๋ก ๋ฉํค๋ฅผ ์ ๊ฑฐํฉ๋๋ค.
์ด๊ฒ์ ํผํ๊ธฐ ์ํด ๋จ๊ณ ์ ์ ์์ ๊ตต์ ํ์ดํ๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๊น?
๋ ํ๋์ ์ด์ (IMHO) - ์ฌ๋๋ค์ด ์ธ๊ณ์ ๋ํ ์์ ํธ๋ฆฌ์์ ๋ฒ์ด๋ JS์ ๋ ๋์ ๊ธฐ๋ฅ์ ๋ ์ ์งํฅํ๋๋ก ๋์์ค๋๋ค.
์ด๊ฒ์ ์ข ๋ ์ค๋ช ํด ์ฃผ์๊ฒ ์ต๋๊น? / ์๋ฅผ ๋ค์ด ์ฃผ์๊ฒ ์ต๋๊น?
๊ฐ๋จํ ๋งํด์, ์ ๋ ์ปจํ ์คํธ๋ฅผ ํด๋์ค๋ก ํํํ๋ ๋ฐฉ์์ ๊ธฐํผํ๋ ํ๋ก๊ทธ๋๋จธ ํ๊ต์ ์ํด ์์ต๋๋ค. ๋ ๋ง์ ์ฌ๋๋ค์ด OOP์ ์ด๋์ด ๋ฉด์ ๋ ธ์ถ๋ ์๋ก ์ด ํ๊ต๋ ๋ ์ปค์ง๋๋ค. ํ์ดํ ๊ธฐ๋ฅ์ด ์ปจํ ์คํธ๋ฅผ ์ ์ง ํ์ง ๋ชปํ๋๋ก ๋ง๋ JS ์ปค๋ฎค๋ํฐ์ ์์ง์์ ์ด ์์ง์์ ๊ฐ์ ์ ๋ณด์ฌ์ฃผ๋ ํ ์์ ๋๋ค.
์ข ๊ต์ ์ธ ๋ ผ์์ ๋ผ์ด๋ค์ง ์๊ณ - ๋ ๊ทธ๋ฅ ๋ผ์ด๋ธ๋ฅผ ๋ฏฟ๊ณ ๋ผ์ด๋ธํ์, ๋น์ ์ ์์ ์ ์ฌ์ฉํ๊ณ ์ถ์ด? ์์ฒญ๋. ์ ๋ฅผ ๊ฐ์ ํ์ง ๋ง์ญ์์ค :-)
์ ์ผ๋ฐ์ ์ธ ๋๋์ ์์ ๋ณํ๊ฐ ๋ ์ ์๋ค๋ ๊ฒ์ ๋๋ค. ๊ฐ์ฅ ์ ์ํ๋ ์ ์๋ค๊ณ ์๊ฐํ๋ ์ผ๋ฐ์ ์ธ ๋ฐฉํฅ์ ์๋ ค์ฃผ์๋ฉด ๊ธฐ๊บผ์ด ํ ๊ฒ์ ;-)
๋จ๊ณ๋ฅผ ์ ์ํ ๋ ํด๋์ค๊ฐ ์๋๋ผ ํจ์๋ฅผ ์ ์ํ๋ฏ๋ก ๋
ผ๋ฆฌ์ ์ผ๋ก this
๋ ๊ทธ ์๋ฆฌ์ ์์ต๋๋ค.
์ด๊ฒ์ด OOP ํจ๋ฌ๋ค์์ด ์๋ FP ํจ๋ฌ๋ค์์ ์ํฉ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
@osher ๋๋ @charlierudolph ๊ฐ ๋น์ ์๊ฒ ํด๋์ค๋ฅผ ์ฌ์ฉํ๋๋ก ๊ฐ์ํ๊ณ ์ถ์ง ์๋ค๋ ์์ฌ์ ์ด์ ์ ์ค ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ฆ, ์ค์ง์ ์ธ ์ด์ ์ ์ ๊ณตํ์ง ์๋ ํ ์ด ํจํค์ง๋ฅผ ์ฌ์ฉํ๋ ๋ชจ๋ ๊ณณ์์ API ๋ณ๊ฒฝ ์ฌํญ์ ๊ฐ์ ๋ก ํตํฉ(์ค๋จ)ํด์๋ ์ ๋ฉ๋๋ค.
@charlierudolph ๋ด ์๊ฐ์ "JS์ ๋ ๋์ ๋ฅ๋ ฅ" @osher ๋ FP, Functional Programming์ ์๋ฏธํฉ๋๋ค.
IMHO ์ด ๋ณ๊ฒฝ์ ๋จ๊ณ ์ ์๋ฅผ ์กฐ๊ธ ๋ ๊ฐ๋จํ๊ณ ๋
ผ๋ฆฌ์ ์ผ๋ก ๋ง๋ค ๊ฒ์
๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ๋ค์ ์ค์ ์ ๊ฑฐํฉ๋๋ค. const thisWorldNotThisStep = this
๋ชจ๋ ๋น๋๊ธฐ ํจ์์ ๋ํด .bind(this)
๋ฅผ ์ฌ์ฉํ ํ์๊ฐ ์์ผ๋ฉฐ ๋จ๊ณ ์ ์ ๋ด์์ ํ์ดํ ํจ์๋ฅผ ์ฌ์ฉํ๋ ํ const self = this
ํจํด์ ์ฌ์ฉํ ํ์๊ฐ ์์ต๋๋ค.
๋ฌธ์ (ํฐ ๋ฌธ์ ๋ ์๋)๋ ๋จ๊ณ ์ ์ ๋ด์์ this
๊ฐ ๋จ๊ณ๊ฐ ์๋๋ผ ์ธ๊ณ๋ฅผ ์ฐธ์กฐํ๋ค๋ ๊ฒ์
๋๋ค. ์ด๋ ์ง๊ด์ ์ด์ง ์์ต๋๋ค.
๊ด์ฐฎ์. ๋ชจ๋ ์ฌ๋์ด ํจ์ํ ํ๋ก๊ทธ๋๋จธ๋ ์๋์ง๋ง ๋ธ๋ ์ดํน ์ฒด์ธ์ง ๋์ ์ ๋ฐฉ์งํ๊ธฐ ์ํด ์ธ๊ณ๋ฅผ ์ฒซ ๋ฒ์งธ ๋งค๊ฐ๋ณ์๋ก ์ ๋ฌํ๋ ์ต์ ์ ๋ง๋๋ ๊ฒ์ ๋ํด ์ด๋ป๊ฒ ์๊ฐํ์๋์?
defineSupportCode(({setWorldInjectionStrategy}) => {
setWorldInjectionStrategy('this') // default
setWorldInjectionStrategy('argument') // makes world be the first argument to steps and hooks
})
๋๋ ์ธ๊ณ/์ปจํ ์คํธ๋ฅผ ์ฃผ์ ํ๋ค๋ ์์ด๋์ด์ ์ ์ ์ผ๋ก ๋์ํฉ๋๋ค. ๋จ๊ณ์ ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค. ์ด ํ๋ก์ ํธ๋ฅผ ์์์ผ๋ก ๋ชจ๋ JS ์ํ๊ณ๋ ES6์์ ํ์ฉํ๋ ์๋ก์ด ๊ธฐ๋ฅ์ ์์ ํ ์์ฉํ๋๋ก ์์ง์ด๊ณ ์์ผ๋ฉฐ ์ด๋ ์ข์ ์ผ์ ๋๋ค โค๏ธ
Express๋ Koa์ ๊ฐ์ ๋ค๋ฅธ ๋๊ตฌ๋ฅผ ๋ณด๋ฉด ํ์ฌ ์์ฒญ ์ปจํ
์คํธ๋ฅผ this
๋ก ์ค์ ํ๊ณ ๋ฏธ๋ค์จ์ด์ ์ฒซ ๋ฒ์งธ ๋งค๊ฐ๋ณ์๋ก ์ค์ ํฉ๋๋ค(์ค์ด ๋จ๊ณ์ ๋์ผ). ์ด ์๋ฃจ์
์ ๊ธฐ๋ฅ์ ์ ํต์ ์ธ ์ฌ์ฉ๊ณผ ES6 ํ์ดํ ๊ธฐ๋ฅ์ ์ฌ์ฉ์ ํ์ฉํฉ๋๋ค.
์ฒซ ๋ฒ์งธ ๋งค๊ฐ๋ณ์๋ก์์ ์ปจํ
์คํธ์ ๋ ๋ค๋ฅธ ์ด์ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
@charlierudolph๊ฐ ์ ์ํ ์๋ฃจ์ ์ ๊ฒฝ์ฐ ์ด๊ฒ์ด ์ฅ๊ธฐ์ ์ผ๋ก ์๋ํ ์ ์๋ค๊ณ ์๊ฐํ์ง ์์ต๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ์ปค๋ฎค๋ํฐ๊ฐ ๋๋ก ๋๋ฉ๋๋ค. ๋ชจ๋ ์ค์ด ์์ ๋ ๋ชจ๋ ์ค์น์์ ์๋ํ์ง ์์ผ๋ฉฐ ๋ฌธ์๋ ๋ ๊ฐ๋ก ๋ณต์ ๋ฉ๋๋ค. ๋ฉ์ง์ง ์์ต๋๋ค.
๋ธ๋ ์ดํน ์ฒด์ธ์ง ๊ฑฑ์ ์ ๋ชจ๋ฅด๊ฒ ์ง๋ง v2๋ ์ด๋ฐ ์ข ๋ฅ์ ๋ณ๊ฒฝ์ ์๊ฐํ๊ธฐ์ ์๋ฒฝํ ์๊ธฐ์ ๋๋ค. ๊ธฐ๋ค๋ฆผ์ ๋ค๋ฅธ ์ ๊ณต์ ๋ง๋ค๊ฑฐ๋ ๊ธฐ๋ค๋ฆฌ๊ฒ ํ ๊ฒ์ ๋๋ค.
Before
๋ฐ After
๋ฅผ world
์ฃผ์
ํ๋๋ก ๋ณ๊ฒฝํ๋ ๊ฒ์ ์ด๋ป์ต๋๊น?
defineSupportCode(function({After, Before, Given}) {
let world;
// Asynchronous Callback
Before(function (w, scenarioResult, callback) {
world = w;
callback();
});
After(function (world, scenarioResult, callback) {
callback();
});
Given('I access the world', () => {
assert(world); // Yay!
});
});
๊ทธ๋ฐ ์์ผ๋ก before
๋จ๊ณ์์ world
๋ณ์๋ฅผ ์บก์ฒํ ์ ์์ต๋๋ค. ๊ฐ ๋จ๊ณ ์ ์๋ฅผ ์๋ง์ผ๋ก ๋ง๋ค์ง ์์ต๋๋ค.
๋ค์์ผ๋ก ๊ธฐ์กด ์์
๋ฐฉ์์ ์ ์งํ๋ฉด์ deprecated
๋ฉ์์ง๋ฅผ ์์ฑํฉ๋๋ค. ๋๋ ๊ทธ๋ ๊ฒ ํ์ง ์๋๋ผ๋ ํด๋น ์ ๊ทผ ๋ฐฉ์์ ์ฌ์ฉํ๊ณ ์์ ์ด ๋ฌด์์ ํ๊ณ ์๋์ง ์๊ณ ์ถ์ ์ฌ๋๋ค์ ์ํด ์ต์
์ ๋จ๊ฒจ๋์ญ์์ค.
์จ๋ผ์ธ์์ ๋ฐ๊ฒฌ๋ ์ค๋ํซ์ ํธํ์ฑ์ ๋ํ ๋ ผ์์ด ์ค๋๋ ฅ ์๋ ๋ ผ์์ด ๋ ๊น๋ด ๋๋ ต์ต๋๋ค.
--ui
ํ๋๊ทธ ๋๋ setWorldInjectionStrategy('argument')
๊ฐ ์๋๋ผ๋ ๋ชจ๋ ์จ๋ผ์ธ ํ ๋ก ๊ณผ ๊ทธ๋ฌํ ๋ณ๊ฒฝ์ ์ ํฉํ ์๋์ ์ ๊ณตํ๋ ์ฃผ์ ๋ฒ์ ์ ๋ธ๋ ์ดํน ์ฒด์ธ์ง๋ก ๋ ์ ์ ๋ฌ๋๋ ๋ฌธ์ ๊ฐ ๋ฉ๋๋ค. ํผ๋์ ์์ ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
๊ทธ๋์ ๋๋ cuke์ ๋ค์ ๋ฒ์ ์์ ๊ทธ๊ฒ์ ํ๋ ๊ฒ์ ํฌํํ๊ณ , ๊ทธ๊ฒ์ด ๋ฆด๋ฆฌ์ค๋ ๋๊น์ง ...makedoingํฉ๋๋ค.
์นด๋๋ฆฌ์ ๋ฒ์ ๋๋ ์จ๊ฒจ์ง ํ๋๊ทธ๋ ์ด๊ธฐ์ ์ฌ์ฉํ๊ณ ํผ๋๋ฐฑํ ๋ฉ์ง ํ๋ก๋ชจ์ ์ด ๋ ๊ฒ์ ๋๋ค.
๋์ฒด FP ์ธํฐํ์ด์ค๋ฅผ ๊ณต๊ฐํ๊ณ ์ถ์ต๋๋ค.
๋ค์์ ์ด๋ป์ต๋๊น? (์ฝ์ ์นํ์ ์์ ์ค๋ช ํ๊ธฐ ์ํด async/await ์ฌ์ฉ)
import {initialize, Given, Before} from 'cucumber/fn'
// specify a function that returns the initial context:
initialize(async () => ({ a: 42 }))
Before({ timeout: 10 }, async (ctx) => {
await doStuff(ctx.a)
})
Given(/^a step passes with {number}$/, async (ctx, number) => {
const newA = await computeStuff(ctx.a, number)
// tell cucumber about the new context:
return Object.assign({}, ctx, { a: newA })
})
๊ธฐ๋ฅ์ ๋จ๊ณ ์ ์๋ฅผ ์ ๊ณตํ๋ ์ค์ด -fp๋ฅผ ํจ๊ป ํดํนํ์ต๋๋ค. ์ด๋ฏธ ๋ช ๊ฐ์ง ๊ฐ์ ์์ด๋์ด๊ฐ ์์ต๋๋ค. ํผ๋๋ฐฑ ํ์ํฉ๋๋ค!
๋๋ ์ฐ๋ฆฌ๊ฐ ์ด ๋ฌธ์ ๋ฅผ ๋ซ๊ณ ์ฌ๋๋ค์ด ๊ทธ ์์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์คํํ๋๋ก ์ ์ํฉ๋๋ค. ์ธ์ ๊ฐ ์ฐ๋ฆฌ๋ ๊ทธ๊ฒ์ Cucumber.js๋ก ๊ฐ์ ธ์ฌ ์ ์์ ๊ฒ์ ๋๋ค.
@jbpros ํ ์คํธ์์ ํ์ดํ ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ ์๋๋ก ๋ ๋ค๋ฅธ ์ข ์์ฑ์ ์ค์นํ์ง ์๋ ๊ฒ์ด ์ข์ต๋๋ค.
์ด๊ฒ์ ์ค์ ๋ก ๋ชจ๋ ์ฌ๋์ด ์ค์ค๋ก ๊ตฌํํ๋ ๊ฒ์ด ๋งค์ฐ ๊ฐ๋จํด์ผ ํฉ๋๋ค. ๋ค์ ์ฝ๋ ์ค๋ํซ์ ์ฌ์ฉํ ์ ์๊ฒ ๋ง๋๋ ํฐ ๊ฒฝ๊ณ ์ ํจ๊ป (๊ธฐ๋ฅ์ ์ผ๋ก) ๋งค์ฐ ์ ์๋ํฉ๋๋ค.
// Don't rely on `this` in step definitions. It's 2021 for crying out loud.
const definitionFunctionWrapper = (fn) =>
function(...args) {
return fn(...args.slice(0, -1), this);
}
๋ชจ๋ ๋จ์ผ ๋จ๊ณ ์ ์๋ผ๋ ๊ฒฝ๊ณ ๋ ์ด์ ์ถ๊ฐ ๋งค๊ฐ๋ณ์๋ก ์ธํด ๋ค์ ์ค๋ฅ๋ฅผ ๊ธฐ๋กํฉ๋๋ค.
Error: function uses multiple asynchronous interfaces: callback and promise
to use the callback interface: do not return a promise
to use the promise interface: remove the last argument to the function
์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์ถ๊ฐ ๋งค๊ฐ๋ณ์๋ฅผ ์ถ๊ฐํ๋ ค๊ณ ํ๋ฉด
function has 3 arguments, should have 1 (if synchronous or returning a promise) or 2 (if accepting a callback)
์ค์ด-js๊ฐ ํ์๋ก ํ๋ ๋ชจ๋ ๊ฒ์ ํจ์ ์ธ์ ๊ฒ์ฌ๋ฅผ ๋นํ์ฑํํ๋ ์ต์
์ด๋ฉฐ ์ด ๋ฌธ์ ๋ ์ฌ๋ผ์ง ๊ฒ์
๋๋ค. ์ค์ ๋ก ๋ ๋ฒ์งธ ์๊ฐ์ ์ค์ด๋ ๋จ๊ณ ์ ์ ํจ์์ ์ธ์ ์์ ๋ฐ๋ผ ์ฝ๋ฐฑ์ด ํ์ํ๋ค๊ณ ๊ฐ์ ํ๊ธฐ ๋๋ฌธ์ ํ
์คํธ ์๊ฐ์ด ์ด๊ณผ๋๋ ๊ฒ์ฒ๋ผ ๋ณด์
๋๋ค. ๊ทธ๋ฌ๋ ๋ฐํ๋ ์ฝ์์ ์ฐ์ ์์๋ฅผ ๋ถ์ฌํ๋ฉด ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์์ต๋๋ค.
@andyearnshaw ๊ทํ์ ์๊ฒฌ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค. "stepdef์ ํ์ดํ ๊ธฐ๋ฅ์ ๋ํ" ์ข ์์ฑ์ ๋ํ ๊ทํ์ ์ฐ๋ ค๋ฅผ ๋ค์์ต๋๋ค. ์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ํ ๋น์ ์ฅ ๋จ๊ณ ์ ์๋ฅผ ์ป๊ธฐ ์ํด ๊ฐ์ธ์ ์ผ๋ก ์ฌ์ฉํ๋ ์๋ฃจ์ ์ ๋๋ค. ๊ด์ฌ ์๋ ์ฌ๋์ ์ํด ํจํค์ง๋ก ๋ง๋ค์์ต๋๋ค.
์ฝ์ด์์ ์ด๋ฌํ ์์ํ stepdef API์ ๋ํ ์ง์์ ์ธ ๋ ผ์์ ๋ํ ์์ ์๋ฃจ์ ์ผ๋ก ๊ณ ๋ คํ์ญ์์ค(๋ฏฟ๊ฑฐ๋ ๋ง๊ฑฐ๋). ๋ด๊ฐ ๋งํ๋ฏ์ด ์ด๊ฒ์ ์ด๋ ์์ ์์ ํต์ฌ์ ์ฐฉ๋ฅํ ์ ์๋ ์คํ์ด๋ฉฐ ์ค์ ๋ก ๊ทธ๊ฒ์ ์ฌ์ฉํ๋ ์ฌ๋๋ค์ ํผ๋๋ฐฑ์ ์ ๋ง ๊ฐ์ฌํ๊ฒ ์๊ฐํฉ๋๋ค. ๊ฒฌ์ธ๋ ฅ์ด ์ถฉ๋ถํ๋ค๋ฉด ์ค์ด์ ํตํฉํ๋ ๊ฒ์ด ๋ ๋์ ๋ ผ๊ฑฐ๊ฐ ๋ ๊ฒ์ ๋๋ค.
๋ํ tap()
๋ฐ ๊ฐ์ ์ฝ๊ธฐ ์ ์ฉ ์ปจํ
์คํธ์ ๊ฐ์ ๋ช ๊ฐ์ง ๋ค๋ฅธ (์์) ์ ์ฉํ ๊ธฐ๋ฅ ๋๊ตฌ๋ฅผ ์ ๊ณตํ๊ณ ์์ต๋๋ค.
stepdef ํจ์์ ๋ํ arity ๊ฒ์ฌ๋ ํ์คํ ์ด lib์์ (๋งค์ฐ ์ถ์ ํ ๋ฐฉ์์ผ๋ก) ์ฐํํด์ผ ํ๋ ๋ฌธ์ ์ ๋๋ค. CLI์ ํ๋ก๊ทธ๋๋ฐ ๋ฐฉ์ ๋ชจ๋์์ ์ด ๊ธฐ๋ฅ์ ๋๋ ์ต์ ์ ์ด ์์ (๋ฐ ์ ์ฌ์ ์ผ๋ก ๋ค๋ฅธ ์ฌ์ฉ ์ฌ๋ก)์ ๋งค์ฐ ์ ์ฉํฉ๋๋ค. ๊ทธ๋ ๊ฒ ํ๊ณ ์ถ์ง๋ง ํ์ฌ๋ก์๋ ์๊ฐ์ด ๋ถ์กฑํ ์์์ ๋๋ค.
๊ทธ ๋์ arity ๊ฒ์ฌ๋ฅผ ์์ ํ๊ธฐ ์ํด ์ค์ด-fp์์ ์์ ๋กญ๊ฒ ์๊ฐ์ ์ป์ผ์ญ์์ค.
@jbpros ํ๋ฅญํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋น์ ์ด ๊ฑฐ๊ธฐ์
@andyearnshaw ํ ๋ง์ต๋๋ค. ์ค๋ช ๊ฐ์ฌํฉ๋๋ค. ๋๋ ์ฐ๋ฆฌ๊ฐ ์ด ์์ด๋์ด๋ฅผ ๋ฒ๋ ค์๋ ์ ๋๋ฉฐ ์ด ๋ฌธ์ ๋ฅผ ๊ณต๊ฐ์ ์ผ๋ก ์ ์งํ๋ ๊ฒ์ด ์๋ง๋ ์ผ์ ํฌ๋ช ํ๊ฒ ์ ์งํ๋ ์ข์ ๋ฐฉ๋ฒ์ผ ๊ฒ์ด๋ผ๋ ๋ฐ ๋์ํฉ๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
๊ด์ฐฎ์. ๋ชจ๋ ์ฌ๋์ด ํจ์ํ ํ๋ก๊ทธ๋๋จธ๋ ์๋์ง๋ง ๋ธ๋ ์ดํน ์ฒด์ธ์ง ๋์ ์ ๋ฐฉ์งํ๊ธฐ ์ํด ์ธ๊ณ๋ฅผ ์ฒซ ๋ฒ์งธ ๋งค๊ฐ๋ณ์๋ก ์ ๋ฌํ๋ ์ต์ ์ ๋ง๋๋ ๊ฒ์ ๋ํด ์ด๋ป๊ฒ ์๊ฐํ์๋์?