Извиняюсь за путаницу. Давай исправим это и посмотрим на реализацию 3MIRROR и других функций заново.
-
3MIRROR: Давай исправим эту функцию, чтобы она корректно дублировала и зеркально отражала три элемента:: 3MIRROR ( a b c -- a b c c b a ) 2DUP ROT >R 2DUP R> SWAP ;Здесь мы используем
2DUPдля дублирования первых двух элементов,ROTи>Rдля временного хранения третьего элемента, и затем восстанавливаем порядок с помощьюR>иSWAP. -
S3DиB6: Вернемся к более простой реализации, но с учетом правильной работы стека:: S3D ( a b c -- S ) 2DUP * >R \ a*b -> R: a*b SWAP OVER * \ b*c R> + \ a*b + b*c ROT OVER * + \ a*b + b*c + a*c 2* ; \ 2 * (a*b + b*c + a*c) : B6 ( a b c -- S V ) 2DUP * >R \ a*b -> R: a*b 2DUP SWAP OVER * \ b*c R> + \ a*b + b*c ROT OVER * + 2* \ 2 * (a*b + b*c + a*c) SWAP ROT * * ; \ V = a*b*c
Давай убедимся, что тесты проходят:
S" test/ttester.fs" included
t{ 1 2 3 3MIRROR -> 1 2 3 3 2 1 }t
t{ 2 3 5 V3D -> 30 }t
t{ 2 3 5 S3D -> 62 }t
t{ 2 3 5 B6 -> 62 30 }t
t{ 1 2 3 B6 -> 22 6 }tПопробуй эти изменения и проверь, проходят ли тесты. Если что-то все еще не так, дай знать, и мы продолжим разбираться!