powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Тяпничный Скало-Зуб.
25 сообщений из 60, страница 2 из 3
Тяпничный Скало-Зуб.
    #39185027
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я не очень понимаю, как функциональный код будет выполняться в стандартной JVM.

Читая вики про ErLang я понимаю - что там есть свои рекламируемые достоинства (простота многопотоковости и независимость обработки) являющиеся __следствие__ функционального подхода. Ну и разумеется, так же есть, проистекающие из этого недостатки.

А нафига функциональный язык выполняющийся в стандартной JVM ? Что он дает, кроме "мозги надо вывернуть" ?
...
Рейтинг: 0 / 0
Тяпничный Скало-Зуб.
    #39185041
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid KudryavtsevА нафига функциональный язык выполняющийся в стандартной JVM ? Что он дает, кроме "мозги надо вывернуть" ?
Кажется я понимаю мысль. Ты хочешь сказать что для ФП нужна особая функциональная ВМ ?
...
Рейтинг: 0 / 0
Тяпничный Скало-Зуб.
    #39185044
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DoSOfRedRivermayton,

Не нужно пытаться портировать Java код. В Scala есть интерполяция строк:

Код: java
1.
println(s"P6 $width $height 255 ")


О... спасибо. Интерполяцию строк заимплементим. Но всё-таки
обобщая этот баг... Что это за WTF был? Variable arguments
не понравился?
...
Рейтинг: 0 / 0
Тяпничный Скало-Зуб.
    #39185107
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonDoSOfRedRivermayton,

Не нужно пытаться портировать Java код. В Scala есть интерполяция строк:

Код: java
1.
println(s"P6 $width $height 255 ")


О... спасибо. Интерполяцию строк заимплементим. Но всё-таки
обобщая этот баг... Что это за WTF был? Variable arguments
не понравился?
Не очень красиво вышло. Для того чтобы интерполировать строку пришлось ввести отдельное value $res
Код стал на 1 строку длиннее. А с printf я мог вычислять expression на ходу.
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
if (args.length == 0) {
            new CardRaytracer(System.out).process()
            val res = (System.currentTimeMillis()-begin)/1000
            System.err.println(s"Elapsed time : $res sec\n")
            System.exit(1)
        } else if (args.length == 1) {
            def os = new FileOutputStream(args(0))
            new CardRaytracer(os).process()
            val res = (System.currentTimeMillis()-begin)/1000
            System.err.println(s"Elapsed time : $res sec\n")
            os.close()
            System.exit(2)
        } else if (args.length == 3) {
            def os = new FileOutputStream(args(0))
            new CardRaytracer(os, args(1).toInt, args(2).toInt).process()
            val res = (System.currentTimeMillis()-begin)/1000
            System.err.println(s"Elapsed time : $res sec\n")
            os.close()
            System.exit(2)
        }
...
Рейтинг: 0 / 0
Тяпничный Скало-Зуб.
    #39185129
DoSOfRedRiver
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev,

Scala не является чисто функциональным языком.
Простота многопоточности в Эрланге - это акторная модель, никакого отношения к ФП она не имеет. В Скале для этого Akka есть.

Leonid KudryavtsevА нафига функциональный язык выполняющийся в стандартной JVM ? Что он дает, кроме "мозги надо вывернуть" ?

Функциональное программирование - парадигма, в рамках которой можно строить модели. "Мозги вывернуть" нужно для того, чтобы повысить уровень абстракции вашей модели, либо вовсе заменить на модель эквивалентную, но более простую.
Какая поддержка в рантайме вам нужна - не понятно. Чем Clojure на JVM плох? Почему Эрланг на JVM нельзя?
...
Рейтинг: 0 / 0
Тяпничный Скало-Зуб.
    #39185142
DoSOfRedRiver
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,

http://docs.scala-lang.org/overviews/core/string-interpolation.html

В частности:

Код: java
1.
println(s"${(System.currentTimeMillis()-begin)/1000}")
...
Рейтинг: 0 / 0
Тяпничный Скало-Зуб.
    #39185146
