13
내가 다소 이상한 찾고 코어를 생성하는 일부 하스켈 코드ghc가 왜 쓸모 없게 보이는 중첩 케이스 표현을 생성합니까?
indLoc index way = do
Store p <- ask
return $ plusPtr p localAddr
where localAddr = (stHeader + stIndices + index + stIndices * way) * blockSize
--snip...
(Just way, _) -> do
liftIO $ pokeElemOff loc way a
indLoc index way
에게 있습니다
case GHC.Prim.writeInt64OffAddr#
@ GHC.Prim.RealWorld a4_s4UV i_s4UW x_s4UX new_s_s4UY
of s2_s4V0 { __DEFAULT ->
let {
sat_s528 :: GHC.Ptr.Ptr b_a1UV
[LclId]
sat_s528 =
case r_s4Us `cast` ... of _ { GHC.Ptr.Ptr addr_s4Vb ->
case index_s4Um of _ { GHC.Types.I# y_s4Vc ->
case ds1_s4Ub of _ { (blk1_s529, offs_s4V8) ->
case offs_s4V8 of _ { GHC.Types.I# d_s4Vk ->
case GHC.Prim.*# 2 i_s4UW of sat_s4Vf { __DEFAULT ->
case GHC.Prim.+# 3 y_s4Vc of sat_s527 { __DEFAULT ->
case GHC.Prim.+# sat_s527 sat_s4Vf of sat_s526 { __DEFAULT ->
case GHC.Prim.*# sat_s526 4096 of sat_s4Vi { __DEFAULT ->
case GHC.Prim.plusAddr# addr_s4Vb sat_s4Vi
of sat_s525 { __DEFAULT ->
case GHC.Prim.plusAddr# sat_s525 d_s4Vk of sat_s524 { __DEFAULT ->
GHC.Ptr.Ptr @ b_a1UV sat_s524
}
}
}
}
}
}
}
}
}
} } in
(# s2_s4V0, sat_s528 #)
}
표현이없는 작전처럼 보이는 경우. 그 (것)들을 위해 무엇입니까? 엄밀?
이는 일련의 산술 명령어로 컴파일된다는 의미입니까? (나는 llvm 덤프를 읽으려고했지만 꽤 이해할 수 없다.) – Dan
예, 그게 그 것이다. – augustss
좀 더 읽기 쉽도록 코어에 얕은 구문을 추가하는 것이 유용할까요? "x - _ -> ..."의 구문 설탕 인 "force x in ..."과 같은 것? 나는 핵심이 일반 사용자는 읽을 수 없지만 전문가도 사용자임을 알고있다.) –