2017-05-10 6 views
2

Python 2.7 grammar rules과 일치하는 최소한의 유효한 소스 코드 예제를 만들 수 있습니까? 런타임 오류를 발생시키지 않고도 가능합니까?Python 2.7 문법 긱 - 목록 이해력의 람다

L = [ fn() for fn in (lambda: x for x in xrange(3)) ] 

하지만 내 솔루션의 문제는 "람다"주위에 괄호입니다 : 내가 지금까지 도달 할 수

(1) atom:   '[' [listmaker] ']' 
(2) listmaker:  test list_for 
(3) list_for:  'for' exprlist 'in' testlist_safe 
(4) testlist_safe: old_test 
(5) old_test:  old_lambdef 
(6) old_lambdef: 'lambda' [varargslist] ':' old_test 

최선의 결과입니다. 괄호없이 예제를 만들 수 있습니까? 그렇지 않다면 문법 규칙과 완벽하게 일치하더라도 '람다'를 만들 수없는 이유는 무엇이라고 설명하겠습니까?

+1

이렇게하고 싶은 특별한 이유가 있습니까? – user2357112

+0

'old_test'와'old_lambdef'의 정의는 상호 재귀 적입니다. 나는 그것이 옳다고 생각하지 않는다. – jwodder

+0

@ user2357112 물론 : (1)에서 (6)까지 설명 된 문법 규칙을 실행할 비단뱀 소스 코드를 찾고 있습니다. – sqrt163

답변

5
[x for x in lambda: 1] 

매우 간단합니다. 물론 이것은 런타임에 TypeError를 생성하지만 문법은 TypeErrors를 생성하는 구문을 제외하도록 설계되지 않았습니다.

old_lambdef은 항상 반복 할 수없는 함수 객체로 평가되므로 런타임시 예외없이 수행 할 방법이 없습니다. old_lambdef의 구조에 파이썬이 함수를 호출하도록 무언가를 삽입 할 수있는 곳이 없습니다. 파이썬은 함수 객체를 호출하고 반환 값을 반복하지 않고 함수 객체 자체에 대해 반복을 시도합니다. testlist_safeold_test 정의의


전체 형태는

testlist_safe: old_test [(',' old_test)+ [',']] 
old_test: or_test | old_lambdef 

testlist_safe 항상 하나의 old_test하지 않습니다, 그리고 old_test 항상 old_lambdef 아니다. testlist_safeold_test 일 수 있으며, old_testold_lambdef 일 수 있습니다. 이런 것들을 함께하면 런타임에 항상 예외가 생기지 만, 사람들이 그 일을 함께하지 못하게하기 위해 문법을 복잡하게 만들지는 않습니다.

+0

런타임 오류없이 예제를 사용할 수 있습니까? – sqrt163

+0

@Ivan : 아니요. 이 구조체의 표현식은 항상 TypeError를 생성합니다. 당신은 아마도 "그렇다면 그것이 허용되는 이유는 무엇입니까?"라고 생각하고있을 것입니다. 그러나 실제적인 이익을 위해서는 그것을 금지하는 것이 훨씬 더 많은 일이 될 것입니다. – user2357112

+1

@ 다른 사람 읽기 : 문제의 생산 규칙은 이러한 비 터미널의 전체 정의 또는 해당 프로덕션의 전체 형태가 아닙니다. 또한, 이러한 비 터미널의 유일한 용도는 아닙니다. 이러한 제작물 중 일부는 존재할 이유가없는 것처럼 보일 수 있지만 전체 컨텍스트가 여기에 표시되지 않기 때문입니다. – user2357112