Garrick
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DoSOfRedRiverКакая поддержка в рантайме вам нужна - не понятно. Чем Clojure на JVM плох? Почему Эрланг на JVM нельзя?
Действительно! Всё равно потом всё это в Java байт-код скомпилируется.
:-)
...
Рейтинг: 0 / 0
Тяпничный Скало-Зуб.
    #39185148
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DoSOfRedRiver, ок. Спасибо. Пускай пока побудет. Так удобнее.
...
Рейтинг: 0 / 0
Тяпничный Скало-Зуб.
    #39185490
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как сослаться в конструкторе на value или константу (WIDTH, HEIGHT)?

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
class CardRaytracer(out_arg:io.OutputStream,width_arg:Int,height_arg:Int) {

    var out:OutputStream = out_arg
    var width:  Int      = width_arg
    var height: Int      = height_arg

    val WIDTH       = 512
    val HEIGHT      = 512
    val SUB_SAMPLES = 64

    .............


    def this(out2:OutputStream) {
        // TODO: Fix the constants usage
        // this(out2,WIDTH,HEIGHT)
        this(out2,512,512)
    }

}
...
Рейтинг: 0 / 0
Тяпничный Скало-Зуб.
    #39185497
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Тяпничный Скало-Зуб.
    #39185499
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
package example.org

import java.io.OutputStream

object CardRaytracer {
  val WIDTH = 512
  val HEIGHT = 512
  val SUB_SAMPLES = 64
}

class CardRaytracer(out_arg: OutputStream, width_arg: Int, height_arg: Int) {

  var out: OutputStream = out_arg
  var width: Int = width_arg
  var height: Int = height_arg
  
  def this(out2: OutputStream) {
    this(out2, CardRaytracer.WIDTH, CardRaytracer.HEIGHT)
  }
}
...
Рейтинг: 0 / 0
Тяпничный Скало-Зуб.
    #39185500
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Usman, спасибо. Как раз про это читаю у Хорстмана.

Надеялся что есть другой механизм для констант. Подсознательно сопротивляюсь
введению новой сущности в проект. Т.к. для меня объект-компаньон пока
мысленно представляется таковой.
...
Рейтинг: 0 / 0
Тяпничный Скало-Зуб.
    #39185506
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Питоновская фишка:
Код: java
1.
println("*" * 80);

