-2
정수를 취하여 그 숫자를 church encoded 함수 형태로 반환하는 함수가 필요합니다.자바에서 임의의 정수에 교회 숫자를 생성하는 코드
나는 newlisp이를 달성 :
(define (reduce stencil sq) (apply stencil sq 2))
(define (num n) (cond
((= n 0) 'x)
((< n 2) '(f x))
(true (reduce (fn (l i) (list 'f l)) (cons '(f x) (sequence 2 n))))))
(define (church-encode n)
(letex ((body (num n)))
(fn (f x) body)))
내가 호출하면
(교회 인코딩 0) 내가 다시 교회로 인코딩 된 0의 람다 수 :(lambda (f x) x)
그리고 (church-를 인코딩 3)은 다음과 같이 나타납니다.
(lambda (f x) (f (f (f x))))
하지만 자바 스크립트에서 동일한 작업을 수행하려고합니다. 바람직하게는 내가 여기했던 같은 문자열 jank에 의존하지 않고 :
(function (_) {
var asnum = function(x) { return x((function(x) {return x+1;}), 0); };
function church_encode(n) {
function genBody() {
return _.reduce(_.range(n), function(e,x) {
return e.replace("x", "f(x)");
}, "x");
}
eval("var crap = function (f, x) { return "+genBody()+"; }");
return crap;
}
var encoded_nums = _.map(_.range(11), church_encode);
var numerics = _.map(encoded_nums, asnum);
console.log(numerics);
})(require('lodash'));
당신이 어떻게 작동하는지에 대한 간략한 설명과 함께 질문 *에 newlisp 코드 *를 포함하는 경우 그것은 좋은 것입니다. –
귀하의 질문은 무엇입니까? 자바 스크립트 버전의 코드에 어떤 문제가 있습니까? – Bergi
@Bergi 정말요? "가급적이면 끈 팬티에 의지하지 말고." 소품 자바 스크립트가 끔찍하게 나쁘고 eval에 의존하는 것보다 더 나은 방법이 반드시 있어야한다고 분명합니다. 이것은 결국 람다 미적분입니다. 그래서 그것은 모두 자위입니다. : P – Squirrelsama