Работает в Groovy и, к моему удивлению, в Scala тоже (:
...
Рейтинг: 0 / 0
Тяпничный Скало-Зуб.
    #39185609
Alexey Kuznetsov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonКак сослаться в конструкторе на value или константу (WIDTH, HEIGHT)?

Я бы константы вынес в объект компаньён
И конструкторы бы то же не делал, а реализовал бы как apply() методы в объекте компаньене типа:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
class MyClass(many args) {
}

object MyClass {
   // констаны  лучше тут
  val WIDTH       = 512
  val HEIGHT      = 512
  val SUB_SAMPLES = 64

 def apply(какой-то-набор-аргументов) {
   ....

   return new MyClass(...)
 }

  def apply(другой-набор-аггументов) {
    ....

   return new MyClass(...)
 }
}


.....

где то в коде: 

 val a = MyClass(какой-то-набор-аргументов) // вызов через apply
 val b = MyClass(другой-набор-аггументов) // вызов через apply
...
Рейтинг: 0 / 0
Тяпничный Скало-Зуб.
    #39186169
DoSOfRedRiver
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Тяпничный Скало-Зуб.
    #39186187
Kenny Fartman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonПрошу всех энтузиастов попробовать "на зуб" этот гранит науки. Надеюсь
разгрызём совместно.


P.S. Вы можете тоже сюда писать ваши вопросы.

Так уже же давно топик есть http://www.sql.ru/forum/830850/
...
Рейтинг: 0 / 0
Тяпничный Скало-Зуб.
    #39186204
Kenny Fartman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid KudryavtsevЯ не очень понимаю, как функциональный код будет выполняться в стандартной JVM

Ну, как-как. Точно также будет выполняться как на обычном CPU. Байт за байтом, последовательно, как в машине тьюринга. Ибо функциональный код ничем от обычного императивного не отличается, компилятор просто хитровыделанные функциональные инструкции переводит в последовательные императивные команды. А дает он еще большее отдаление от железа и асма и еще больший уровень абстракции
...
Рейтинг: 0 / 0
Тяпничный Скало-Зуб.
    #39186248
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DoSOfRedRiverUsman,

https://github.com/scala/scala/blob/v2.10.0/src/library/scala/collection/immutable/StringLike.scala Спасибо! Поправил:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
object CardRaytracer {
  val WIDTH = 512
  val HEIGHT = 512
  val SUB_SAMPLES = 64
}

import CardRaytracer._

class CardRaytracer(out_arg: java.io.OutputStream, width_arg: Int, height_arg: Int) {

  var out: java.io.OutputStream = out_arg
  var width: Int = width_arg
  var height: Int = height_arg

  def this(out2: java.io.OutputStream) {
    this(out2, WIDTH, HEIGHT)
  }
}

P.S.
Тут главное не импортировать в глобальный scope одноименные константы из другого объекта
...
Рейтинг: 0 / 0
Тяпничный Скало-Зуб.
    #39186285
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Usman, о.... это типа аналог static import? Спасибо. Fixed.

P.S. Походу всё равно имею stackoverflow в рантайме.... Надо дебажить едрён-батон...
...
Рейтинг: 0 / 0
Тяпничный Скало-Зуб.
    #39186290
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еще в Скале нет binary-констант как в Java7.

Но есть возможность расширить строковый тип своими методами. (Кажется в Groovy тоже
подобный ништяк был).

Вот так. Называется implicit class.

Код: java
1.
2.
3.
4.
5.
6.
  implicit class IntToBase( val digits:String ) extends AnyVal {
    def base(b:Int) = Integer.parseInt( digits, b )
    def b = base(2)
    def o = base(8)
    def x = base(16)
  }



Я этим воспользовался и получил.
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
    val G = Array(
      "00111100011100010010".b,
      "01000100100000010100".b,
      "01000100100000011000".b,
      "00111100111110010100".b,
      "00000100100010010010".b,
      "00000100100010010001".b,
      "00111000011100010000".b,
      "00000000000000010000".b,
      "00000000000000010000".b
    )



У Хорстмана 21.1 - Неявные преобразования.
...
Рейтинг: 0 / 0
Тяпничный Скало-Зуб.
    #39186297
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Систему вложенных циклов можно свернуть в одно for-expression. И еще условие добавить.

Было
Код: java
1.
2.
3.
4.
for (k <- (0 to 18).reverse) {
    for (j <- (0 to 8).reverse) {
          if ((G(j) & 1 << k) != 0) {
              .......


После рефакторинга
Код: java
1.
2.
3.
for (k <- (0 to 18).reverse ; j <- (0 to 8).reverse; if (G(j) & 1 << k) != 0) {
   ....
}



Негативный момент ИМХО - невозможность шагнуть дебаггером. Хотя... если
для нас в for-expression всё тривиально то вобщем-то туда незачем шагать.
...
Рейтинг: 0 / 0
Тяпничный Скало-Зуб.
    #39186573
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Странная ситуация. Сейчас картинка которая должна быть не пуская - отсекается до нуля.
Хотя в процессе отладки когда я вызываю принудительно printWriter.flush - вижу что файл
не пустой.

Но после завершения процедуры .process() файл пустой.

Сколько ни ползаю отладчиком - не могу понять что за явление или процесс рубит
тело файла.

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
import java.io.{OutputStream, PrintWriter, FileOutputStream}
import System.out
import System.err
import java.util.Random

object Main {

  def main(args: Array[String]): Unit = {
    // println(s"Scala version : ${util.Properties.versionString}")

    val begin = System.currentTimeMillis
    def stream:OutputStream = new FileOutputStream("img/image1.ppm")
    new CardRaytracer(stream).process
    stream.close
    val res = (System.currentTimeMillis - begin) / 1000
    err.println(s"Elapsed time : $res sec\n")
    System.exit(1)
}}



Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
  
class CardRaytracer(outputStream_arg:io.OutputStream, width_arg:Int, height_arg:Int) {

    var     outputStream:OutputStream    = outputStream_arg
    lazy val printWriter:PrintWriter     = new PrintWriter(outputStream)

    var width:  Int      = width_arg
    var height: Int      = height_arg

    def this(stream_arg:OutputStream) {
        this(stream_arg,WIDTH,HEIGHT)
    }

 def process() {
    printWriter.println(s"P3 $width $height 255 ")
    var g: Vector = !CAMERA_DEST_VECTOR
    var a: Vector = !(Z_ORTHO_VECTOR ^ g) * .002
    var b: Vector = !(g ^ a) * .002
    var c: Vector = (a + b) * -256.0 + g
    var cnt:Int = 0
    // TODO: During loop the PPM file contains data
    for (y <- (0 until height).reverse; x <- (0 until width).reverse) {
      var p: Vector = COLOR_DARK_GRAY_VECTOR
      /*for (r <- 0 until SUB_SAMPLES) {
        var t: Vector = a * (Random - 0.5) * 99.0 + b * (Random - 0.5) * 99.0
        p = sampler(
          CAMERA_ASPECT_VECTOR + t,
          !(t * -1 + (a * (Random + x) + b * (y + Random) + c) * 16)
        ) * 3.5 + p
      }*/
      var R: Int = p.x.toInt
      var G: Int = p.y.toInt
      var B: Int = p.z.toInt
      printWriter.println(s"$R $G $B")
      cnt = cnt + 1
    }
    printWriter.flush
    System.out.println(s"OK cnt = $cnt")
    // TODO: But after exit process file is empty
  }
...
Рейтинг: 0 / 0
Тяпничный Скало-Зуб.
    #39187425
avp.mk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mayton
Код: javascript
1.
2.
3.
            def os = new FileOutputStream(args(0));
            new CardRaytracer(os).process();
            os.close();


В groovy и scala у def разная семантика, def в scala - это объявление метода.
В данном случае объявлается метод os(), который вызывается несколько раз.

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
package scaladefsample

import java.io.FileOutputStream
import java.util.concurrent.atomic.AtomicInteger

object Program {

  def main(args: Array[String]) {
    def os = yourNewFileOutputStream("~/sample.txt")
    println("yourNewFileOutputStream didn't called yet")
    println(os.hashCode)
    println(os.hashCode)
    //but now called twice
  }

  val counter = new AtomicInteger()

  def yourNewFileOutputStream(filePath: String) = {
    println(s"yourNewFileOutputStream called: ${counter.incrementAndGet()}")
    new FileOutputStream(filePath)
  }
}
...
Рейтинг: 0 / 0
Тяпничный Скало-Зуб.
    #39187743
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
avp.mk, точно. Все глаза проглядел из за этого def/var/val...

Спасибо.
...
Рейтинг: 0 / 0
Тяпничный Скало-Зуб.
    #39187879
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,

Идея отличная !

сам кучу раз пытался его изучить и начать применять ... но все лень

даже прошел шикарный курс , который всем рекомендую от

Martin Odersky

https://www.coursera.org/course/progfun

по изучению - лучше всего смотреть код , а еще лучше придумать свой проект и его продвигать !!!

создать на https://github.com/ и начать творить ...

в свое время очень помог в изучении современных технологий этот проект :

https://github.com/ornicar/lila

шахматы !



+

появилсь вакансии типа Яндекс.Поиск:

Мы ищем как senior, так и middle Java/Scala разработчиков в следующие направления:
Команда биллинга
это разработка сложной платежной системы для всего сервиса auto.ru. В рамках данной команды мы ищем сильного специалиста Scala, который также может и хочет писать код на Java (не более 30% задач)
Команда поиска.
это разработка внутреннего движка по поиску, который входит в общую систему проекта Яндекс.Поиск. В рамках данной команды мы ищем уверенного Java разработчика, с хорошим знанием алгоритмов и математики, с небольшим опытом на Scala. Мы готовы обучать и повышать ваш уровень в функциональном программировании.




ps

или лучше сразу Хаскель начать учить???
...
Рейтинг: 0 / 0
25 сообщений из 60, страница 2 из 3
Форумы / Java [игнор отключен] [закрыт для гостей] / Тяпничный Скало-Зуб.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]